我读过Elasticsearch doc。,我知道Elasticsearch的API和查询DSL。我还可以找到如何从Elasticsearch获取查询结果的文档但是如何在内部的任何查询上有效地计算聚合?
答案 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
碰巧收到聚合两个索引的结果的请求,那么它就成为该请求的协调节点。然后:
查询,然后获取阶段,因为它已知魔术是如何发生的。它还意味着查询阶段正在使用与您实际想要的相比的额外数据,因为分片不知道其他分片上存在什么。这将在terms
aggregation documentation中详细讨论,您应该查看它。