Elasticsearch直方图聚合区间产生min越界的问题

举报
岳涛 发表于 2026/10/24 11:30:44 2026/10/24
【摘要】 该参数用来限制数据的范围,因为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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。