图解:Elasticsearch 8.X 如何求解环比上升比例?

news2025/8/12 16:02:58

1、企业级Elasticsearch 8.X 实战问题

问题描述:有个聚合的需求,问下大家,一个索引中有时间字段 要求 计算本月和上月相比的环比上升比例?——来自GPVIP群

2、问题释义

2.1 啥叫环比?

环比是统计学术语,表示连续2个统计周期内的量的变化比。

2.2 Elasticsearch 怎么做计算问题?

其实这个问题比较大,从大的角度讲:Elasticsearch 更适合做检索,能做脚本计算处理,但会有性能问题。

官方明确强调:

Avoid script——If possible, avoid using script-based sorting, scripts in aggregations, and the script_score query.

通俗点说,避免使用脚本,除非特殊情况必须使用。

Elasticsearch 能支持的计算问题如下几种方式:

图片

脚本检索(script query) 脚本检索参见:
脚本聚合(script aggregation)参见:
在这里插入图片描述

脚本预处理(ingest pipeline 之 script pipeline)。
预处理参见:
Elasticsearch 预处理没有奇技淫巧,请先用好这一招!
Elasticsearch的ETL利器——Ingest节点

3、问题拆解

回归我们的问题,分两个维度拆解。

维度1:从数据到结果。

原始的数据至少包含两个字段:日期字段和数据字段,并没有基于日期的汇总数据。
也就是说,汇总结果数据,需要我们借助聚合实现。

维度2:从结果到数据。

最终结果需要临近的两个月份的汇总结果计算求得,需要借助:bucket_script 子聚合实现。而bucket_script 需要两重聚合,且嵌套到内层实现。

可以通过如下三个步骤实现,如下脑图梳理。

  • 步骤1:创建索引。
  • 步骤2:导入数据(自己构造)。
  • 步骤3:聚合实现(最核心)。
    聚合的实现是问题求解的关键。

最外层聚合:时间范围聚合,借助Date Range筛选近两个月的数据。

内层聚合:分别求解出本月和前一个月的数据。其实又需要拆解为两层聚合。

第一层:过滤当月和前一个月的时间范围。借助:filter aggs 实现。

第二层:指标 sum aggs 聚合实现结果求和统计。

与上内层同级实现 bucket_script 结果求解,计算环比!

图片

4、问题求解

按照上面脑图拆解的三个步骤搞定实现。视频如下:

4.1:step1 创建索引且指定Mapping!

DELETE test-20221109
PUT test-20221109
{
  "mappings": {
    "properties": {
      "insert_date": {
        "type": "date"
      },
      "count": {
        "type": "integer"
      }
    }
  }
}

4.2 step2 :写入数据

POST test-20221109/_bulk
{"index":{"_id":1}}
{"insert_date":"2022-11-09T12:00:00Z","count":5}
{"index":{"_id":2}}
{"insert_date":"2022-11-08T12:00:00Z","count":150}
{"index":{"_id":3}}
{"insert_date":"2022-12-09T12:00:00Z","count":33}
{"index":{"_id":4}}
{"insert_date":"2022-12-08T12:00:00Z","count":44}
{"index":{"_id":5}}
{"insert_date":"2022-12-09T12:00:00Z","count":55}
{"index":{"_id":6}}
{"insert_date":"2022-12-08T12:00:00Z","count":66}
4.3 step3:聚合求解环比
POST test-20221109/_search
{
  "size": 0,
  "aggs": {
    "range_aggs": {
      "range": {
        "field": "insert_date",
        "format": "yyyy-MM-dd",
        "ranges": [
          {
            "from": "2022-11-01",
            "to": "2022-12-31"
          }
        ]
      },
      "aggs": {
        "11month_count": {
          "filter": {
            "range": {
              "insert_date": {
                "gte": "2022-11-01",
                "lte": "2022-11-30"
              }
            }
          },
          "aggs": {
            "sum_aggs": {
              "sum": {
                "field": "count"
              }
            }
          }
        },
        "12month_count": {
          "filter": {
            "range": {
              "insert_date": {
                "gte": "2022-12-01",
                "lte": "2022-12-31"
              }
            }
          },
          "aggs": {
            "sum_aggs": {
              "sum": {
                "field": "count"
              }
            }
          }
        },
        "bucket_division": {
          "bucket_script": {
            "buckets_path": {
              "pre_month_count": "11month_count > sum_aggs",
              "cur_month_count": "12month_count > sum_aggs"
            },
            "script": "(params.cur_month_count - params.pre_month_count) / params.pre_month_count"
          }
        }
      }
    }
  }
}

求解结果如下:

图片

图片

5、小结

其实这个聚合实现相当复杂,且不够灵活,可扩展性不强。

业务选型层面,如果非实时求解的场景,真的不建议这么做。

我们可以定时离线计算结果统计,借助 Java 或者 python 等代码实现更为顺畅和“丝滑”。

你的业务层面有没有遇到类似问题?欢迎留言说一下你的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW使用Deskto pExecution Trace工具包

LabVIEW使用Deskto pExecution Trace工具包 可以使用桌面执行跟踪工具包来调试和优化大型LabVIEW应用程序,包括具有多个循环的应用程序、客户端-服务器架构、动态加载VI等。该工具包从本地或远程计算机桌面上运行的应用程序捕获执行事件,并在表窗格中显…

PCB layout有DRC为什么还要用CAM和DFM检查?

随着电子产品的高速发展,PCB生产中大量使用BGA、QFP、PGA和CSP等高集成度封装器件,PCB的复杂程度也大大增加,这对于PCB设计也提出了更高的要求。所以在PCB设计阶段,除了基础的电气性能之外,还需要考虑可制造性&#xf…

