2016-07-19 94 views
1

我有很多的文件,如下下Elasticsearch指数: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总和。

聚集是:

{ 
    "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 // ... + ... 
       }.... 
      ] 
      } 
     } 

谢谢!

回答

0

我可能有你的最终目标错了,但像你想 总doc_countmeta.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结果为特定时间范围添加总计,只需更改间隔以反映该时间间隔。

编辑:

有可能是这样的一些聪明的elasticsearch的方式,但我想,我只想做这样的:

做你原来聚集

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

那么你应该有所有meta.id文档及其doc_count在不同时间戳的索引,间隔的粒度取决于您需要的内容。

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

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

对不起,如果这仍然不是你要找的,我认为有很多不同的方式来做到这一点。

+0

Mic987:我已经明确地添加了预期的结果。我需要存储结果,因为来自用户的请求可能是从任何小时到任何小时,另一个问题是我没有剩余存储空间,所以我每天汇总数据,在1天后没有进行聚合,存储空间问题就会发生。 – VitalyT

+0

我已经更新了我的答案,希望它有一些用处,我想有很多不同的方法可以实现你想要的。 – Mic987