可变宽度直方图聚合

编辑

可变宽度直方图聚合

编辑

这是一种类似于直方图的多桶聚合。然而,每个桶的宽度不是指定的。而是提供目标桶的数量,并根据文档分布动态确定桶的间隔。这是通过使用一种简单的单次文档聚类算法来完成的,该算法旨在获得桶中心之间的低距离。与其他多桶聚合不同,这些间隔不一定具有均匀的宽度。

返回的桶的数量将始终小于或等于目标数量。

请求目标为 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 将提高直方图的准确性,但也会使计算最终结果的成本更高,因为必须在分片级别管理更大的优先级队列,并且节点和客户端之间的数据传输将更大。

参数 bucketsshard_sizeinitial_buffer 是可选的。默认情况下,buckets = 10shard_size = buckets * 50,并且 initial_buffer = min(10 * shard_size, 50000)

初始缓冲区

编辑

initial_buffer 参数可用于指定在运行初始分桶算法之前,将在分片上内存中存储的单个文档的数量。桶分布是使用此 initial_buffer 文档样本确定的。因此,尽管较高的 initial_buffer 将使用更多内存,但它将导致更具代表性的集群。

桶边界是近似的

编辑

在 reduce 步骤中,主节点连续合并中心最近的两个桶。如果两个桶的边界重叠但中心相距较远,则它们可能不会被合并。因此,在 reduce 之后,某些间隔(max)中的最大值可能大于后续桶(min)中的最小值。为了减少这种错误的影响,当发生这种重叠时,这些间隔之间的边界将被调整为 (max + min) / 2

桶边界对异常值非常敏感