【问题标题】:How Aggregations are calculated internally in single node or multi-node Elasticsearch?如何在单节点或多节点 Elasticsearch 内部计算聚合?
【发布时间】:2016-07-01 08:00:56
【问题描述】:

我阅读了 Elasticsearch 文档,了解 Elasticsearch 的 API 和查询 DSL。我还可以找到有关如何从 Elasticsearch 获取查询结果的文档但是如何在内部对任何查询有效地计算聚合?

【问题讨论】:

    标签: elasticsearch aggregate


    【解决方案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. 将回复发回给您。

    众所周知,查询,然后是获取阶段是魔术发生的方式。这也意味着查询阶段正在处理与您实际想要的数据相比的额外数据因为分片不知道其他分片上存在什么。这在terms aggregation documentation 中有详细讨论,您应该查看一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多