Доброго времени суток!
Изначально задача выдавать результат в зависимости от приоритета подзапроса.
Соответвенно, был dis_max c match_phrase, match_phrase_prefix и так далее. С boost соответвующим приоритету. По нашей логике match_phrase, должен всегда быть выше остальных, затем match_phrase_prefix и так далее по самый мусор.
Результаты были не всегда правильными и я компенсировал это значительной разницей в boost (обычно на 2-3 порядка, 10000 -> 100 -> 1). На днях ко мне обратился коллега за помощью в решении подобной задачи... В общем, мы пришли к выводу, что это не самое правильное решение, т.к. зависит от данных.
В результате опытов мы выяснили, что на таких же запросах _score match_phrase_prefix мог быть в 10-20 больше match_phrase у того же документа. Выяснилось, что _score зависит от количества префиксов попадающих в запрос. Т.е. делаем запрос максимально приближенных к простому match_phrase:
{
"explain": true,
"from": 0,
"size": 1,
"_source": {
"includes": [
"title",
"content"
]
},
"query": {
"match_phrase_prefix": {
"content.original": {
"max_expansions": 1,
"query": "налоговый анализ",
"boost": 100
}
}
}
}
Получаем ответ на 100% совпадающий с match_phrase. Включаем explain и шаг за шагом увеличиваем max_expansions. Видим, что количество секций в подсчете _scale увеличивается в соответвенно. Видим, что на _scale влияют слова которых даже нет в документе и они его не только не уменьшают (это бы м.б. я понял ), а увеличивают.
mapping простейший: "tokenizer": "standard", "filter": "lowercase"
Нашел подобную issue, но там тишина:
Вопрос: М.б. мы делаем, что-то не так и эту задачу можно решить другим путём?
P.S. естественно документы их количество и сам набор не менялись,