ES多条件查询must和should不能同时生效问题

https://blog.youkuaiyun.com/zhnegyeshi/article/details/102584708

1、前言
must

          所有的语句都 必须(must) 匹配,与 AND 等价。 

   must_not 

          所有的语句都 不能(must not) 匹配,与 NOT 等价。 

   should 

          至少有一个语句要匹配,与 OR 等价

2、正常的should查询
在这里插入图片描述

3、正常的must查询
在这里插入图片描述

4、must和should组合查询,should失效
4.1、原始数据
在这里插入图片描述

4.2、组合查询结果(只有must生效,should不生效,并不是正常理解,先满足must然后在must的基础上进行should查询)
在这里插入图片描述

5、转换成复杂的组合查询,就是满足一定的条件下,在满足条件1或者满足条件2或者满足条件3

{
	"query": {
		"bool": {
			"must": [{
			  // 先满足前置条件
				"bool": {
					"must": [{
						"term": {
							"dynamicType.keyword": "201"
						}
					}, {
						"prefix": {
							"viewTime.keyword": "2019-10-11"
						}
					}]
				}
			}, {
			  // 在满足后置条件
				"bool": {
					"should": [{
						"term": {
							"uniqueKey.keyword": "3a91b0abd3507ee8b7165e710382a411"
						}
					}, {
						"term": {
							"uniqueKey.keyword": "e5a359bcff112a98a6f7ea968d00ae3a"
						}
					}, {
						"term": {
							"uniqueKey.keyword": "0fb98f5dd7f86ff7d3f7c105d27cddb0"
						}
					}, {
						"term": {
							"uniqueKey.keyword": "ccc0a51553fc33e7c19bb822f8ff6048"
						}
					}]
				}
			}]
		}
	},
	"from": 0,
	"size": 10,
	"sort": [{
		"viewTime.keyword": {
			"order": "desc"
		}
	}],
	"aggs": {}
}

6、总结
es做多条件复杂查询时,要先分析具体的查询场景,尽可能的拆分成数学公式的样子去分解查询步骤,然后在组合查询的json参数

Elasticsearch 8.10.4 中,若需实现前四个条件必须满足(`must`),而后三个条件只需满足其中任意一个(`should`),应将 `should` 子句嵌套在顶层的 `bool` 查询中,并设置 `minimum_should_match` 参数为 1。这样可以确保 `must` 条件优先匹配,再在匹配结果中筛选满足任意一个 `should` 条件的文档。 以下是一个符合要求的 Java DSL 查询示例: ```java import co.elastic.clients.elasticsearch.core.search.QueryBuilders; import co.elastic.clients.elasticsearch.core.search.BoolQuery; import java.io.IOException; BoolQuery boolQuery = QueryBuilders.bool() .must(m -> m.term(t -> t.field("localLanguage") .value(RequestHolder.getCurrentRequest().getHeader("Local-Language")))) .must(m -> m.term(t -> t.field("status").value(0))) .must(m -> m.term(t -> t.field("deleted").value(0))) .must(m -> m.range(r -> r.field("fileOriginRange") .lte(JsonData.of(ObjectUtils.isEmpty(uacUsersDetailVO) ? 1 : uacUsersDetailVO.getType())))) .should(s -> s.match(m -> m.field("fileMapperName").query(esSearchVo.getSearchInfo()))) .should(s -> s.match(m -> m.field("fileContent").query(esSearchVo.getSearchInfo()))) .should(s -> s.match(m -> m.field("fileOriginKeyword").query(esSearchVo.getSearchInfo()))) .minimumShouldMatch(1); ``` 上述查询构造方式确保了前四个条件必须满足,后三个条件中只需满足任意一个即可,这通过在顶层 `bool` 查询同时使用 `must` `should`,并设置 `minimum_should_match` 实现。此方法解决了在某些场景下 `should` 子句未生效问题,如引用中提到的“ES多条件查询mustshould不能同时生效问题”[^1]。 ### 相关问题 1. 如何在Elasticsearch中实现mustshould组合查询should部分生效? 2. 在Elasticsearch中,如何正确使用minimum_should_match参数? 3. 如何使用Elasticsearch的Java DSL构建复杂的布尔查询? 4. 如何在Elasticsearch中构建嵌套的bool查询以实现多条件筛选? 5. Elasticsearch中布尔查询的执行顺序优化策略是什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值