可变宽度直方图聚合编辑

这是一种类似于 直方图 的多分组聚合。但是,每个分组的宽度没有指定。相反,提供了一个目标分组数量,并且分组间隔根据文档分布动态确定。这是使用简单的单遍文档聚类算法完成的,该算法旨在获得分组中心之间的低距离。与其他多分组聚合不同,间隔不一定具有统一的宽度。

返回的分组数量始终小于或等于目标数量。

请求 2 个目标分组。

response = client.search(
  index: 'sales',
  size: 0,
  body: {
    aggregations: {
      prices: {
        variable_width_histogram: {
          field: 'price',
          buckets: 2
        }
      }
    }
  }
)
puts 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 * 50initial_buffer = min(10 * shard_size, 50000)

初始缓冲区编辑

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

分组边界是近似的编辑

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

分组边界对异常值非常敏感