在Elasticsearch中如何组合多个OR过滤条件且不影响文档评分?
解决方案
你可以把OR逻辑的两个过滤条件嵌套在filter子句内部的bool查询的should中,这样整个过滤逻辑运行在过滤器上下文,只会做匹配过滤,不会计算相关度评分,也就不会出现同时命中两个条件的文档评分被抬高的问题。
示例查询结构
{ "query": { "bool": { "must": [ // 你的基础文本搜索查询,这部分会正常计算评分 { "match": { "content": "搜索关键词" } } ], "filter": [ { "bool": { "should": [ {"term": {"PropertyA": true}}, {"term": {"PropertyB": true}} ], "minimum_should_match": 1 } } ] } } }
原理说明
- 外层
bool的filter子句所有内容都运行在过滤器上下文,只会判断文档是否匹配,不会贡献评分,也不会修改原有文本搜索的评分结果 - 嵌套在
filter内部的bool的should子句可以实现OR逻辑,搭配minimum_should_match: 1保证至少匹配其中一个条件 - 原有
must子句中的文本搜索逻辑不受影响,评分只由这部分的匹配度决定
可选优化
如果需要做冗余防护,可以给两个term查询加上"boost": 0,进一步确保不会产生额外评分,不过放在filter上下文本身已经不会计算评分,该操作非必需。
内容的提问来源于stack exchange,提问作者sdugfaesd
相关产品推荐
相关产品推荐

