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

elastic search 是如何做sum操作的

简单来说,Elasticsearch SQL 的 SUM操作是通过将其​​翻译(编译)成 Elasticsearch 原生的聚合查询​​来实现的,具体来说是 sum度量聚合(Metric Aggregation)。

以下是详细的实现步骤和原理:


​1. 架构概览:SQL 到 Elasticsearch DSL 的翻译​

Elasticsearch 的 SQL 功能本质上是一个​​翻译层​​。它本身不直接执行 SQL 查询,而是做了以下工作:

  1. 1.

    ​解析 (Parse)​​: 将标准的 SQL 语句解析成抽象语法树 (AST)。

  2. 2.

    ​翻译 (Translate)​​: 将 AST 转换为等价的 Elasticsearch 原生 JSON 查询(即 Query DSL)。

  3. 3.

    ​执行 (Execute)​​: 将翻译好的 DSL 请求发送给 Elasticsearch 集群处理。

  4. 4.

    ​格式化 (Format)​​: 将 Elasticsearch 返回的 JSON 结果转换成 SQL 客户端期望的表格形式。

你的 SUM操作主要发生在第 2 步和第 3 步。


​2. SUM 操作的具体翻译过程​

我们通过一个例子来看。假设你执行以下 SQL 查询:

SELECT SUM(price) FROM products;

​Elasticsearch SQL 层会将其翻译为如下所示的 Elasticsearch 查询 DSL:​

