当前位置: 首页 > article >正文

ES from size聚合查询10000聚合查询,是每个分片先聚合,再统计。还是所有节点查询1万条后,再聚合

在 Elasticsearch 中,聚合查询 的执行过程是 分布式 的,Elasticsearch 会先在每个分片(shard)上执行本地聚合,然后再在协调节点(coordinating node)上对所有分片的聚合结果进行 全局汇总。具体过程如下:


1. 聚合查询的执行过程

1.1 分片级别的本地聚合

  • 查询分发:当你在 Elasticsearch 中执行一个聚合查询时,协调节点会将查询分发到索引的每个分片(shard)上。

  • 本地聚合:每个分片会在本地对匹配的文档执行聚合操作(例如求和、平均值、分组等)。每个分片只会处理自己分片内的数据。

  • 返回中间结果:每个分片将本地的聚合结果返回给协调节点。

1.2 协调节点的全局汇总

  • 结果收集:协调节点会从所有分片中收集聚合结果。

  • 全局汇总:协调节点会对所有分片的聚合结果进行全局汇总。例如:

    • 如果是 求和(sum),协调节点会将所有分片的求和结果相加。

    • 如果是 平均值(avg),协调节点会计算所有分片的平均值。

    • 如果是 分组(terms),协调节点会合并所有分片的分组结果,并重新排序。

  • 返回最终结果:协调节点将最终的聚合结果返回给客户端。


2. 具体示例

假设你执行以下聚合查询:

json

复制

POST /your_index/_search
{
  "size": 0,
  "aggs": {
    "total_sales": {
      "sum": {
        "field": "sales"
      }
    }
  }
}

执行步骤

  1. 查询分发

    • 假设索引有3个分片(shard1, shard2, shard3)。

    • 协调节点将查询分发到 shard1、shard2 和 shard3。

  2. 本地聚合

    • shard1 计算本地的 sales 字段总和,假设结果为 1000。

    • shard2 计算本地的 sales 字段总和,假设结果为 1500。

    • shard3 计算本地的 sales 字段总和,假设结果为 2000。

  3. 全局汇总

    • 协调节点收集所有分片的聚合结果:1000(shard1) + 1500(shard2) + 2000(shard3)。

    • 协调节点计算全局总和:1000 + 1500 + 2000 = 4500。

  4. 返回结果

    • 协调节点将最终结果 4500 返回给客户端。


3. 关于 from 和 size 的影响

在聚合查询中,from 和 size 参数通常用于控制返回的 文档数量,而不是聚合结果的数量。例如:

json

复制

POST /your_index/_search
{
  "from": 0,
  "size": 10000,
  "aggs": {
    "total_sales": {
      "sum": {
        "field": "sales"
      }
    }
  }
}
  • from 和 size 的作用

    • from=0, size=10000 表示返回前10,000条文档。

    • 聚合操作是基于这10,000条文档进行的。

  • 执行过程

    • 每个分片会先根据 from 和 size 参数返回匹配的文档(最多10,000条)。

    • 然后在这些文档上执行本地聚合。

    • 协调节点会汇总所有分片的聚合结果。


4. 分片聚合 vs 全局聚合

  • 分片聚合:每个分片只处理自己分片内的数据,返回中间结果。

  • 全局聚合:协调节点对所有分片的中间结果进行汇总,返回最终结果。

注意事项

  1. 数据分布:聚合结果的准确性依赖于数据在分片中的分布。如果数据分布不均匀,可能会导致聚合结果不准确。

  2. 性能问题:如果聚合查询涉及大量数据,可能会导致协调节点的内存和 CPU 资源消耗过高。

  3. size 参数:在聚合查询中,size 参数通常用于控制返回的文档数量,而不是聚合结果的数量。如果需要控制聚合结果的数量,可以使用 terms 聚合的 size 参数。


5. 总结

  • 聚合查询的执行过程

    • 每个分片先执行本地聚合。

    • 协调节点对所有分片的聚合结果进行全局汇总。

  • from 和 size 的作用

    • 控制返回的文档数量,而不是聚合结果的数量。

  • 性能优化

    • 避免在聚合查询中使用过大的 from 和 size 参数。

    • 使用 composite 聚合或 bucket_sort 聚合对聚合结果进行分页。

通过理解 Elasticsearch 的分布式聚合机制,可以更好地优化查询性能,避免资源浪费。


http://www.kler.cn/a/569298.html

相关文章:

  • Ubuntu下QT安装和调试的常见问题(二)__cannot__find__IGL
  • Redis速成(1)VMware虚拟机安装Redis+Session验证登录注册+MybatisPlus
  • Android Framework startServices 流程
  • 对seacmsv9进行sql注入,orderby,过滤information_schema
  • mac多版本python环境下解决模块导入问题
  • 图论题目。
  • 当前 Qt 应用程序中无法打开串口,并且没有使用通用的 Modbus 类,可在应用程序添加一个专门的“打开串口”按钮
  • 【Python 数据结构 2.时间复杂度和空间复杂度】
  • 机器学习数学基础:32.复本信度
  • 计算机毕业设计SpringBoot+Vue.js社区智慧养老监护管理平台(源码+文档+PPT+讲解)
  • 前端面试题---在vue中为什么要用路由
  • 谈谈 ES 6.8 到 7.10 的功能变迁(5)- 任务和集群管理
  • 【Redis】持久化
  • leetcode459 重复的子字符串 周期性字符串问题 KMP算法
  • 20250228下载MOOC课程的视频【单集】
  • 1-21 GIT关联本地仓库到远程
  • 配置后端验证功能之validation
  • 如何成为一名专业的程序员,准备一本《AI辅助编程:Python实战》
  • 在AI中,tokens是自然语言处理(NLP)的基本单位,用于文本的分割和处理。
  • easyExcel使用案例有代码