ElasticSearch:查询得分为0时如何保留function_score总和?
问题解决:Elasticsearch查询得分0时保留function_score总和
问题描述
当前使用的查询语句如下:
{ "explain": true, "query": { "bool": { "should": { "function_score": { "functions": [ { "gauss": {}, "weight": 10 }, { "filter": {}, "weight": 5 } ], "score_mode": "sum", "query": { "match": { "locality": { "query": "whitefield Mall" } } }, "boost_mode": "sum", "boost": "30" } } } }, "size": 1 }
当match查询得分为0时,即使文档符合function_score的函数条件,整体_score仍会变为0。需要实现无论查询得分是否为0,_score始终为查询得分与function_score得分的总和。
原因分析
function_score的默认逻辑是:只有匹配内部query的文档才会计算函数得分。如果内部query得分为0(文档不匹配),整个function_score的结果直接为0,不会执行后续的函数得分计算。
解决方案
将原查询拆分为bool的两个should子句,分别处理match查询得分和函数得分,确保两者的得分始终相加:
{ "explain": true, "query": { "bool": { "should": [ // 原match查询,保留其得分逻辑 { "match": { "locality": { "query": "whitefield Mall" } } }, // 独立计算函数得分,使用match_all确保所有文档都能触发函数计算 { "function_score": { "query": { "match_all": {} }, "functions": [ { "gauss": {}, "weight": 10 }, { "filter": {}, "weight": 5 } ], "score_mode": "sum", "boost_mode": "replace", "boost": 30 } } ], // 设置为0,确保即使match查询无匹配,函数得分仍会被保留 "minimum_should_match": 0 } }, "size": 1 }
修改说明
- 拆分查询结构:把原
function_score内部的match查询独立为一个should子句,确保其得分正常计算。 - 函数得分独立计算:
function_score使用match_all作为内部查询,保证所有文档都会执行函数得分计算,不受原match查询结果影响。 boost_mode: replace:让function_score的结果直接等于函数得分的总和(避免与match_all的默认得分1相乘)。minimum_should_match: 0:允许bool查询在任意一个子句匹配(或都不匹配)时返回结果,确保函数得分在match查询得分为0时仍能被计入总分。
内容的提问来源于stack exchange,提问作者S Singh
相关产品推荐
相关产品推荐

