Здравствуйте.
Проблема такая: для улучшения качества поиска у нас перед запросом в Эластик текст запроса проходит предварительную обработку. В ходе этой обработки на одном из этапов для слов, которые стоят перед "в", "на" и "для" добавляется буст. Например, для запроса "картина в кино" запрос получится "картина^3 в кино".
Буквально вчера обнаружили, что если мы забустили стоп-слово, то Эластик ничего не возвращает. Пример запроса:
"query": {
"bool": {
"minimum_should_match": "0",
"must": {
"multi_match": {
"fields": [
"items.first_word.ru_ru^6",
"items.name.ru_ru^3",
"items.materials.ru_ru",
"items.authors.ru_ru",
"items.attrs.ru_ru",
"items.series_name.ru_ru",
"items.tags.ru_ru",
"items.trademark_tags.ru_ru",
"items.trademark_name.ru_ru^2",
"items.country_name.ru_ru",
"items.category_name.ru_ru",
"items.category_tags.ru_ru"
],
"operator": "and",
"query": "вино как^3 в кино",
"tie_breaker": 0,
"type": "cross_fields"
}
},
"should": [
{
"term": {
"items.is_adult": false
}
},
{
"term": {
"items.is_our_trademark": true
}
},
{
"term": {
"items.is_remote_store": false
}
}
]
}
}
При этом слово "как" помечено стоп-словом для индекса. И этот запрос ничего не возвращает. Если буст со слова "как" убрать, то будет корректно возвращен один найденный результат.
Что хуже, на проде, где Эластик версии 6.3 этот запрос ничего не возвращает, но на одном из тестовых Эластиков, где версия 6.4 этот же запрос работает нормально. Настройки стоп-слов в индексах одинаковые, я проверил.
Я локально сэмулировал эту же ситуацию и прогнал запрос через все последние официальные docker-образы от версии 6.3 до версии 6.6 - везде запрос с бустом стоп-слова ничего не возвращает.
Мы, конечно, будет проверять слово перед бустом на то, является ли оно стоп-словом, но все же интересно - это фича такая или баг? Или у нас где-то настройки неправильные?