我在使用不同的方法时收到不同的_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?
答案 0 :(得分:1)
得分的差异可能是因为Query Normalization Factor
查询规范化因子(queryNorm)是规范化的尝试 查询,以便可以将来自一个查询的结果与 另一个结果。
尽管查询规范的目的是使来自不同查询的结果具有可比性,但它并不能很好地工作。相关性_score的唯一目的是以正确的顺序对当前查询的结果进行排序。您不应该尝试比较不同查询的相关性分数。
现在,
乘:查询得分和功能得分相乘
替换:仅使用功能得分,忽略查询得分
当您使用boost_mode=multiply
时,查询分数正在标准化,而当您使用boost_mode=replace
时,分数将被function score
替换,查询分数将被忽略,因此无法归一化关于查询分数