我在使用不同的方法时收到不同的 _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?
您的分数差异可能是由于查询规范化因子
查询规范化因子 (queryNorm) 尝试规范化查询,以便可以将一个查询的结果与另一个查询的结果进行比较。
尽管查询规范的目的是使来自不同查询的结果具有可比性,但它并不能很好地工作。相关性 _score 的唯一目的是按照正确的顺序对当前查询的结果进行排序。您不应该尝试比较来自不同查询的相关性分数。
现在,
乘法:查询分数和函数分数相乘
replace : 只使用函数分数,忽略查询分数
当您使用时boost_mode=multiply
,查询分数被标准化,而当您使用时boost_mode=replace
,分数被替换为function score
,查询分数被忽略,因此查询分数没有标准化
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句