Смысл вопроса в следующем: у меня есть множество товаров, которые содержат к примеру слово "помидор". Я хочу настроить выборку следующим образом: приоритет должен отдаваться сначала точным совпадениям, то есть, если пользователь пишет "помидор", то первыми ему должны выводиться "свежий помидор", "розовый помидор".. Затем должны выбираться нечеткие совпадения: "салат с помидорами", "Консервированные помидоры".. и после них совпадения по синонимам: "томаты в собственном соку". Я так понимаю, что если поиск по полю "title", то мне нужно в маппинге делать этому полю "fields" и добавлять туда анализаторы, а в самом запросе использовать "bool" -> "should" и вписать туда все эти три варианта, каждый со своим "boost" параметром? Мой запрос выглядит так:
{
"sort": [{"_score": {"order": "desc"}}],
"min_score": 15,
"query": {
"function_score": {
"query": {
"bool" : {
"must" : [],
"filter": [{
"term": {"supermarket": "TE"}
}],
"should" : [
{
"multi_match": {
"query": "tomato",
"type": "most_fields",
"fields": ["title^2", "brand^1.5", "category^1.5"],
"fuzziness": 4,
"analyzer": "query_synonyms"
}
}
]
}
},
"script_score" : {
"script" : "_score + (doc['numberOfReviews'].value * 0.001) + (doc['numberOfRecipes'].value * 0.025) + (doc['numberOfShoppingLists'].value * 0.025) + (doc['numberOfStarterLists'].value * 0.025)"
}
}
}
}
И еще про score. Не до конца понимаю, как он определяется, в результатах выборки, слова с неточным вхождением могут быть выше, чем с точным (в скрипте я убираю дополнительный подсчет по полям, оставляю только score) почему так получается?