【发布时间】:2016-07-01 08:00:56
【问题描述】:
我阅读了 Elasticsearch 文档,了解 Elasticsearch 的 API 和查询 DSL。我还可以找到有关如何从 Elasticsearch 获取查询结果的文档但是如何在内部对任何查询有效地计算聚合?
【问题讨论】:
我阅读了 Elasticsearch 文档,了解 Elasticsearch 的 API 和查询 DSL。我还可以找到有关如何从 Elasticsearch 获取查询结果的文档但是如何在内部对任何查询有效地计算聚合?
【问题讨论】:
Elasticsearch 以相同的方式处理搜索(查询)和聚合:分散,然后收集。
第一个收到传入请求的节点将充当协调节点。协调节点的工作是解析请求,然后根据需要(如果需要)路由它。对于路由,这取决于发生了什么,但对于查询或聚合,有必要转到所有正在使用的索引的分片。
想象一个三节点集群:
node1node2node3如果您有 两个 索引,其中包含 2 个分片和 1 个副本(2 * (2 + (2 * 1)) 总分片,即 8 个),那么简单的布局可能是:
node1 有 index0_shard0p、index0_shard1r、index1_shard1rnode2 有 index0_shard0r、index0_shard1p、index1_shard0pnode3 有 index1_shard0r, index1_shard1p(注意:不完全平衡,但没关系)
如果node2 碰巧收到一个聚合两个索引结果的请求,那么它将成为该请求的协调节点。然后:
众所周知,查询,然后是获取阶段是魔术发生的方式。这也意味着查询阶段正在处理与您实际想要的数据相比的额外数据因为分片不知道其他分片上存在什么。这在terms aggregation documentation 中有详细讨论,您应该查看一下。
【讨论】: