Как я могу повлиять на оценку Elasticsearch, используя информацию о результатах с более высоким рейтингом?

#elasticsearch #elasticsearch-7

Вопрос:

Я обновляю свой сервер Elasticsearch с версии 1.6.0 до 7.12.1, что заставило меня переписать все запросы, которые у меня были.

В этих запросах извлекаются материалы , идентифицированные по 3 полям: nature.idCat , nature.idNat и marque.idMrq (идентификатор категории, идентификатор природы и идентификатор бренда).

В моем приложении есть поле поиска для поиска конкретных материалов, поэтому, если пользователь введет «photoc», запрос, отправленный на мой сервер Elasticsearch, будет выглядеть следующим образом :

 {
    "sort": [
        "_score"
    ],
    "query": {
        "bool": {
            "must": [
                {
                    "query_string": {
                        "default_field": "search",
                        "query": "*photoc*",
                        "boost": 10
                    }
                },
                [...] // Some more irrelevant conditions for this question like 
                      // if nature.idCat = 26 then idNat must be in some range and idMrq in some other range
            ]
        }
    }
}

 

И 2 примера результатов «попаданий» этого запроса :

 "hits": [
    {
      "_index": "ref_biens",
      "_type": "_doc",
      "_id": "T3RrpXsBz_TibRxz0akC",
      "_score": 13.0,
      "_source": {
        "search": "Photocopieur GENERIQUE",
        "nature": {
          "idCat": 26,
          "idNat": 665,
          "libelle": "Photocopieur",
          "ekip": "U03C",
          "codeINSEE": 300121,
          "noteMaterielArrondi": 5
        },
        "marque": {
          "idMrq": 16,
          "libelle": "GENERIQUE",
          "ekip": "Z999",
          "idVRDuree": 808
        }
      }
    },
    {
      "_index": "ref_biens",
      "_type": "_doc",
      "_id": "UHRrpXsBz_TibRxz0akC",
      "_score": 13.0,
      "_source": {
        "search": "Photocopieur INFOTEC",
        "nature": {
        "idCat": 26,
        "idNat": 665,
        "libelle": "Photocopieur",
        "ekip": "U03C",
        "codeINSEE": 300121,
        "noteMaterielArrondi": 5
      },
      "marque": {
        "idMrq": 1244,
        "libelle": "INFOTEC",
        "ekip": "I091",
        "idVRDuree": 808
      }
    }
  }
]
 

Это прекрасно работает !

Моя проблема появляется, когда пользователь вводит более одного слова, например если он является поиск специально для «Photocopieur Панасоник», результат запроса показывает правильный материал в качестве первого итоге с _score 23-х, но тогда каждый матч имеет те же _score 13 лет, что может принести совершенно иной материал, как следующие результаты (совпадающие только на фирменное наименование, например), хотя я пожелать для других «Photocopieur», который будет отображаться первой.

Я думаю о том, чтобы сделать это , добавив «очки» к результатам, которые имеют наибольшее сходство с лучшим матчем, например, я бы добавил 6 очков за то же nature.idCat самое, 4 очка за то же nature.idNat самое и, наконец, 2 очка за то же marque.idMrq самое .

Есть идеи о том, как я могу этого достичь ? Является ли это правильным подходом к моей проблеме ?

Комментарии:

1. вы можете добавить сортировку по дополнительным полям «сортировка»: [ { «_sore»: { «заказ»: «описание» } }, { «nature.idCat»: { «заказ»: «описание» } } ]. Это будет сортироваться сначала по баллам, а затем по idCat

2. @jaspreetchahal Это то, что я делаю прямо сейчас, но проблема в том, что первый результат-a nature.idCat: 26 (который является «Ксерокопией»), а следующие результаты упорядочены по nature.idCat убыванию. Мне нужно получить все nature.idCat: 26 , прежде чем любой другой