Es直方图聚合--date_histogram

news2024/10/7 20:25:50

文章目录

  • 1、背景
  • 2、bucket_key如何计算
  • 3、前置知识
  • 4、日历和固定时间间隔
    • 4.1 Calendar intervals 日历间隔
    • 4.2 Fixed intervals 固定间隔
  • 5、数据准备
    • 5.1 准备mapping
    • 5.2 准备数据
  • 6、聚合案例
    • 6.1 dsl
    • 6.2 java代码
    • 6.3 聚合结果
  • 7、完整代码
  • 8、参考文档

1、背景

此处来简单学习一下 elasticsearchdate_histogram直方图聚合。它和普通的直方图histogram聚合差不多,但是date_histogram只可于 日期或日期范围 类型的值一起使用。

2、bucket_key如何计算

  1. 假设我们存在如下时间 2022-11-29 23:59:59
  2. es中时间为 2022-11-29 23:59:59 +0000,因为上方的时间没有时区,所以会自动加上0时区,对应的时间戳为 1669766399000
  3. 此处假设以 1d 为单位来聚合
  4. 聚合统计中 time_zone的值为+0800
  5. bucket_key计算公式为 bucket_key = localToUtc(Math.floor(utcToLocal(value) / interval) * interval))

计算步骤如下:(此处是我自己的理解,如果不对欢迎指出)

  • utcToLocal(value) = 1669766399000(utc的值) + 8*60*60*1000(time_zone +8的值) = 1669795199000
  • Math.floor(utcToLocal(value) / interval) * interval) = Math.floor(1669795199000 / (24*60*60*1000)) * (24*60*60*1000) = 1669766400000
  • localToUtc(...)=1669766400000-86060*1000=1669737600000
  • key_as_string=utc时间1669737600000转换成东八区时间展示为=2022/11/30 00:00:00

bucket_key的计算

3、前置知识

  1. 日期(date)类型的字段在 es中是以 long类型的值保存的。
  2. es中默认 默认的时区是 0时区
  3. 如果我们有一个东八区的时间,那么在es中是如何存储的呢?
  • 假设存在如下mapping
"invoked_time": {
  "type": "date",
  "format": ["yyyy-MM-dd HH:mm:ss"]
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 如果我们此时存在 如下 东八区时间 2022-11-29 12:12:12,那么在 es 会存储为 2022-11-29 12:12:12 +0000 对应的时间戳,为什么会加上+0000,因为我们自己的时间字符串中没有时区,就会加上默认的0时区。

4、日历和固定时间间隔

既然我们是根据时间来进行聚合,那么必然就会涉及到这么一个问题。假设以天为单位来聚合,那么1天到底是固定24小时呢,还是可变的呢? 因为存在时区的关系,在有的国家,在某些时区下,一天就不一定是24个小时。因此在es中提供了calendar-aware time intervals, 和 fixed time intervals. 两种类型。

4.1 Calendar intervals 日历间隔

日历感知间隔使用calendar_interval参数配置。 它可以自动感应到日历中的时区变化。它的单位只能是单数,不可是复数,比如2d就是错误的。

日历间隔 可用的单位为:分钟 (1m)、小时 (1h)、天 (1d)、星期 (1w)、月 (1M)、季度 (1q)、年 (1y)

举个例子:1m 是从何时开始的,何时结束的?.
所有的分钟都从00秒开始。一分钟是指定时区中第一分钟的00秒和下一分钟的00秒之间的时间间隔,用于补偿任何介于其间的闰秒,因此整点后的分钟数和秒数在开始和结束时是相同的。

4.2 Fixed intervals 固定间隔

固定间隔使用fixed_interval参数进行配置。

与日历感知间隔相比,固定间隔是固定数量的SI单位,无论它们落在日历的哪个位置,都不会偏离。一秒总是由1000ms组成。这允许以支持的单位的任意倍数指定固定间隔。但是,这意味着固定间隔不能表示其他单位,例如月,因为一个月的持续时间不是固定的数量。尝试指定月或季度等日历间隔将引发异常。

固定间隔 可用的单位为:
毫秒 (ms)
秒 (s)
          定义为每个1000毫秒
分钟 (m)
          所有分钟都从00秒开始。 定义为每个60秒(60,000毫秒)
小时 (h)
          所有小时都从00分00秒开始。 定义为每60分钟(3,600,000毫秒)
天 (d)
          所有天都在尽可能早的时间开始,通常是00:00:00(午夜)。 定义为24小时(86,400,000毫秒)

5、数据准备

5.1 准备mapping

PUT /index_api_invoked_time
{
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "long"
      },
      "api": {
        "type": "keyword"
      },
      "invoked_time": {
        "type": "date",
        "format": ["yyyy-MM-dd HH:mm:ss"]
      }
    }
  }
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

5.2 准备数据