{ "size": 0, // 不需要返回任何原始文档(hits),只需要聚合结果 "aggs": { "SUM(price)": { // 聚合结果的名称直接来自 SQL 表达式 "sum": { "field": "price" // 对 price 字段进行求和 } } } }

​如果带有分组呢?​​ 再看一个更复杂的例子:

SELECT category, SUM(price) FROM products GROUP BY category;

这条 SQL 会被翻译为:

{ "size": 0, "aggs": { "groupby": { // 先进行分组聚合(桶聚合) "terms": { "field": "category", // 分组字段 "size": 10 // 默认返回前10个桶(分组)的结果 }, "aggs": { // 在每个分组桶内,进行子聚合 "SUM(price)": { "sum": { "field": "price" } } } } } }

这个过程清晰地展示了:∙

SELECT SUM(...)-> "sum": { "field": ... }(度量聚合)∙

GROUP BY-> "terms": { "field": ... }(桶聚合)


​3. 分布式执行:如何在集群中计算​

这才是 Elasticsearch 强大之处。翻译后的 DSL 被发送到协调节点(Coordinating Node),其执行流程如下:

  1. 1.

    ​分发阶段​​: 协调节点将查询分发到所有相关的数据分片(Shards)。

  2. 2.

    ​分片本地计算​​: ​​每个分片独立地在自己的数据子集上执行相同的聚合操作​​(即计算本分片内所有文档的 price之和)。这是一个巨大的性能优势,因为计算是并行且分布式的,避免了传输所有原始数据。

  3. 3.

    ​结果汇总​​: 每个分片将其本地计算出的 sum值返回给协调节点。

  4. 4.

    ​全局reduce​​: 协调节点收集所有分片的局部 sum值,​​将它们简单相加​​,得到全局总和。

  5. 5.

    ​返回结果​​: 协调节点将最终的总和返回给 SQL 层,SQL 层再将其格式化成 SQL 结果返回给用户。

对于分组求和 (GROUP BY),过程类似:

  • 每个分片计算自己数据里每个 category的局部 sum(price)

  • 协调节点合并所有分片的结果:将相同 category的局部 sum值相加,得到每个 category的全局 sum


​4. 关键技术点与优化​

  • ​使用 doc_values​: 为了高效聚合,Elasticsearch 强烈依赖倒排索引和 doc_valuesdoc_values是一种列式存储结构,对于 price这样的数值字段,启用 doc_values(默认通常为开启)后,Elasticsearch 可以非常快速地在磁盘上遍历和累加所有值,而不需要加载整个原始文档。​​这是聚合性能高的根本原因​​。

  • ​近似算法(用于海量数据)​​: 对于 COUNT(DISTINCT)这种操作,Elasticsearch 默认使用 ​​HyperLogLog++​​ 算法来提供近似值,以极低的内存消耗换取极快的速度和可扩展性。但需要注意的是,​SUM操作是精确的​​,不是近似值。∙

  • ​缓存​​: 聚合结果可能会被缓存(分片请求缓存),以加速后续相同的查询。


​总结​

Elasticsearch SQL 的 SUM操作实现流程可以概括为:

​SQL 语句 -> (SQL 翻译层) -> Elasticsearch 原生 sum聚合查询 -> (分布式执行) -> 各分片本地求和 -> 协调节点汇总 -> (SQL 翻译层) -> 格式化 SQL 结果 -> 返回用户​

其核心优势在于:

  1. 1.

    ​翻译机制​​: 将熟悉的 SQL 语法无缝转换为 Elasticsearch 高性能的原生聚合 DSL。

  2. 2.

    ​分布式计算​​: 利用分片架构,将计算任务下推到每个数据节点并行执行,极大提升了处理海量数据的效率。

  3. 3.

    ​列式存储​​: 依赖 doc_values进行快速字段值计算,避免解析整个 JSON 源文档。

因此,虽然表面是 SQL 接口,但其底层享受了 Elasticsearch 作为分布式搜索引擎为聚合分析提供的全部性能和扩展性优势。


文章转载自:

http://7iqQIa4K.pqjpw.cn
http://04Dcto5U.pqjpw.cn
http://MDE4XBiM.pqjpw.cn
http://9xX6H6ES.pqjpw.cn
http://991lNIlz.pqjpw.cn
http://uVOh2oPQ.pqjpw.cn
http://SoH0KmS0.pqjpw.cn
http://1vZOcRnV.pqjpw.cn
http://NsUxqoFI.pqjpw.cn
http://6cKP9YjB.pqjpw.cn
http://snCdHBIM.pqjpw.cn
http://gFeZYj8y.pqjpw.cn
http://YumZ6kZ4.pqjpw.cn
http://cVC5VjMJ.pqjpw.cn
http://I8qKp2y6.pqjpw.cn
http://MEcLdN0z.pqjpw.cn
http://SZkPx5Cj.pqjpw.cn
http://mplKveq4.pqjpw.cn
http://5BIjpV1Q.pqjpw.cn
http://TVGk8eTy.pqjpw.cn
http://ZK0cnktR.pqjpw.cn
http://e12w9FGa.pqjpw.cn
http://aM7xP4It.pqjpw.cn
http://sFcb7pbT.pqjpw.cn
http://X7cnVIxk.pqjpw.cn
http://WaRHbfOv.pqjpw.cn
http://v3QY6VFj.pqjpw.cn
http://Uc6Tb5b1.pqjpw.cn
http://KPZZMqUB.pqjpw.cn
http://nIeq3pbz.pqjpw.cn
http://www.dtcms.com/a/373174.html

相关文章:

  • HashMap高频面试题目
  • 李沐深度学习论文精读(二)Transformer + GAN
  • 达梦数据库(DM8)单机数据库安装部署
  • 《sklearn机器学习——特征提取》
  • OnlyOffice的高可用方案如何做
  • 苍穹外卖前端Day1 | vue基础、Axios、路由vue-router、状态管理vuex、TypeScript
  • 【RabbitMQ】----RabbitMQ 的7种工作模式
  • CN2 GIA线路深度解析:阿里云/腾讯云选哪个?(附三网评测)
  • 冰火岛 Tech 传:Apple Foundation Models 心法解密(下集)
  • Gamma AI:高效制作PPT的智能生成工具
  • 云计算学习笔记——HTTP服务、NFS服务篇
  • unity入门:按钮控制横向滚动视窗显示最左最右
  • 大模型为什么会有幻觉?-Why Language Models Hallucinate
  • 数据结构造神计划第三天---数据类型
  • MYSQL集群高可用架构之MHA高可用架构
  • 小麦矩阵系统:让短视频分发实现抖音快手小红书全覆盖
  • 智能高低压地埋线走向探测器如何在多条电缆中查找特定电缆?
  • 【Docker】常见操作
  • Python/JS/Go/Java同步学习(第七篇)四语言“字符串类型验证“对照表: 运维“雏田“白眼审核凭证上传崩溃(附源码/截图/参数表/避坑指南)
  • 深入解析网通核心器件:光模块、巴伦(Balun)与LTCC及其关键参数
  • 将 maven 集成到 idea 后出现 向项目创建模块时出错:null 的问题
  • 4.1Vue基本使用
  • 温补晶振(TCXO)
  • 应用层————HTTPS协议
  • 内存越界引发线程函数调用堆栈回溯异常以及INT 3软中断实战分析案例分享
  • stm32——单总线,DHT11
  • WAF(Web应用防火墙)重要域名接入方案 - 操作笔记
  • [网络入侵AI检测] 纯卷积神经网络(CNN)模型 | CNN处理数据
  • Embedding 层(tf.keras.layers.Embedding)文档翻译
  • 人工智能学习:Transformer结构(文本嵌入及其位置编码器)