#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
, прежде чем любой другой