PUT /index_api_invoked_time/_bulk
{"index":{"_id":1}}
{"api":"/user/infos","invoked_time": "2022-11-26 00:00:00"}
{"index":{"_id":2}}
{"api":"/user/add"}
{"index":{"_id":3}}
{"api":"/user/update","invoked_time": "2022-11-26 23:59:59"}
{"index":{"_id":4}}
{"api":"/user/list","invoked_time": "2022-11-27 00:00:00"}
{"index":{"_id":5}}
{"api":"/user/export","invoked_time": "2022-11-29 23:59:59"}
{"index":{"_id":6}}
{"api":"/user/detail","invoked_time": "2022-12-01 01:00:00"}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

6、聚合案例

6.1 dsl

POST /index_api_invoked_time/_search 
{
  "size": 0, 
  "aggregations": {
    "agg_01": {
      "date_histogram": {
        "field": "invoked_time",
        "calendar_interval": "1d",
        "min_doc_count": 0,
        "missing": "2022-11-27 23:59:59",
        "time_zone": "+08:00",
        "offset":"+10h",
        "extended_bounds": {
          "min": "2022-11-26 10:00:00",
          "max": "2022-12-03 10:00:00"
        }
      }
    }
  }
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

6.2 java代码

@Test
@DisplayName("日期直方图聚合")
public void test01() throws IOException {
    SearchRequest request = SearchRequest.of(searchRequest ->
            searchRequest.index("index_api_invoked_time")
                    .size(0)
                    .aggregations("agg_01", agg ->
                            agg.dateHistogram(dateAgg ->
                                    // 聚合的字段
                                    dateAgg.field("invoked_time")
                                            // 聚合的单位,日历感知 单位为天,此时的一天不一定为24小时,因为夏令时时,有些国家一天可能只有23个小时
                                            .calendarInterval(CalendarInterval.Day)
                                            // 固定间隔, 此处可以指定 1天就是24小时
                                            // .fixedInterval()
                                            // 如果聚合的桶中,没有文档也返回
                                            .minDocCount(0)
                                            // 对于文档中,聚合字段缺失,此处给一个默认值,默认情况是此文档不参与聚合
                                            .missing(DateTime.of("2022-11-27 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
                                            // 时区
                                            .timeZone("+08:00")
                                            // 偏移,偏移是在时间在对应的时区调整之后,再去偏移
                                            .offset(time -> time.time("+10h"))
                                            // 如果返回的桶数据不在这个边界中,则给默认值,不会对数据进行过滤。
                                            .extendedBounds(bounds ->
                                                    bounds.min(FieldDateMath.of(f -> f.expr("2022-11-26 10:00:00")))
                                                            .max(FieldDateMath.of(f -> f.expr("2022-12-03 10:00:00")))
                                            )
                            )
                    )
    );
    System.out.println("request: " + request);
    SearchResponse<String> response = client.search(request, String.class);
    System.out.println("response: " + response);
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

6.3 聚合结果

聚合结果

7、完整代码

https://gitee.com/huan1993/spring-cloud-parent/blob/master/es/es8-api/src/main/java/com/huan/es8/aggregations/bucket/DateHistogramAggs.java

8、参考文档

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html#date-histogram-missing-value
  2. https://www.pipiho.com/es/7.7/cn/search-aggregations-bucket-datehistogram-aggregation.html

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

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

相关文章

云计算UPS监控,怎么办?

在大型数据机房中&#xff0c;UPS系统扮演着关键的角色&#xff0c;为计算机和网络设备提供可靠的电力备份。由于数据机房的规模庞大且关键性强&#xff0c;监控UPS系统的可靠性和效率至关重要。 UPS监控可以提供实时的电池状态、负载信息、电网电压等监测数据&#xff0c;并能…

c++中assert

参考:https://blog.csdn.net/bitcarmanlee/article/details/124283683 1.什么是assert assert&#xff0c;中文翻译为断言&#xff0c;注意是一个宏定义&#xff0c;不是函数。 c中&#xff0c;要使用assert&#xff0c;可以将cassert头文件include进来&#xff0c;而cassert最…

路径规划算法:基于孔雀优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于孔雀优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于孔雀优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法孔雀…

【HCIA】09.STP

STP的选举之发波原理 设备启动之后&#xff0c;经过选举会分别显示出它们的等级&#xff08;最强&#xff0c;次强&#xff0c;最弱&#xff09;选出等级之后&#xff0c;两两设备开始互相发波&#xff0c;等级强的设备会将弱的设备的光顶回去此时两两设备之间的波就是单方向的…

家政服务小程序软件解决方案

家政服务小程序软件是近年来随着人们对家政服务需求的增长而逐渐兴起的一种数字化服务解决方案。通过小程序软件&#xff0c;用户可以轻松预约家政服务&#xff0c;包括保姆、月嫂、钟点工等&#xff0c;而且价格透明、服务规范&#xff0c;大大提高了用户对家政服务的满意度。…

神经网络结构可视化-netron

网址&#xff1a;https://netron.app/ 点选择模型&#xff0c;将oonx文件拉到netron界面&#xff0c;即可 输出; 如何将pytorch模型转换为onnx的格式&#xff1f; 在测试&#xff08;训练好的模型&#xff09;里输入代码 to_onnx(model, 3, 28, 28, output/params.onnx)其…

【Linux】十分钟理解动静态库

目录 一 前置概念二 静态库2.12.22.3放入指定路径2.4 第三方库的使用 四 动态库3.1 环境变量3.2 软链接方案3.3 配置文件方案 一 前置概念 我们在VS2022下安装开发环境实际上就是安装编译器软件、安装要开发的语言配套的库和头文件。我们使用编译器有语法的自动提醒功能&#…

python常用库之colorama (python命令行界面打印怎么加颜色)

文章目录 python常用库之colorama (python命令行界面打印怎么加颜色)背景colorama介绍colorama使用colorama打印红色闪烁打印颜色组合 python常用库之colorama (python命令行界面打印怎么加颜色) 背景 在Python开发项目过程中&#xff0c;为了方便调试代码&#xff0c;经常会…

Java中Map中10w条数据用什么循环性能最好呢?

加油&#xff0c;新时代打工人&#xff01; 1、java中List集合三种获取集合元素方式 2、Java中Map使用增强for循环和迭代器获取key和value 选择合适的循环方式&#xff0c;让性能最优&#xff01; public class Test2 {public static void main(String[] args) {//初始化 10w…

vue upload 上传下载

目录 上传 下载 对象/文件流 download处理返回 文件流 axios.post 封装axios 1.请求设置类型responseType: blob 2.若有请求拦截(直接返回即可) 3.download 4.请求下载 相关基础 blob MIME vue 实现文件上传、下载的方法 - 掘金 上传 submitAddFile(){var form…

基础算法-【离散化】

离散化的本质&#xff1a;是建立了一段数列到自然数之间的映射关系&#xff08;value -> index)&#xff0c;通过建立新索引&#xff0c;来缩小目标区间&#xff0c;使得可以进行一系列连续数组可以进行的操作比如二分&#xff0c;前缀和等… 相应的算法模板&#xff1a; v…

【Linux】—— 进程地址空间

序言&#xff1a; 在上篇中&#xff0c;我们讲解了关于进程优先级的概念。本期&#xff0c;我将给大家介绍的是关于进程地址空间的话题。 目录 &#xff08;一&#xff09;程序地址空间回顾 &#xff08;二&#xff09;代码演示 &#xff08;三&#xff09;进程地址空间的引…

【力扣算法08】之 5. 最长回文子串 python

文章目录 问题描述示例1示例2提示 思路分析代码分析完整代码详细分析 运行效果截图调用示例运行结果 完结 问题描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例1 输入&#xff1a;s…

【网络编程】Linux服务器程序规范相关内容

文章目录 1、日志1.1、syslog()函数 2、用户信息2.1、UID、EUID、GID、EGID 3、进程间关系3.1、进程组3.2、会话 4、服务器程序后台化&#xff08;守护进程&#xff09; 1、日志 Linux提供一个守护进程rsyslogd来处理系统日志&#xff0c;系统日志中包括用户进程产生的日志以及…

VUE2基础-Vue实例

Vue 实例 创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的&#xff1a; var vm new Vue({// 选项 }) 虽然没有完全遵循 MVVM 模型&#xff0c;但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名…

交换:交换机相关技术(二层技术)

目录 VLAN&#xff1a;虚拟局域网 VLAN种类&#xff1a; 接口分配链路类型 接口划分VLAN 跨网段的通讯 VLAN&#xff1a;虚拟局域网 LAN &#xff1a;局域网 MAN&#xff1a;城域网 WAN&#xff1a;广域网 1.一个VLAN相当于一个广播域 VLAN&#xff1a;通过路由器和交换机…

PADS Logic如何对原理图页面进行操作呢?

在绘制复杂的原理图时&#xff0c;会根据功能模块来将原理图进行分页处理&#xff0c;在绘制原理图过程中&#xff0c;会对原理图页面进行一些处理&#xff0c;操作方法如下所列&#xff1a; 1、页面拷贝与粘贴&#xff1a;在原理图中选中需要复制的元件走线等&#xff0c;左击…

Git常用命令及在Idea中如何使用创建分支等,详讲带图[保姆级]

文章目录 Git在Git命令行中执行下面命令:设置基本信息获取Git仓库Git 工作区 暂存区 版本库概念工作状态远程仓库操作分支操作标签分类 Idea中使用推送到远程仓库(提交并且推送)分支操作 Git 在Git命令行中执行下面命令: 设置基本信息 设置用户信息 git config --global use…

阿里巴巴开源的Spring Cloud Alibaba手册在GitHub上火了,完整版开放下载

“微服务架构经验你有吗&#xff1f;” 前段时间一个朋友去面试&#xff0c;阿里面试官一句话问倒了他。实际上&#xff0c;不在BAT这样的大厂工作&#xff0c;是很难接触到支撑千亿级流量微服务架构项目的。但也正是这种难得&#xff0c;让各个大厂都抢着要这样的人才&#x…

Bash 第十行

195 第十行 给定一个文本文件 file.txt&#xff0c;请只打印这个文件中的第十行。 示例: 假设 file.txt 有如下内容&#xff1a; Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 你的脚本应当显示第十行&#xff1a; Line 10 来源&#xff1a;…