如何在单节点或多节点Elasticsearch内部计算聚合?

时间:2016-06-30 18:54:00

标签: elasticsearch aggregate

我读过Elasticsearch doc。,我知道Elasticsearch的API和查询DSL。我还可以找到如何从Elasticsearch获取查询结果的文档但是如何在内部的任何查询上有效地计算聚合?

1 个答案:

答案 0 :(得分:1)

Elasticsearch以相同的方式处理搜索(查询)和聚合:分散,然后收集。

接收传入请求的第一个节点将充当协调节点。协调节点的工作是解析请求,然后根据需要进行路由(如有必要)。对于路由,它取决于发生了什么,但对于查询或聚合,有必要转到正在使用的所有索引的分片。

想象一下三节点集群:

  • node1
  • node2
  • node3

如果你有两个索引,包含2个分片和1个副本(2 * (2 + (2 * 1))总分片,即8),那么一个简单的布局可能是:

  • node1有index0_shard0p,index0_shard1r,index1_shard1r
  • node2有index0_shard0r,index0_shard1p,index1_shard0p
  • node3有index1_shard0r,index1_shard1p

(注意:它不完全平衡,但没关系)

如果node2碰巧收到聚合两个索引的结果的请求,那么它就成为该请求的协调节点。然后:

  1. 检查群集状态以了解这些索引分片的位置。
  2. 几乎任意选择是否为每个给定的碎片使用主副本和副本。
  3. 发送查询阶段。
  4. 接收分片分片结果。
  5. 合并结果(例如,在每个碎片的前10名中找到真正的前10名)。
  6. 发送获取阶段(从包含它们的分片中获取实际文档)。
  7. 将回复发回给您。
  8. 查询,然后获取阶段,因为它已知魔术是如何发生的。它还意味着查询阶段正在使用与您实际想要的相比的额外数据,因为分片不知道其他分片上存在什么。这将在terms aggregation documentation中详细讨论,您应该查看它。