You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写包含多组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:18:03