我在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 // ... + ...
}....
]
}
}
谢谢!
答案 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"
}
}
}
}
}
}
很抱歉,如果这仍然不是您想要的,我认为有很多不同的方法可以做到这一点。