找到没有生日的独特/独特的人或生日早于3/1/1963

时间:2018-05-27 18:34:18

标签: elasticsearch

我们有一些员工需要找到我们没有进入他们的生日或者出生于1963年3月1日之前的人:

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

我们现在需要获得不同的名字......我们只需要1个Jason或1个Susan等。我们如何对" name"现场仍然过滤上述生日?我试过了:

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "birthday"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "filter": [
              {
                "range": {
                  "birthday": {
                    "lte": 19630301
                  }
                }
              }
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "uniq_gender": {
      "terms": {
        "field": "name"
      }
    }
  },
  "from": 0,
  "size": 25
}

但只是获得重复的Jasons和Susans的结果。在底部,它将告诉我有10个Susans和12个Jasons。不知道如何获得独特的。

编辑:

我的映射非常简单。名称字段不需要是关键字...可以是文本或其他任何内容,因为它只是在查询中返回的字段。

{
  "mappings": {
    "birthdays": {
      "properties": {
        "name": {
          "type": "keyword"
        },
        "birthday": {
          "type": "date",
          "format": "basic_date"
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

在不知道您的映射的情况下,我猜测您的字段name未经过分析,无法正确用于术语聚合。

我建议你使用过滤聚合:

{
  "aggs": {
    "filtered_employes": {
      "filter": {
        "bool": {
          "must": [
            {
              "bool": {
                "must_not": [
                  {
                    "exists": {
                      "field": "birthday"
                    }
                  }
                ]
              }
            },
            {
              "range": {
                "birthday": {
                  "lte": 19630301
                }
              }
            }
          ]
        }
      },
      "aggs": {
        "filtered_employes_by_name": {
          "terms": {
            "field": "name"
          }
        }
      }
    }
  }
}

另一方面,您的查询不正确您应用should布尔过滤器。将其更改为must,汇总将仅返回具有(缺少生日)和(在日期之前出生)的雇员的结果。