Elasticsearch 6.8中function_score查询格式是否变更?ES2.4查询迁移报错及排序异常咨询
Elasticsearch 6.8 function_score 查询结构变更问题解决方案
确实,Elasticsearch 6.8 对 function_score 的查询结构做了明确变更,这正是你遇到解析错误的核心原因。在 Elasticsearch 2.4 中,function_score 允许同时指定顶级的 filter 和 query 参数,但从 5.x 版本开始,官方移除了 function_score 下的顶级 filter 参数,直接沿用旧结构就会触发 parsing_exception 错误。
要保留原有的过滤逻辑和评分排序结果,你需要将原有的过滤条件整合到 function_score 的 query 参数内部,通过 bool 查询的 filter 子句来承载原过滤规则,同时保留原查询逻辑作为 bool 的 must 子句。这样既实现了和原版本一致的文档过滤,又能维持原有的评分计算逻辑,保证排序结果不变。
以下是调整后的可正常运行的查询语句:
{ "query": { "function_score": { "query": { "bool": { "filter": [ {"exists": {"field": "x"}}, {"query_string": {"query": "en", "fields": ["locale"]}}, {"query_string": {"query": "US", "fields": ["channel"]}}, {"query_string": {"query": "UG", "fields": ["usergroups"]}} ], "must": { "bool": { "should": { "multi_match": { "query": "refund", "fields": ["doc", "key", "title", "title.standard_analyzed^3", "x"], "type": "phrase", "slop": 20 } }, "must": { "multi_match": { "fuzziness": "0", "query": "refund", "prefix_length": "6", "fields": ["doc", "key", "title", "title.standard_analyzed^3", "x"], "max_expansions": "30" } } } } } }, "functions": [ {"field_value_factor": {"field": "usage", "factor": 1, "modifier": "log2p", "missing": 1}} ] } }, "from": 0, "size": 21 }
关键调整说明:
- 将原顶级的
filter条件移至function_score.query.bool.filter下,保持文档过滤逻辑完全不变; - 原有的查询逻辑被嵌套在
function_score.query.bool.must中,确保对过滤后的文档计算原有的匹配评分; functions部分完全保留,继续对评分进行加权调整。
这样调整后,查询的评分计算逻辑和 Elasticsearch 2.4 版本完全一致,文档的排序结果也会和原版本保持相同。
内容的提问来源于stack exchange,提问作者Sumit Kumar
相关产品推荐
相关产品推荐

