假设我要存储犯罪记录,其中每个记录具有以下形式:
{ "ssn" : "123-45-6789", "passport" : "85729573", "crime" : "overpowering the guards"}
这些记录受到以下约束:

  • 可能会缺少ssnpassport,但不是两者都丢失。
  • 如果罪犯有任何包含其ssn的记录,则可以保证其所有记录都包含其ssn
  • 这意味着只要记录有passport但没有ssn,则
    该罪犯只能通过其passport知道。但是,有些罪犯只用ssn记录一些记录,而用ssnpassport记录一些记录。

  • 我希望使用单个查询查看每个罪犯的犯罪情况。我认为最有效的方法是:
  • 根据记录的ssn字段是否缺失,将记录分为两组。
  • 通过ssn
  • 汇总“已设置ssn
  • 通过ssn
  • 汇总“缺少的passport集”

    我希望有一种避免在passport存储桶中的ssn上进行聚合的解决方案。

    本质上,我希望尽可能在ssn上聚合,仅在必要时才回落到passport

    谢谢您的帮助!

    最佳答案

    您将要创建几个过滤的聚合。在我头上:

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

    (我不确定您所说的空字段是什么意思,我只是假设它们是否存在)

    关于elasticsearch - ElasticSearch中的后备聚合字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46289184/

    10-12 06:58