首页 > 解决方案 > 查找字段不存在或字段小于值的文档

问题描述

我有一些员工,正在努力寻找那些没有输入生日或生日早于 1963-03-01 的人。我有:

GET employees/_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "birthday"
        }
      },
      "filter": {
        "range": {"birthday": {"lte": 19630301}}
      }
    }
  }
}

现在我有 250 名员工,他们都没有生日字段,但此查询返回 0 个结果。

标签: elasticsearchelasticsearch-6

解决方案


您可以为此尝试使用应该出现的布尔查询。

第一个子句可以对没有生日字段的文档进行检查,而第二个子句可以根据您给定的范围过滤文档。

使用 should 查询将充当逻辑 OR 运算符并检索两者中的任何一个。

{
  "query": {
    "bool": {
      "should": [
        {
           "bool": { 
              "must_not": [{ "exists": { "field": "birthday" } }]
           }
        },
        {
           "bool": {
              "filter": [{ "range": {"birthday": { "lte": 19630301 }} }]
           }
        }
      ]
    }
  }
}

由于没有为过滤器计算分数,因此您可能希望使所有分数保持一致。您可以选择使用恒定分数查询,或者您可以在生日过滤子句上添加一个额外的查询,该子句与第一个子句中的must_not 相反,如下所示:

{
  "query": {
    "bool": {
      "should": [
        {
           "bool": { 
              "must_not": [{ "exists": { "field": "birthday" } }]
           }
        },
        {
           "bool": {
              "must": [{ "exists": { "field": "birthday" } }],
              "filter": [{ "range": {"birthday": { "lte": 19630301 }} }]
           }
        }
      ]
    }
  }
} 

推荐阅读