带有日期直方图的管道聚合没有 return 预期结果
Pipeline aggregation with Date histogram doesn’t return expected result
我遇到了有关将管道聚合与日期直方图结合使用的问题。
我需要过滤从“2019-03-08T06:00:00Z”到“2019-03-09T10:00:00Z”的数据,并对其进行直方图聚合。然后计算基数聚合后的avg值。
{
"size": 0,
"query": {
"bool" : {
"filter": {
"range" : {
"recordTime" : {
"gte" : "2019-03-08T06:00:00Z",
"lte" : "2019-03-09T10:00:00Z"
}
}
}
}
},
"aggs" : {
"events_per_bucket" : {
"date_histogram" : {
"field" : "eventTime",
"interval" : "1h"
},
"aggs": {
"cards_per_bucket": {
"cardinality": {
"field": "KANBAN_PKKEY.keyword"
}
}
}
},
"avg_cards_per_bucket": {
"avg_bucket": {
"buckets_path": "events_per_bucket>cards_per_bucket.value"
}
}
}
}
结果:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0,
"hits": []
},
"aggregations": {
"events_per_bucket": {
"buckets": [
{
"key_as_string": "2019-03-08T06:00:00.000Z",
"key": 1552024800000,
"doc_count": 1,
"cards_per_bucket": {
**"value": 1**
}
},
{
"key_as_string": "2019-03-08T07:00:00.000Z",
"key": 1552028400000,
"doc_count": 0,
"cards_per_bucket": {
**"value": 0**
}
},
{
"key_as_string": "2019-03-08T08:00:00.000Z",
"key": 1552032000000,
"doc_count": 1,
"cards_per_bucket": {
**"value": 1**
}
}
]
},
"avg_cards_per_bucket": {
**"value": 1**
}
}
}
问题是为什么平均值为“1”?应该是:2/3 = 0.6666
为什么忽略 0 值基数桶?
如果我删除 cardinality agg 并在 doc_count (events_per_bucket>_count) 上执行 avg 然后它工作正常。
MAX、MIN、SUM 也会发生同样的事情。
任何帮助,将不胜感激!
谢谢。
你应该告诉聚合管道在你的桶中有间隙的情况下要做什么,比如你的桶有键1552028400000
。默认情况下,忽略间隙。您可能想要用零替换缺失值。这可以通过将 gap_policy
参数添加到聚合管道来完成:
...
"avg_cards_per_bucket": {
"avg_bucket": {
"buckets_path": "events_per_bucket>cards_per_bucket.value",
"gap_policy": "insert_zeros"
}
}
...
Elastic documentation 中有更多详细信息。
我遇到了有关将管道聚合与日期直方图结合使用的问题。 我需要过滤从“2019-03-08T06:00:00Z”到“2019-03-09T10:00:00Z”的数据,并对其进行直方图聚合。然后计算基数聚合后的avg值。
{
"size": 0,
"query": {
"bool" : {
"filter": {
"range" : {
"recordTime" : {
"gte" : "2019-03-08T06:00:00Z",
"lte" : "2019-03-09T10:00:00Z"
}
}
}
}
},
"aggs" : {
"events_per_bucket" : {
"date_histogram" : {
"field" : "eventTime",
"interval" : "1h"
},
"aggs": {
"cards_per_bucket": {
"cardinality": {
"field": "KANBAN_PKKEY.keyword"
}
}
}
},
"avg_cards_per_bucket": {
"avg_bucket": {
"buckets_path": "events_per_bucket>cards_per_bucket.value"
}
}
}
}
结果:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0,
"hits": []
},
"aggregations": {
"events_per_bucket": {
"buckets": [
{
"key_as_string": "2019-03-08T06:00:00.000Z",
"key": 1552024800000,
"doc_count": 1,
"cards_per_bucket": {
**"value": 1**
}
},
{
"key_as_string": "2019-03-08T07:00:00.000Z",
"key": 1552028400000,
"doc_count": 0,
"cards_per_bucket": {
**"value": 0**
}
},
{
"key_as_string": "2019-03-08T08:00:00.000Z",
"key": 1552032000000,
"doc_count": 1,
"cards_per_bucket": {
**"value": 1**
}
}
]
},
"avg_cards_per_bucket": {
**"value": 1**
}
}
}
问题是为什么平均值为“1”?应该是:2/3 = 0.6666 为什么忽略 0 值基数桶? 如果我删除 cardinality agg 并在 doc_count (events_per_bucket>_count) 上执行 avg 然后它工作正常。 MAX、MIN、SUM 也会发生同样的事情。 任何帮助,将不胜感激! 谢谢。
你应该告诉聚合管道在你的桶中有间隙的情况下要做什么,比如你的桶有键1552028400000
。默认情况下,忽略间隙。您可能想要用零替换缺失值。这可以通过将 gap_policy
参数添加到聚合管道来完成:
...
"avg_cards_per_bucket": {
"avg_bucket": {
"buckets_path": "events_per_bucket>cards_per_bucket.value",
"gap_policy": "insert_zeros"
}
}
...
Elastic documentation 中有更多详细信息。