Elasticsearch 7.x 多层AND/OR嵌套组合条件查询实现方法
Elasticsearch 7.x 对应SQL的DSL查询语句
POST /<你的索引名>/_search { "query": { "bool": { "should": [ // 对应 (clm1 IN ('A','B') AND (clm2 IN ('C','D') OR clm3 IN ('E','F'))) 逻辑 { "bool": { "must": [ { "terms": { "clm1": ["A", "B"] } }, { "bool": { "should": [ { "terms": { "clm2": ["C", "D"] } }, { "terms": { "clm3": ["E", "F"] } } ], "minimum_should_match": 1 } } ] } }, // 对应 clm4 = 'Z' 逻辑 { "term": { "clm4": "Z" } } ], "minimum_should_match": 1 } } }
逻辑对应说明
terms查询等价于SQL的IN语法,匹配字段值属于给定数组范围的文档bool.must对应SQL的AND逻辑,数组内所有查询条件都需要满足bool.should对应SQL的OR逻辑,配合minimum_should_match: 1表示数组内至少满足1个查询条件- 外层
bool.should包含两个大分支,对应原SQL最外层的OR逻辑,只要满足其中一个分支即可命中
注意事项
- 请将代码中的
<你的索引名>替换为你实际使用的ES索引名称 - 如果查询的字段为
text类型且配置了keyword子字段,需要在字段名后加.keyword后缀(如clm1.keyword),避免分词导致匹配结果不符合预期 - 如果
clm4为text类型,需要将term查询替换为match查询:
{ "match": { "clm4": "Z" } }
内容的提问来源于stack exchange,提问作者fajri
相关产品推荐
相关产品推荐

