如何编写包含多组AND/OR组合条件的Elasticsearch查询
错误原因
- 违反JSON语法规范:同一个
bool对象下重复声明了should字段,同名Key会被后定义的内容覆盖,第一个OR逻辑直接失效 - 结构嵌套错误:第三个独立查询条件与
should字段平级放在内层bool对象下,不符合ES Query DSL的结构定义,会直接触发语法报错 - 逻辑隐患:内层
bool的should未显式声明minimum_should_match: 1,不同ES版本默认匹配规则可能存在差异,容易导致逻辑不符合预期
正确实现
你需要的多AND子句组合 + 每个AND子句内部可选OR的需求,对应DSL结构为:外层bool.must数组下每一个元素对应一个AND子句,需要OR逻辑的子句用独立的bool.should包裹,不需要OR的子句直接写查询语句即可。
对应你给出的示例场景,正确查询语句如下:
{ "size": 50, "query": { "bool": { "must": [ // 第一个AND子句:OR逻辑,匹配text字段的abc/cde 或 standard_text字段的rst/xyz { "bool": { "should": [ { "query_string": { "default_field": "text", "query": "\"abc\" \"cde\" ", "minimum_should_match": "1", "analyze_wildcard": true } }, { "query_string": { "default_field": "standard_text", "query": "\"rst\" \"xyz\" ", "minimum_should_match": "1", "analyze_wildcard": true } } ], "minimum_should_match": 1 } }, // 第二个AND子句:OR逻辑,匹配text字段的dan/po/in 或 standard_text字段的hes/wo/aid { "bool": { "should": [ { "query_string": { "default_field": "text", "query": "\"dan\" \"po\" \"in\" ", "minimum_should_match": "1", "analyze_wildcard": true } }, { "query_string": { "default_field": "standard_text", "query": "\"hes\" \"wo\" \"aid\" ", "minimum_should_match": "1", "analyze_wildcard": true } } ], "minimum_should_match": 1 } }, // 第三个AND子句:无OR逻辑,直接匹配standard_text字段的人称代词 { "query_string": { "default_field": "standard_text", "query": "\"i\" \"me\" \"my\" \"we\" \"i am\" \"i'm\" ", "minimum_should_match": "1", "analyze_wildcard": true } } ], "must_not": [], "filter": [] } } }
如果需要新增更多AND子句,直接往外层must数组中追加对应结构的子句即可。
内容的提问来源于stack exchange,提问作者zunman
相关产品推荐
相关产品推荐

