【问题标题】:Effective way to use must and must_not in a single search phrase?在单个搜索短语中使用 must 和 must_not 的有效方法?
【发布时间】:2026-02-08 10:30:01
【问题描述】:

我是 ElasticSearch 的新手,目前正在研究 must 和 must_not 类型的搜索条件。 我有以下查询 DSL:

curl -XPOST 'localhost:9200/employee/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}'

现在我的问题是,有什么办法可以优化上述查询吗? 就像,如果我必须搜索多个 must 和 must_not 条件,查询将变得非常大并且难以管理。有什么方法可以将 must 和 must_not 组合在一个搜索词组下?

【问题讨论】:

标签: java elasticsearch


【解决方案1】:

据我所知,您可以使用“should”将多个匹配项放在“bool”语句中(不知道为什么它不能直接与一个“bool”语句一起使用):

编辑实际上有几个匹配,没有太复杂的请求,下面的应该正常工作:

{
  "query": {
    "bool":{
          "must": [
            {"match":{"age":"40"}},
            {"match":{"name": "John"}}
          ]
          , "must_not": [
                {"match":{"age":"40"}},
            {"match":{"name": "John"}}
          ]
        }
  }
}

很遗憾,mustmust_not 不能合并

【讨论】:

  • 在对查询进行一些研究后对其进行了编辑,现在根据我的经验,查询可能会变得相当复杂(在第 100 行),所有强大的 DSL 查询都提供
  • 正确的缩进有很长的路要走。我强烈推荐 Console(Kibana 的一部分),因为它提供语法高亮、自动完成、缩进……
  • 是的,虽然我从 Sense 到 SO 的格式有点被打脸...