子聚合性能问题
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 .
假设我有这样的聚合:
{
"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 .