Elasticsearch直方图聚合区间产生min越界的问题
【摘要】 该参数用来限制数据的范围,因为ES默认统计field最大值和最小值之间的所有数据。
该参数用来限制数据的范围,因为ES默认统计field最大值和最小值之间的所有数据。
背景
参数:extended_bounds
该参数用来限制数据的范围,因为ES默认统计field最大值和最小值之间的所有数据。
问题
ES查询直方图数据,结果明显发生了越界:
GET robot_msg_202012/_search
{
"size":0,
"query":{
"bool":{
"must":[
{
"term":{
"kfuin":{
"value":"2852199391"
}
}
},
{
"term":{
"robot_id":{
"value":"921678007"
}
}
},
{
"range":{
"msg_time":{
"gte":1607529600000000,
"lte":1608134399000000
}
}
}
]
}
},
"aggs":{
"time_range_aggs":{
"histogram":{
"field":"msg_time",
"interval":86400000000,
"min_doc_count":0,
"extended_bounds":{
"min":1607529600000000,
"max":1608134399000000
}
},
"aggs":{
"single_wheel_message_match_nums_sub_aggs":{
"filter":{
"bool":{
"must":[
{
"term":{
"answer_type":{
"value":1
}
}
},
{
"bool":{
"must_not":{
"term":{
"reply_type":0
}
}
}
}
]
}
},
"aggs":{
"single_wheel_message_match_nums_sub_sub_aggs":{
"value_count":{
"field":"msg_time"
}
}
}
},
"message_match_total_nums_sub_aggs":{
"value_count":{
"field":"msg_time"
}
},
"multi_wheel_dos_sent_message_nums_sub_aggs":{
"value_count":{
"field":"dos_sent"
}
},
"multi_wheel_unsat_eval_message_nums_sub_aggs":{
"value_count":{
"field":"unsat_eval"
}
}
}
}
}
}

图中可以看到查询结果的key低于min。
问题原因
这里的越界其实是符合预期的,因为真正的边界取决于interval,而不是min,所表现出的特征是:
结果中看到的最小key(1607040000000000),可以被interval(864000000000)所整除

当extended_bounds.min不被interval整除的时候,默认的最小值为:
key = extended_bounds.min - (extended_bounds.min % interval)
解决方法
histogram提供了offset,以偏移桶的边界,其算法是:
offset = extended_bounds.min % interval
正确的做法是出现这种情况时,设置offset值,这样最小key就会等于extended_bounds.min,问题就会得到解决。

offset原理
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)