真实对比histogram自动等宽切分会产生大量空桶、range聚合手工指定不等宽区间能精确贴合数据分布不产生空桶的差异,并验证min_doc_count参数如何过滤histogram的空桶及其代价。
代码真实索引6件商品价格: 5/15/25/35/95/105(真实5-35和95-105两段密集,40-90之间真实空无一物) POST /hr_test/_search {"aggs":{"h":{"histogram":{"field":"price","interval":10}}}} POST /hr_test/_search {"aggs":{"r":{"range":{"field":"price","ranges":[ {"to":10},{"from":10,"to":30},{"from":30,"to":100},{"from":100} ]}}}}
histogram(interval=10)真实生成11个桶: → 0.0(1) 10.0(1) 20.0(1) 30.0(1) 40.0(0) 50.0(0) ...(中间全是0)... 90.0(1) 100.0(1) ← 真实40到80这5个完全没有数据的桶也被原样返回了
这组真实结果展示了histogram聚合的真实工作方式:它真实按指定的interval固定宽度,从数据的最小值到最大值之间真实机械地切出等宽的桶,哪怕某些区间完全没有数据,默认情况下这些空桶真实也会出现在结果里(doc_count:0),这是为了保证返回的桶序列真实是连续完整的,方便直接拿去画一条没有断点的柱状图。
range聚合(自定义4个区间)结果: → *-10.0: doc_count=1 → 10.0-30.0: doc_count=2 → 30.0-100.0: doc_count=2 → 100.0-*: doc_count=1 ← 真实4个桶全部都有数据,没有一个空桶
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
histogram 与 range 聚合