上游模式用于实验室用冷冻机压力和真空度的高精度控制

摘要:本文针对实验室用冷冻干燥机的真空度控制,提出了干燥过程中的真空度精密控制解决方案。解决方案主要是采用双真空计(电容真空计和皮拉尼真空计)测量干燥过程中的真空度变化,双通道PID真空度控制器一方面采集电容真…

MySQL数据库:2、MySQL的下载与安装、基本使用、系统服务制作

一、MySQL简介 ​ MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 二、安装与下载 1、下载流程 1、访问官方(www.mysql.com&#xf…

数据结构学习笔记(Ⅲ):栈和队列

目录 1 栈 1.1 栈的基本概念 1.定义 2.基本操作 ​1.2 栈道顺序存储实现 1.实现 2.基本操作 3.共享栈 1.3 栈的链式存储实现 2 队列 2.1 基本概念 1.定义 2.基本操作 2.2 队列的顺序实现 1.实现 2.基本操作 2.3 队列的链式实现 1.链式存储实现队列 2.基本操…

Selenium基础 —unittest单元测试框架

目录 (一)unittest基本简介 (二)unittest基本概念 1、unittest核心的四个概念 2、如何创建一个测试类 3、test fixture常用的四个方法 4、unittest编写测试方法(用例)规范 5、执行测试脚本 6、入门示例 7、结果说明 &am…

目标检测论文解读复现之十七:融合注意力机制的YOLOv5口罩检测算法

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0…

视频格式转换器下载哪个好?分享:3种TS到MP4的转换器

对于TS视频格式大家可能接触的比较少,我们先来认识下TS视频格式。 TS是日本高清摄像头拍摄下的视频格式,常用于记录实录片段,比如讲堂、演唱会、监控等等。TS和MP4不同的地方在于TS是一种抢先非高清版视频,其画质并不如MP4&#x…

华为十年架构师实战经验总结:大规模分布式系统架构与设计实战

前言 本篇是从程序员到首席架构师十多年职业生涯的实战经验总结,系统讲解构建大规模分布式系统的核心技术与实现方法,包含开源的Fourinone系统的设计与实现过程,手把手教你掌握分布式技术。 通过学习这个系统的实现方法与相关的理论&#x…

Investment Guide|Star Investors: X METAVERSE PRO‘s Copy Trading System

With the globalization of finance, people around the world are more keenly aware of the role of finance. When financial investment has become a social trend, “how to effectively use every penny and grasp every investment opportunity in a timely manner” h…

SpringCloud - 服务调用

文章目录1. LB负载均衡(Load Balance)2. Ribbon负载均衡服务调用2.1 Ribbon负载均衡演示2.1.1 架构2.1.2 POM2.1.3 RestTemplate操作2.2 Ribbon核心组件IRule2.3 负载均衡规则替换2.4 Ribbon负载均衡算法2.4.1 原理2.4.2 手动实现负载均衡3. OpenFeign服务调用3.1 OpenFeign使用…

[Spring Boot]09 Spring Boot集成和使用Redis

目录前言Spring Boot如何集成RedisSpring Boot如何使用Redis小结前言 Redis全称Remote Dictionary Server(远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人 Salvatore Sanfilip…

Python 基础(二):搭建 Python 开发环境

搭建 Python 开发环境一、下载 Python 安装包二、安装 Python三、Python开始菜单介绍3.1 IDLE3.2 Python 3.113.3 Python 3.11 Manuals3.4 Python 3.11 Manuals Docs四、Hello World大家好,我是水滴~~ 本篇文章主要介绍如何搭建 Python 的开发环境,主要内…

Eolink钉钉webhook使用教程(超详细)

目录 一、操作步骤 1、空间管理 2、添加服务调用 3、填写添加Webhook信息 4、获取DingDing通知URL 1、需要创建一个至少三个人的群 2、需要添加一个群机器人。 3、选择智能群助手 4、添加机器人 5、点击设置 6、选择【自定义】通过Webhook接入自定义服务 7、确认添…

多元统计分析-----例8.1:今有14名学生的身高和体重数据,做相关图以显示相关变量间的关系。

例8.1:今有14名学生的身高和体重数据,做相关图以显示相关变量间的关系。 x1c(147,171,175,159,155,152,158,154,164,168,166,159,164,177) x2c(32,57,64,1,38,35,44,41,54,57,49,47,46,63)plot(x1,x2,xlim c(145,180),ylimc(25,75))出错: …

Android进阶:6、使用okhttp下载图片

因为在网上找到的资源不只是一些字符串或是一些二进制数字,还是有的是可以肉眼看见的图片,那么我们在发送网络请求时拿到的是一张图片该如何显示在组件上面呢? 这就要使用到okhttp的请求返回结果的一个属性(byteStream&#xff0…

自动驾驶感知算法实战14——感知算法模型生产线

自动驾驶感知算法实战专栏:https://blog.csdn.net/charmve/category_12097938.html目录 一、感知算法生产流程二、算法模型部署流程二、各个阶段交付物数据选择(数据采集、数据增强)数据标注模型训练模型量化模型部署测试与验证一、感知算法生产流程 二、算法模型部署流程 二…

【JavaWeb从零到一】JSPELJSTL

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:【JavaWeb】 🥭本文…

通过题目入门python基础1

通过题目入门python基础 简介:本文通过,python的基础题目,带领大家入门python的基础语法,以实用主义为主。 差 读取四个整数 A,B,C,D,并计算 (AB−CD) 的值。 输入格式 输入共四行,第一行包含整数 A&am…

GraphQL 实践与服务搭建

原文链接: GraphQL 实践与服务搭建 GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容…