Ответ 1
Недавно я тоже работаю над такой проблемой. Я не мог найти официальную документацию об этой проблеме, но когда я исследую результаты с помощью "объяснения api", похоже, что "queryNorm" не применяется к счету, непосредственно поступающему из поля "функции". Это означает, что вы не можете напрямую нормализовать значение script.
Однако, я думаю, я нахожу немного сложное решение этой проблемы. Если вы комбинируете это поле функции с запросом, как вы делаете (match_all query), и даете толчок этому запросу, нормализация работает над этим запросом, то есть умножение этих двух оценок - из нормализованного запроса и из script - даст нас полная нормализация. Для лучшего объяснения запрос будет выглядеть следующим образом:
{
"query": {
"bool": {
"should": [
{
"function_score": {
"query": {"match_all": {"boost":1}},
"functions": [ {
"script_score": {
"script": "<some_script>",
}}],
"score_mode": "sum",
"boost_mode": "multiply"
}
},
{
"match": {
"message": "this is a test"
}
}
]
}
}
}
Этот ответ не является правильным решением вашей проблемы, но я думаю, что вы можете играть с этим запросом, чтобы получить требуемый результат. Мое предложение для вас - использовать объяснение api, попытаться понять, что оно возвращается, изучить параметры, влияющие на итоговый результат, и сыграть с script и повысить значения, чтобы получить оптимизированное решение.
Btw, "запрос rescore" может многое помочь, чтобы получить соотношение% 30% 70 на итоговый счет: Официальная документация