ElasticSearch布尔查询:如何实现符合条件仅单次权重提升?
问题解决:避免Elasticsearch查询中多次叠加boost评分
你的问题出在当前的bool查询中,should数组里的两个条件都被文档匹配到了(既存在pricing.cost,又同时存在pricing.cost_min和pricing.cost_max),所以每个条件的boost(2)被叠加,最终评分变成4。要实现“只要满足任一条件就只提升一次评分”的需求,可以通过以下两种方式解决:
方案一:使用function_score控制boost生效次数
把判断条件放在function_score的filter中,只要文档满足filter里的任一条件,就仅应用一次boost:
{ "query": { "function_score": { "query": { // 替换为你的基础查询,无基础查询则用match_all: {} "match_all": {} }, "functions": [ { "filter": { "bool": { "should": [ {"exists": {"field": "pricing.cost"}}, { "bool": { "must": [ {"exists": {"field": "pricing.cost_min"}}, {"exists": {"field": "pricing.cost_max"}} ] } } ], "minimum_should_match": 1 } }, "boost": 2 } ], // 根据需求选择boost_mode: // "replace"会直接用boost值覆盖基础评分;"sum"则是基础评分加boost值 "boost_mode": "replace" } } }
方案二:用constant_score包裹判断条件
constant_score会给所有匹配filter的文档赋予相同的评分,不管匹配多少个子条件,只会应用一次boost:
{ "query": { "bool": { "should": [ { "constant_score": { "filter": { "bool": { "should": [ {"exists": {"field": "pricing.cost"}}, { "bool": { "must": [ {"exists": {"field": "pricing.cost_min"}}, {"exists": {"field": "pricing.cost_max"}} ] } } ], "minimum_should_match": 1 } }, "boost": 2 } } ], "minimum_should_match": 1 } } }
这两种方案都能确保只要文档满足任一目标条件,就仅获得一次2倍的评分提升,不会因为同时满足多个条件而叠加boost。
内容的提问来源于stack exchange,提问作者Mojimi
相关产品推荐
相关产品推荐

