Elasticsearch - 如何在组合常规查询和function_score时标准化得分?

Joh*_*nyM 28 lucene search-engine elasticsearch

Idealy什么,我想实现的是权重分配给查询,使得QUERY1构成了最终得分的30%,QUERY2 consitutes其他70%,这样就实现文档有可能对QUERY1和QUERY2最高分的最高分.我对文档的研究没有提供任何关于如何实现这一点的提示,所以让我们尝试解决一个更简单的问题.

考虑以下形式的查询:

{
"query": {
    "bool": {
        "should": [
            {
                "function_score": {
                    "query": {"match_all": {}},
                    "script_score": {
                        "script": "<some_script>",
                    }
                }
            },
            {
                "match": {
                    "message": "this is a test"
                }
            }
        ]
    }
}
}
Run Code Online (Sandbox Code Playgroud)

该脚本可以返回任意数字(想想 - >它可以返回类似12392002的内容).

如何确保脚本的结果不会占据整体得分?

有什么办法可以规范它吗?例如,而不是脚本分数返回max_script_score的比率(由具有最高分数的文档实现)?

Hev*_*val 9

最近我也在研究这样的问题.我找不到关于这个问题的任何正式文档,但是当我使用"explain api"调查结果时,似乎"queryNorm"不会直接应用于来自"functions"字段的分数.这意味着您无法直接规范化脚本值.

但是,我认为我发现这个问题有点棘手.如果将此函数字段与您执行的查询(match_all查询)结合使用并对该查询进行提升,则规范化正在对此查询进行处理,即这两个得分的乘法 - 从规范化查询和脚本 - 将给我们一个总归一化.为了更好的解释,查询将如下:

{
"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"
                }
            }
        ]
    }
}
}
Run Code Online (Sandbox Code Playgroud)

这个答案不是你的问题的正确解决方案,但我认为你可以使用此查询来获得所需的结果.我给你的建议是使用explain api,尝试理解返回的内容,检查影响最终得分的参数,并使用脚本和提升值来获得优化的解决方案.

顺便说一句,"rescore查询"可能有助于在最终得分上获得%30-%70比率: 官方文档

  • 重新加入领先的+1 - 这不能解决我的问题,但将来可能会有用.查询提升的巧妙技巧,但这也没有解决问题(你很清楚:) :)问题在于script_queries和常规查询得分的相对差异 - 它可以是任意的(我的研究与解释API清楚地表明了这一点).顺便说一句,如果你想解决类似的问题请+1我的:) (2认同)