变宽直方图聚合

编辑

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

返回的桶数总是小于或等于目标桶数。

请求目标为 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 个桶。

在归约步骤中,协调节点按其质心对所有分片的桶进行排序。然后,重复合并质心最近的两个桶,直到达到目标桶数。此合并过程是一种凝聚层次聚类

分片返回的桶数可能少于 shard_size,但不能多于。

分片大小

编辑

shard_size 参数指定协调节点将从每个分片请求的桶数。shard_size 越高,每个分片产生的桶就越小。这减少了归约步骤后桶重叠的可能性。增加 shard_size 将提高直方图的精度,但也会增加计算最终结果的成本,因为必须在分片级别管理更大的优先级队列,并且节点和客户端之间的数据传输也会更大。

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

初始缓冲区

编辑

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

桶边界是近似的

编辑

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

桶边界对异常值非常敏感