首页 > 解决方案 > 在 ElasticSearch 中,如何检查一个字段是否存在等于某个值,或者该字段不存在?

问题描述

我想在 elasticsearch 中找到所有文档,其中我的“更新”字段存在并且小于某个值或文档中根本不存在该字段。我可以看到使用 bool 查询,并且 must 和 must not 可以使用,但我如何获得我试图用它们实现的确切场景?

谢谢!

标签: elasticsearchkibana

解决方案


假设updated是一种date字段,查询将如下所示:

GET test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "exists": {
                  "field": "updated"
                }
              },
              {
                "range": {
                  "updated": {
                    "lte": "2019-06-10"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "updated"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

上面的解释:

让,

  • 字段updated应该存在 ===>A
  • 字段updated应小于X===>B
  • 字段updated根本不应该存在 ===>C

所需条件转换为(A AND B) OR C

(A AND B)_D

现在就弹性而言,它变为:

should 
{
   D,
   C
} 

或者

should
{
   must
   {
      A,
      B
   },
   C
}

在上述查询中,仅范围查询就足够了,不需要使用存在查询和范围来检查更新字段的存在。

所以查询可以重写为(B OR C):

GET test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "updated": {
              "lte": "2019-06-10"
            }
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "updated"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

推荐阅读