Elasticsearch查询如何组合布尔AND与OR实现精准多条件匹配
问题根因
原有查询返回错误结果是因为Elasticsearch bool 查询的默认执行规则:当bool查询中存在must子句时,should子句默认不做强制匹配要求,仅参与相关性算分。也就是说只要姓名、员工ID、入职时间三个must条件满足,无论epf_status是什么值,文档都会被命中返回,这就是状态为OK、CANCELLED的记录被查出的原因。
修正方案
优先推荐使用terms查询做枚举值精确匹配,同时将所有过滤类条件放入filter上下文——这种写法不需要计算相关性得分,查询性能更高,结果支持缓存,是这类精确过滤场景的最优实践:
GET myindex01/_search { "query": { "bool": { "filter": [ { "match": { "empname": { "query": "Mahesh", "operator": "AND" } } }, { "match": { "empid": { "query": "200", "operator": "AND" } } }, { "range": { "joining_datetime": { "gte": "2020-01-01T00:00:00", "lte": "2022-06-24T23:59:59" } } }, { "terms": { "epf_status": ["NOK", "WRN"] } } ] } } }
如果要保留原有的should写法,只需要在bool层级增加minimum_should_match: 1参数,强制要求should子句至少匹配1项即可,写法如下:
GET myindex01/_search { "query": { "bool": { "must": [ { "match": { "empname": { "query": "Mahesh", "operator": "AND" } } }, { "match": { "empid": { "query": "200", "operator": "AND" } } }, { "range": { "joining_datetime": { "gte": "2020-01-01T00:00:00", "lte": "2022-06-24T23:59:59" } } } ], "should": [ { "match": { "epf_status": "NOK" } }, { "match": { "epf_status": "WRN" } } ], "minimum_should_match": 1 } } }
验证结果
以上两种写法针对提供的样例数据查询,都只会返回epf_status为NOK、WRN的两条记录,符合预期输出要求。
内容的提问来源于stack exchange,提问作者Manoj Agarwal
相关产品推荐
相关产品推荐

