升级Elasticsearch至5版本后带过滤器的function_score查询失效求助
解决Elasticsearch 5.x中
filtered查询报错的问题 嘿,这个问题我太熟了——Elasticsearch 5.x版本已经彻底移除了filtered查询,这就是你看到no [query] registered for [filtered]报错的核心原因!
问题根源
在ES 2.x中,filtered查询用来结合查询和过滤逻辑,但从5.x开始,官方统一用bool查询来实现这类需求,filtered查询被完全废弃。你之前尝试移除filtered但没解决,应该是没有用正确的bool结构替代它的原有逻辑。
修改后的正确查询
下面是适配ES 5.x的版本,我保留了你原来的所有业务逻辑,只是把filtered替换成标准的bool查询结构:
GET _search { "query":{ "function_score":{ "functions":[{"field_value_factor":{"field":"popularity"}}], "score_mode":"multiply", "query":{ "bool":{ "must":[{"match_all":{}}], "filter":{ "bool":{ "must":[{"term":{"image.colors.color":"red"}}] } } } } } } }
关键修改点
- 把原来的
filtered查询替换成bool查询 - 原
filtered中的query(这里是match_all)放到bool.must数组中 - 原
filtered中的filter部分直接保留在bool.filter里,逻辑完全不变
额外简化建议
因为你的match_all是匹配所有文档,过滤逻辑才是核心,你也可以进一步简化查询(效果完全一致):
GET _search { "query":{ "function_score":{ "functions":[{"field_value_factor":{"field":"popularity"}}], "score_mode":"multiply", "filter":{ "bool":{ "must":[{"term":{"image.colors.color":"red"}}] } } } } }
这里直接把过滤逻辑放到function_score的filter参数中,省略了外层的match_all——因为function_score如果只指定filter,默认就会匹配所有符合过滤条件的文档。
内容的提问来源于stack exchange,提问作者Piotr Brudny
相关产品推荐
相关产品推荐

