讨论关于ElasticSearch查询条件中空值为非必要条件的查询

现在es已经更新至6.5版本,有些用法已经被抛弃,不在使用。例如Filter Query Missing已在es5以后的版本废除,简单点就是以前我们可以在kibana这样查数学成绩为空的数量:

GET /student/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "subject": "数学"
        }},
        {"constant_score": {
          "filter": 
              {"missing": {
                "field": "grade"
          }},
          "boost": 1.2
        }}
      ]
    }
  }
}

但结果是:

讨论关于ElasticSearch查询条件中空值为非必要条件的查询_第1张图片

抛弃了Filter Query Missing的用法,是因为官方觉得用exists就足够解决这个问题,例如上面的查询可以修改为:

GET /student/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "subject": "数学"
        }}
      ],"must_not": [
        {"exists": {"field": "grate"}}
      ]
    }
  }
}

那么现在问题来了!

但我要查询空值为非必要条件是该怎么查询呢?例如上面的查询如果我要查数学成绩为空或者数学成绩在60以下的数量该怎么查询以前还可以用should包含missing和range查询,为了这个问题我是焦头烂耳,网上的资源大多没有及时更新。终于我在官网看文档中找到了解决方法!!

废话少说,直奔主题。

讨论关于ElasticSearch查询条件中空值为非必要条件的查询_第2张图片

通过上图我们知道可以missing虽然在Query中被抛弃,但在Aggregation中仍然可以使用,解决办法:

GET /student/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "subject": "数学"
        }}
      ]
    }
  },"aggs": {
    "missGrate": {
      "missing": {
        "field": "grade"
      }
    },
    "filter":{
      "filter": {
        "range": {
          "grade": {
            "lte": 60
          }
        }
      }
    }
  }
}

通过聚合我就可以去查询空值为非必要条件的查询,但仍然有个缺陷就是无法获取具体详细信息,虽然我只要求获取数量。希望厉害的大神能够补充。具体API实现我就不贴了,也不难。

本篇文章为小弟第一次写博客,如有不正确的请通知,及时改正。


更新:如果不用聚合的query查询的话,使用

{
  "query": {
    "bool": {
      "must": [
        {"bool": {"must_not": [
          {"exists": {"field": "your_field"}}
        ]}}
      ]
    }
  }}

 

你可能感兴趣的:(es)