包含 0 个值的平均桶聚合
Average bucket aggregation including 0 values
我每天都在使用 ES 获取统计数据,因为我没有每天的输入数据,但丢失的数据本身也是一种信息(在我的情况下,我正在测量 activity ).为了完成这样的任务,我使用 average bucket aggregation 并将 min_doc_count 设置为 0,以便即使在我的数据丢失时也有一个值。我的查询如下:
query = {
"size": 0,
"query": {
"bool" : {
"should" :{
"match" : { "LogEntryType" : "LogEntry" }
},
"must" : {
'match' : {'Id' : id}
}
}
},
"aggs": {
"actions_per_day": {
"date_histogram": {
"field": "CreationTime",
"interval": "day",
"min_doc_count" : 0
},
"aggs": {
"amount": {
"value_count": {
"field": "CreationTime"
}
}
}
},
"avg_daily_action": {
"avg_bucket": {
"buckets_path": "actions_per_day>amount"
}
}
}
}
es1.search(index=indx1, body=query)
它确实 return 个值设置为 0 的对象,如您在以下响应摘录中所见:
{'took': 1,
'timed_out': False,
'_shards': {'total': 2, 'successful': 2, 'failed': 0},
'hits': {'total': 4321, 'max_score': 0.0, 'hits': []},
'aggregations': {'actions_per_day': {'buckets': [
{'key_as_string': '2018-07-13T00:00:00.000Z',
'key': 1531440000000,
'doc_count': 631,
'amount': {'value': 631}},
{'key_as_string': '2018-07-14T00:00:00.000Z',
'key': 1531526400000,
'doc_count': 0,
'amount': {'value': 0}}...
但我的问题是,对于平均每日操作,计算不考虑 0 值,它 returns :
...'avg_daily_action': {'value': 432.1}
这对应于未考虑未提供输入的天数的平均值。我找到了 this issue,其中提到我应该使用 "missing" 参数,但是我认为它是检索带有 0 的元素,而我已经有了它们。关于如何将它们考虑在内的任何线索?
原来我快到了。必须在平均桶聚合中使用 gap_policy 参数以考虑 0 值。桶的平均部分现在变成
"avg_daily_operations": {
"avg_bucket": {
"buckets_path": "modifications_per_day>amount",
"gap_policy" : "insert_zeros"
}
}
默认值设置为跳过,更改它可以解决问题。
我每天都在使用 ES 获取统计数据,因为我没有每天的输入数据,但丢失的数据本身也是一种信息(在我的情况下,我正在测量 activity ).为了完成这样的任务,我使用 average bucket aggregation 并将 min_doc_count 设置为 0,以便即使在我的数据丢失时也有一个值。我的查询如下:
query = {
"size": 0,
"query": {
"bool" : {
"should" :{
"match" : { "LogEntryType" : "LogEntry" }
},
"must" : {
'match' : {'Id' : id}
}
}
},
"aggs": {
"actions_per_day": {
"date_histogram": {
"field": "CreationTime",
"interval": "day",
"min_doc_count" : 0
},
"aggs": {
"amount": {
"value_count": {
"field": "CreationTime"
}
}
}
},
"avg_daily_action": {
"avg_bucket": {
"buckets_path": "actions_per_day>amount"
}
}
}
}
es1.search(index=indx1, body=query)
它确实 return 个值设置为 0 的对象,如您在以下响应摘录中所见:
{'took': 1,
'timed_out': False,
'_shards': {'total': 2, 'successful': 2, 'failed': 0},
'hits': {'total': 4321, 'max_score': 0.0, 'hits': []},
'aggregations': {'actions_per_day': {'buckets': [
{'key_as_string': '2018-07-13T00:00:00.000Z',
'key': 1531440000000,
'doc_count': 631,
'amount': {'value': 631}},
{'key_as_string': '2018-07-14T00:00:00.000Z',
'key': 1531526400000,
'doc_count': 0,
'amount': {'value': 0}}...
但我的问题是,对于平均每日操作,计算不考虑 0 值,它 returns :
...'avg_daily_action': {'value': 432.1}
这对应于未考虑未提供输入的天数的平均值。我找到了 this issue,其中提到我应该使用 "missing" 参数,但是我认为它是检索带有 0 的元素,而我已经有了它们。关于如何将它们考虑在内的任何线索?
原来我快到了。必须在平均桶聚合中使用 gap_policy 参数以考虑 0 值。桶的平均部分现在变成
"avg_daily_operations": {
"avg_bucket": {
"buckets_path": "modifications_per_day>amount",
"gap_policy" : "insert_zeros"
}
}
默认值设置为跳过,更改它可以解决问题。