如何在elasticsearch中组合查询,must和must_not?

Che*_*rry 5 elasticsearch

应找到以下文件:

matches query 'my text' AND (has not field OR field with value)
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

GET /myIndex/_search

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "my text"
          }
        },
        {
        }
      ],
      "filter": {
        "bool": {
          "must_not": {
            "exists": {
              "field": "myField"
            }
          },
          "must": {
            "terms": {
              "myField": [
                "myValue"
              ]
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它应该(但不是)工作liek说:

  1. 布尔组合通过 ORmustfilter部分
  2. 首先must按查询选择
  3. 过滤器使用由 OR must andmust_not`组合的 bool

但这就像mustmust_not通过AND子句结合使用一样。例如,当我删除“must”或“must_not”查询时。

如何更改查询以通过OR子句将“must”与“must_not”结合起来?

Elasticsearch 版本是 5.3.2

Tho*_*ber 7

在 Elasticsearch 7.X 上,您可以简单地执行以下操作:

{
  "query": {
    "bool": {
      "must": [
        {"match": {"field1": {"query": "Hero"}}}
      ],
      "must_not": [
        {"terms":{"field3":["Batman"]}},
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Eir*_*dou 5

您需要bool filtermustmust_not条款之间多加一个。

您还应该考虑您的myField字段。如果它被定义为文本或关键字。使用 elasticsearch 5.6.1 测试,以下查询有效:

{
  "query": {
     "bool": {
        "must": [{

          "query_string": {
             "query": "this is a text content"
          }
        }],

        "filter": {
           "bool": {
              "should" : [{                
                 "bool" : {
                    "must_not": {
                      "exists": {
                         "field": "myField"
                       }
                     }
                  }
              },
              {
                "bool" : {
                  "must": {
                    "terms": {
                       "myField.keyword": ["my field exists and has a value"]
                     }
                   }
                }
              }]

         }
      }
   }
  }
}
Run Code Online (Sandbox Code Playgroud)