可变宽度直方图聚合
编辑可变宽度直方图聚合
编辑这是一种类似于直方图的多桶聚合。然而,每个桶的宽度不是指定的。而是提供目标桶的数量,并根据文档分布动态确定桶的间隔。这是通过使用一种简单的单次文档聚类算法来完成的,该算法旨在获得桶中心之间的低距离。与其他多桶聚合不同,这些间隔不一定具有均匀的宽度。
返回的桶的数量将始终小于或等于目标数量。
请求目标为 2 个桶。
resp = client.search( index="sales", size="0", aggs={ "prices": { "variable_width_histogram": { "field": "price", "buckets": 2 } } }, ) print(resp)
response = client.search( index: 'sales', size: 0, body: { aggregations: { prices: { variable_width_histogram: { field: 'price', buckets: 2 } } } } ) puts response
const response = await client.search({ index: "sales", size: 0, aggs: { prices: { variable_width_histogram: { field: "price", buckets: 2, }, }, }, }); console.log(response);
POST /sales/_search?size=0 { "aggs": { "prices": { "variable_width_histogram": { "field": "price", "buckets": 2 } } } }
响应
{ ... "aggregations": { "prices": { "buckets": [ { "min": 10.0, "key": 30.0, "max": 50.0, "doc_count": 2 }, { "min": 150.0, "key": 185.0, "max": 200.0, "doc_count": 5 } ] } } }
此聚合当前不能嵌套在任何从多个桶收集数据的聚合之下。
聚类算法
编辑每个分片获取前 initial_buffer
个文档并将其存储在内存中。一旦缓冲区已满,这些文档将被排序并线性分隔为 3/4 * shard_size 个桶
。接下来,每个剩余的文档要么被收集到最近的桶中,要么在它与所有现有桶都相距较远的情况下放入新桶中。最多创建 shard_size
个总桶。
在 reduce 步骤中,协调节点按其中心对所有分片的桶进行排序。然后,重复合并中心最近的两个桶,直到达到目标桶数为止。这种合并过程是凝聚式层次聚类的一种形式。
一个分片可以返回少于 shard_size
个桶,但不能返回更多。
分片大小
编辑shard_size
参数指定协调节点将从每个分片请求的桶数。较高的 shard_size
会导致每个分片产生较小的桶。这减少了在 reduce 步骤之后桶重叠的可能性。增加 shard_size
将提高直方图的准确性,但也会使计算最终结果的成本更高,因为必须在分片级别管理更大的优先级队列,并且节点和客户端之间的数据传输将更大。
参数 buckets
、shard_size
和 initial_buffer
是可选的。默认情况下,buckets = 10
,shard_size = buckets * 50
,并且 initial_buffer = min(10 * shard_size, 50000)
。
初始缓冲区
编辑initial_buffer
参数可用于指定在运行初始分桶算法之前,将在分片上内存中存储的单个文档的数量。桶分布是使用此 initial_buffer
文档样本确定的。因此,尽管较高的 initial_buffer
将使用更多内存,但它将导致更具代表性的集群。
桶边界是近似的
编辑在 reduce 步骤中,主节点连续合并中心最近的两个桶。如果两个桶的边界重叠但中心相距较远,则它们可能不会被合并。因此,在 reduce 之后,某些间隔(max
)中的最大值可能大于后续桶(min
)中的最小值。为了减少这种错误的影响,当发生这种重叠时,这些间隔之间的边界将被调整为 (max + min) / 2
。
桶边界对异常值非常敏感