Подтвердить что ты не робот

Elasticsearch - Как нормализовать счет при объединении регулярного запроса и функции_score?

Идеально, чего я пытаюсь достичь, является назначение весов запросам, так что query1 составляет 30% от конечного результата, а query2 составляет еще 70%, поэтому для достижения максимальной оценки документ должен иметь максимально возможный балл по запросу1 и Query2. В моем исследовании документации не было никаких намеков относительно того, как этого добиться, поэтому попытаемся решить более простую задачу.

Рассмотрим запрос в следующей форме:

{
"query": {
    "bool": {
        "should": [
            {
                "function_score": {
                    "query": {"match_all": {}},
                    "script_score": {
                        "script": "<some_script>",
                    }
                }
            },
            {
                "match": {
                    "message": "this is a test"
                }
            }
        ]
    }
}
}

script может возвращать произвольное число (think- > он может вернуть что-то вроде 12392002).

Как я могу убедиться, что результат из script не будет доминировать в общем балла?

Есть ли способ его нормализовать? Например, вместо script оценка возвращает коэффициент до max_script_score (достигнутый документом с наивысшим балластом)?

4b9b3361

Ответ 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 на итоговый счет:  Официальная документация