logo头像

Always believe youself.

es-must和should同时使用should失效问题

相关概念

ElasticSearch——bool布尔查询

1、must (must字段对应的是个列表,也就是说可以有多个并列的查询条件,一个文档满足各个子条件后才最终返回)

2、should (只要符合其中一个条件就返回)

3、must_not (与must相反,也就是说可以有多个并列的查询条件,一个文档各个子条件后才最终的结果都不满足)

4、filter(条件过滤查询,过滤条件的范围用range表示gt表示大于、lt表示小于、gte表示大于等于、lte表示小于等于)

must和should同时使用should失效问题

原有查询方式:

查询条件

1
2
3
4
5
(1)must   
date:(1657152000000, 1657238400000)

(2)should:
oneid:147172038204226244

1
{ "query": { "bool": { "must": [ { "range": { "date": { "from": 1657152000000, "to": 1657238400000, "boost": 1 } } } ], "should": [ { "term": { "oneid.keyword": { "value": [ "147172038204226244" ], "boost": 1 } } } ], "adjust_pure_negative": true, "boost": 1 } }}

查询结果&问题:输出时并没有限制oneid字段值,说明should条件失效

image


原因:must和should并列组合条件时,参数minimum_should_match 默认为0 (即 should 的条件可以都不满足)。

解决

方式:将should条件放入must条件之中

1
{ "query": { "bool": { "must": [ { "range": { "date": { "from": 1657152000000, "to": 1657238400000, "include_lower": true, "include_upper": true, "boost": 1 } } }, { "bool": { "should": [ { "terms": { "oneid.keyword": [ "147164520153375584" ], "boost": 1 } } ], "adjust_pure_negative": true, "boost": 1 } } ], "adjust_pure_negative": true, "boost": 1 } }}

查询结果:should条件已生效。

image