查找包含不存在的字段或字段小于值的文档

时间:2018-05-18 00:35:51

标签: elasticsearch elasticsearch-6

我有一些员工,我正试图找到那些没有生日快乐或生日早于1963-03-01的人。我有:

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

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

1 个答案:

答案 0 :(得分:1)

您可以尝试使用 should 出现的bool查询。

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

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

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

由于未针对过滤器计算分数,因此您可能希望保持所有分数彼此一致。您可以选择使用Constant Score Query,也可以在生日过滤子句中添加其他查询,该子句在第一个子句中反转 must_not ,如下所示:

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