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

ES中对于时间聚合的一些总结

最近在通过es统计数据时,遇到了一个问题:在进行时间范围查询后,再对时间进行聚合,此时聚合的结果会受时区影响,也就是说结果的时间戳会被转换成对应时区的时间,并且时间戳也会变成这个时间的时间戳,所以就会导致结果的时间以及时间戳和查询的时间范围不匹配。

以下是demo演示:

首先向索引中添加数据,时间字段是alarmTime,时间跨度从8月1号到9月1号
在这里插入图片描述
并且在8月27号新增了两条数据

现在对8.27到9.1按照每天统计数据量
进行查询

curl --location --request GET 'http://localhost:9200/tlp_alarm_demo/_search' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--data-raw '{
  "timeout": "15000ms",
  "size": "0",
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "ordId": [
              "1826497452249849856"
            ]
          }
        },
        {
          "range": {
            "alarmTime": {
              "gte": "1724688000000",
              "lte": "1725206357000"
            }
          }
        }
      ],
      "adjust_pure_negative": true
    }
  },
  "aggregations": {
    "x": {
      "date_histogram": {
        "field": "alarmTime",
        "format": "yyyy-MM-dd",
        "calendar_interval": "1d",
        "offset": 0,
        "order": {
          "_key": "asc"
        },
        "keyed": false,
        "min_doc_count": 0
      }
    }
  }
}'

聚合结果为:
在这里插入图片描述
可以发现返回的结果是从8.26开始了,并且doc_count变成了2

通过查阅官方文档可以发现:
在这里插入图片描述

  • 当我们在 Elasticsearch 中进行时间范围查询,然后再对这些时间进行聚合时,时区会影响结果的表示。Elasticsearch 在聚合时会根据指定的时区来处理时间段(默认为UTC),这就会会导致结果时间戳与查询的时间范围不匹配。

ES中的时区

  • Elasticsearch 默认使用 UTC 时间存储和处理时间字段。
  • 需要将时间数据按照特定时区进行存储、查询和聚合,以满足业务需求。
  • 我国属于东八区时间,是比 UTC 时间快 8 小时的时区,所以要让结果正确的显式,就需要指定时区参数

通过官方文档可以发现,在 Elasticsearch 中,参数offset 和 time_zone 都与时间处理有关,总结下来就是:
time_zone
用于指定时间字段在聚合时应使用的时区。它影响的是日期聚合的分桶方式和结果的显示。例如,如果你想按照东八区时间进行每天的聚合,而不是默认的 UTC 时间。

offset
用于在聚合时对分桶的时间进行偏移。它不改变时区,而是直接在时间轴上对分桶进行偏移。例如,如果你想让每天的分桶从上午 8 点开始而不是午夜 0 点开始,通俗的说就是,es中的按天统计是从第一天的00:00到第二天的00:00,如果希望是从第一天的08:00到第二天的08:00统计,那么就需要用offset来进行偏移。

不难发现在上述的例子中,需要使用time_zone指定时区就可以正确返回

  "aggregations": {
    "x": {
      "date_histogram": {
        "field": "alarmTime",
        "format": "yyyy-MM-dd",
        "calendar_interval": "1d",
        "offset": 0,
        "order": {
          "_key": "asc"
        },
        "keyed": false,
        "time_zone": "+08:00",
        "min_doc_count": 0
      }
    }
  }

响应数据正确
在这里插入图片描述

#总结

  • 在ES中,对于时间字段,最好使用多字段类型,而不是单一的long字段(由于 long 类型的时间戳不包含时区信息,Elasticsearch 可能在聚合或展示时间时,将这些时间戳按照默认的 UTC 时区解释并显示,导致时间范围出现不匹配)
  • 官方文档给出的时间类型定义方式
"alarmTime": {
      "type": "date",
      "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
    }
  • 在 date_histogram 聚合中明确指定时区,以避免聚合结果与查询时间范围不匹配的问题。

http://www.kler.cn/news/294103.html

相关文章:

  • 集合及映射
  • Django项目搭建
  • Ext JS主要特点有哪些?
  • [米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-37 LVDS信号环路测试
  • 爬取图片保存为pdf
  • 使用Java通过SSH协议在两个远程服务器之间传输文件
  • 联众优车持续加大汽车金融服务投入与创新,赋能汽车消费新生态
  • 2024年会声会影哪个版本最新版
  • 【生日视频制作】奥迪A8提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】
  • 【MATLAB源码-第160期】基于matlab的胡桃夹子优化算法(NOA)无人机三维路径规划,输出做短路径图和适应度曲线
  • Linux操作系统:Docker版本更新
  • yarn create vite时报错error Error: EPERM: operation not permitted, mkdir
  • css radius
  • 剪映剪辑影视视频字幕声音批量自动对齐教程
  • 系统找不到指定的文件怎么解决?
  • 两种在wordpress网站首页调用woocommerce产品的方法
  • AcWing 4306:序列处理 ← 贪心算法
  • AJAX基础与进阶
  • 贪吃蛇游戏:增加暂停按钮,每次增加10分蛇会变化
  • 199页Word智慧水务平台建设方案
  • Centos 7离线部署jenkins 2.346.3
  • 【网络安全】Jenkins任意文件读取漏洞及检测工具(CVE-2024-23897)
  • log4j 多classloader重复加载配置问题解决
  • uni-app流式接受消息/文件
  • 【Java 学习】:抽象类接口
  • 未来出行:高效智能的汽车充电桩
  • CUB-200-2011数据集及该格式自己数据集制作
  • 好用的AI编程助手MarsCode[豆包]
  • 分类预测|基于CNN-LSTM-Attention卷积-长短时记忆-注意力数据分类Matlab程序 直接运行程序或替换数据集运行程序
  • 基于IMX6ULL的Cortex-A中断原理讲解,以及编写其中断向量表