ElasticSearch中的后备聚合字段

时间:2017-09-18 22:43:55

标签: elasticsearch

假设我正在存储犯罪记录,其中每条记录的格式如下:

{ "ssn" : "123-45-6789", "passport" : "85729573", "crime" : "overpowering the guards" }

这些记录受以下限制:

  • ssnpassport,但不是两者都可能丢失。
  • 如果犯罪分子的任何记录包含他们的ssn,那么所有他们的记录将保证包含他们的ssn
    • 这意味着只要记录有passport但没有ssn,那么 这个罪犯只有他们的passport知道。但是,有些犯罪分子只有ssn的记录,有些记录同时包含ssnpassport

我希望使用单个查询来查看每个犯罪分组的犯罪。我认为最有效的方法是:

  1. 根据记录中ssn字段是否缺失,将记录分为两组。
  2. 通过ssn
  3. 汇总“有ssn集合”
  4. 通过ssn
  5. 汇总“缺少passport集”

    我更倾向于使用一种解决方案,避免在passport存储桶中ssn聚合。

    基本上,我希望尽可能在ssn上汇总,只在必要时才会回到passport

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您想要创建一些过滤的聚合。在我的头顶:

{
  "aggs": {
     "withSsn": {
       "filter": {
         "exists": {
           "field": "ssn"
         }
       },
       "aggs": {
         "ssn": {
           "terms": {
             "field": "ssn"
           }
         }
      }
    },
    "withoutSsn": {
      "filter": {
        "missing": {
          "field": "ssn"
        }
      },
      "aggs": {
        "passport": {
          "terms": {
            "field": "passport"
          }
        }
      }
    }
  }
}

(我不确定你的空字段是什么意思,我只是假设它们已经存在或不存在)