子聚合性能问题

Sub-aggregation Performance Questions

假设我有这样的聚合:

{
  "query": {
    "match":...
  },
  "aggs": {
    "buckets": {
      "terms": {
        "field": "category",
        "size": 10
      },
      "aggs": {
          "total_sold": {
            "sum": "num_sold"
          }
      }
    }
  }
}

在“类别”字段的唯一值数量为 100 的情况下,即使我只需要 10 个桶,此查询是否会计算 100 个总和,每个唯一值一个?

这是个很好的问题。答案在 terms aggregation 的文档中,但这里是一个快速摘要。

terms 聚合的一个重要参数是 shard_size,如果未指定,则默认为 (size * 1.5 + 10)。因此,在您的情况下,shard_size 将是 25(即 10 * 1.5 + 10)。此参数定义每个分片发送到协调节点的顶级术语数 return。

因此,假设您的索引具有三个分片。当协调节点收到上述请求时,它会将其发送给他们每个人,要求他们提供 25 个最高任期。然后,协调节点从每个分片接收到 25 个顶级词条,它会将分片中相同词条的计数相加,并通过减少计数对它们重新排序(terms 聚合的默认值 order)。最后,协调节点将 return 最终排序列表的前 10 个术语(即您指定的 size 参数)发送给您的客户端。

因此,为了回答您的问题,并非所有 100 个 category 个术语每个分片仅 shard_size 被访问,最后,只有 size 个类别将被 returned .