如何查询空字段或特定值

时间:2018-02-13 09:11:43

标签: elasticsearch kibana

我尝试编写查询以获得以下结果:

field1: value1 AND 
field2: value2 OR "" (empty)

我已尝试过以下操作,但它总是会返回空结果:

{
  "_source": ["field1", "field2"], 
  "query": {
    "bool": {
      "must": [
        {"match": { "field1": "value1" }},
        {
          "bool": {
            "should": [
              { 
                "match": {
                  "field2": "value2"
                }
              }
            ],
            "must_not": [
              {
                "exists": { "field": "field2" }
              }
            ]
          }
        }
      ]
    }
  }
}

我相信我的查询与自己相矛盾。

1 个答案:

答案 0 :(得分:2)

这看起来非常复杂。

尝试使用queryStringQuery 尝试像这样重写您的查询

{
    "_source": ["field1", "field2"], 
    "query": {
      "query_string": {
        "query": "field1:value1 AND (field2:value2 OR (!field2:*))"
      }
    }

}

如果您仍想使用此格式

您已经使用了must_not子句,根据您的使用情况,这意味着如下所示。

field1:value1 AND

field2:value2 AND NOT“”(空)

你应该做的是

   {
  "_source": [
    "field1",
    "field2"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "field1": "value1"
          }
        },
        {
          "bool": {
            "should": [
              {
                "match": {
                  "field2": "value2"
                }
              },
              {
                "bool": {
                  "must_not": [
                    {
                      "exists": {
                        "field": "field2"
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

但如果您想先在查询中分析查询中的术语,那么使用queryString会更容易。

所以在这种情况下使用queryString OR bool会是相同的