Elasticsearch聚合结果后的sum值如何

时间:2016-07-19 09:36:34

标签: java elasticsearch lucene aggregate aggregation

我在Elasticsearch索引下有很多文档如下:

{
        "_index": "f2016-07-17",
        "_type": "trkvjadsreqpxl.gif",
        "_id": "AVX2N3dl5siG6SyfyIjb",
        "_score": 1,
        "_source": {
          "time": "1468714676424",
          "meta": {
            "cb_id": 25681,
            "mt_id": 649,
            "c_id": 1592,
            "revenue": 2.5,
            "mt_name": "GMS-INAPP-EN-2.5",
            "c_description": "COULL-INAPP-EN-2.5",
            "domain": "wv.inner-active.mobi",
            "master_domain": "649###wv.inner-active.mobi",
            "child_domain": "1592###wv.inner-active.mobi",
            "combo_domain": "25681###wv.inner-active.mobi",
            "ip": "52.42.87.73"
          }
        }
      }

我想在多个字段上进行日期直方图/范围聚合,并将结果存储在其他集合/索引中。 所以我可以在小时范围之间使用查询/聚合来制作doc_count sum。

聚合是:

{
  "aggs": {
    "hour":{
      "date_histogram": {
        "field": "time",
        "interval": "hour"
      },
      "aggs":{
            "hourly_M_TAG":{
               "terms":{
                  "field":"meta.mt_id"
               }
            }
         }....
    }
  }
} 

预期的结果:

"aggregations": {
    "hour": {
      "buckets": [
        {
          "key_as_string": "2016-07-17T00:00:00.000Z",
          "key": 1468713600000,
          "doc_count": 94411750,
          "hourly_M_TAG": {
            "doc_count_error_upper_bound": 1485,
            "sum_other_doc_count": 30731646,
            "buckets": [
              {
                "key": 10,
                "doc_count": 10175501
              },
              {
                "key": 649,
                "doc_count": 200000
              }....
            ]
          }
        },
        {
          "key_as_string": "2016-07-17T01:00:00.000Z",
          "key": 1468717200000,
          "doc_count": 68738743,
          "hourly_M_TAG": {
            "doc_count_error_upper_bound": 2115,
            "sum_other_doc_count": 22478590,
            "buckets": [
              {
                "key": 559,
                "doc_count": 8307018
              },
              {
                "key": 649,
                "doc_count" :100000
              }...

让我们假设我解析响应并尝试将结果存储在其他索引/集合中。

我的问题

存储汇总结果的最佳方法是什么, 所以我可以进行其他查询/聚合,将不同小时范围之间的“doc_count”相加?

例如:“2016-07-17T00:00:00.000Z” - “2016-07-17T01:00:00.000Z”之间想要查看每个键上的doc_count总数

预期结果:

{
          "range_sum": {
            "buckets": [
              {
                "key": 649,
                "doc_count": 300000 // (200000+100000)
              },
              {
                "key": 588,
                "doc_count": 2928548 // ... + ...
              }....
            ]
          }
        }

谢谢!

1 个答案:

答案 0 :(得分:0)

我的最终目标可能不对,但在我看来,你似乎也想要 doc_count的每个值的总meta.mt_id超过可配置的时间范围?

如果是这种情况,我认为你真的不需要存储第一个聚合的结果,你真的只需要更改间隔值以反映你想要的桶大小。如果您想要meta.mt_id的每个值的总计,可能有助于翻转聚合,因此您首先汇总条款,然后汇总日期:

{
    "size": 0,
    "aggs": {
    "hourly_M_TAG": {
      "terms": {
        "field": "meta.mt_id"
      },
      "aggs": {
      "hour": {
        "date_histogram": {
          "field": "time",
          "interval": "2h"
        }
      }
    }
  }
}

如果您希望为特定时间范围添加总计,则会为每个meta.mt_id提供结果,只需更改间隔即可反映出来。

编辑:

可能有一些聪明的弹性搜索方式,但我想我会这样做:

进行原始聚合

foreach bucket in buckets:
    index:
        {
            "id" : {meta.id},
            "timestamp" : {key_as_string}
            "count" : {doc_count}
        }

然后,您应该在不同的时间戳上获得所有meta.id个文档及其doc_count的索引,间隔的粒度取决于您的需要。

然后,您可以使用范围过滤器(假设使用elasticsearch 2.x)对新索引执行term-> sum聚合:

{
  "size": 0,
  "filter": {
    "range": {
      "timestamp": {
        "gte": "now-1h",
        "lte": "now"
      }
    }
  },
  "aggs": {
    "termName": {
      "terms": {
        "field": "id"
      },
      "aggs": {
        "sumCounts": {
          "sum": {
            "field": "count"
          }
        }
      }
    }
  }
}

很抱歉,如果这仍然不是您想要的,我认为有很多不同的方法可以做到这一点。