elasticsearch function_score返回意外分数

时间:2017-03-03 13:27:33

标签: elasticsearch groovy

我在使用不同的方法时收到不同的_scores,但我期待相同的结果。

第一种方法是使用script_score,将_score与字段值相乘,并使用boost_mode = replace

将最终_score替换为计算出的值。
   {
    "function_score": {
        "query": {
            "multi_match": {
                "query": "body",
                "fields": ["title", "text", "keywords"],
                "operator": "and"
            }
        },
        "functions": [{
            "script_score": {
                "script": {
                    "lang": "groovy",
                    "inline": "_score * doc['power'].value"
                }
            }
        }],
        "boost_mode": "replace"
    }
}

第二个是使用script_score返回字段值,让引擎使用boost_mode = multiply计算_score

   {
    "function_score": {
        "query": {
            "multi_match": {
                "query": "body",
                "fields": ["title", "text", "keywords"],
                "operator": "and"
            }
        },
        "functions": [{
            "script_score": {
                "script": {
                    "lang": "groovy",
                    "inline": "doc['power'].value"
                }
            }
        }],
        "boost_mode": "multiply"
    }
}

为什么查询返回不同的_scores?

1 个答案:

答案 0 :(得分:1)

得分的差异可能是因为Query Normalization Factor

  

查询规范化因子(queryNorm)是规范化的尝试   查询,以便可以将来自一个查询的结果与   另一个结果。

尽管查询规范的目的是使来自不同查询的结果具有可比性,但它并不能很好地工作。相关性_score的唯一目的是以正确的顺序对当前查询的结果进行排序。您不应该尝试比较不同查询的相关性分数。

现在,

  

乘:查询得分和功能得分相乘

     

替换:仅使用功能得分,忽略查询得分

当您使用boost_mode=multiply时,查询分数正在标准化,而当您使用boost_mode=replace时,分数将被function score替换,查询分数将被忽略,因此无法归一化关于查询分数