es通过时间聚合查询一周中每天的数据平均值
场景回顾:设备上传的数据保存在es中,大屏模块要统计本周的数据折线图(一个设备三分总上传一次,所以拟定每天聚合求个平均值)
kibana查询请求
GET xxxx_2022-10/_search
{
"size": 0,
"query": {
"bool":{
"must": [
{"term": {
"deviceId": {
"value": "xxx"
}
}},
{
"term":{
"property":{
"value":"temperature"
}
}
}
],
"filter": {
"range": {
"createTime": {
"gte": 1664726400000, // 2022-10-03 00:00:00 ————本周开始时间
"lt": 1665331200000 // 2022-10-10 00:00:00 ————下周开始时间
}
}
}
}
},
"aggs": {
"create_date":{
"date_histogram": {
"field": "createTime",
"calendar_interval": "day",
"time_zone": "Asia/Shanghai",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
// 强制返回指定范围内的每一个桶,包括min和max,这时就会将max作为一个key
// 所以我这里只设置的最小时间,没有设计结束时间
"extended_bounds": {
"min": "1664726400000"
}
},
"aggs": {
"dayNumValAvg": {
"avg": {
"field": "numberValue"
}
}
}
}
}
}
存在的问题
返回的桶不在extended_bounds设置的范围内:
原本只需要 [10.03日0点,10.10日零点)中每一天的聚合,使用extended_bounds设定min为1664726400000(2022-10-03 00:00:00
),但是返回的第一个却为"2022-10-02 00:00:00
"
投机取巧的解法,offset设置为“
+24h
”,后来把数据挨个加了遍,这样求出来的数据没有问题……
使用脚本实现该需求
没有指定时区,可能存在偏差
点击展开代码
POST xxx_2022-10/_search?size=0
{
"size": 0,
"query": {
"bool":{
"must": [
{"term": {
"deviceId": {
"value": "xxx"
}
}},
{
"term":{
"property":{
"value":"temperature"
}
}
}
],
"filter": {
"range": {
"createTime": {
"gte": 1664726400000,
"lt": 1665331200000
}
}
}
}
},
"aggs": {
"dayOfWeek": {
"terms": {
"script": {
"lang": "painless",
"source": "doc['createTime'].value.dayOfWeekEnum.value"
}
},
"aggs": {
"dayNumValAvg": {
"avg": {
"field": "numberValue"
}
}
}
}
}
}
对应Java实现
Long[] timeScope = {1664726400000L, 1665331200000L};
String deviceId = "xxxx";
String property = "temperature";
String index = "xxxx";
DateHistogramAggregationBuilder aggCreateTime = AggregationBuilders.dateHistogram("createTimesGroup")
.field("createTime").timeZone(ZoneId.of("Asia/Shanghai")).calendarInterval(DateHistogramInterval.DAY)
.offset("+24h").extendedBounds(new ExtendedBounds(timeScope[0], null));
aggCreateTime.subAggregation(AggregationBuilders.avg("aggNumVal").field("numberValue"));
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("deviceId", deviceId))
.must(QueryBuilders.matchQuery("property", property));
boolQueryBuilder.filter(
QueryBuilders.rangeQuery("createTime").gte(timeScope[0]).lt(timeScope[1]));
SearchSourceBuilder thisWeekSearch = new SearchSourceBuilder().size(0).query(boolQueryBuilder).aggregation(aggCreateTime);
SearchRequest searchRequest = new SearchRequest(index);
searchRequest.source(thisWeekSearch);
SearchResponse response = null;
try {
response = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
// 这里是根据响应一步步拆出来的 如果有更好的方法还望不吝指教
int capacity = 7;
Double[] aggValues = new Double[capacity];
Aggregations aggregations = response.getAggregations();
ParsedDateHistogram dateHistogram = (ParsedDateHistogram) aggregations.asList().get(0);
List<? extends Histogram.Bucket> buckets = dateHistogram.getBuckets();
for (int i = 0; i < capacity; i++) {
if (i < buckets.size()) {
Histogram.Bucket bucket = buckets.get(i);
ParsedSingleValueNumericMetricsAggregation aggValue = bucket.getAggregations().get("aggNumVal");
aggValues[i] = aggValue.value();
if(Double.isNaN(aggValues[i]) || Double.isInfinite(aggValues[i])){
aggValues[i] = 0.0D;
}
} else {
aggValues[i] = 0.0D;
}
}
System.out.println(Arrays.toString(aggValues));
es通过时间聚合查询一周中每天的数据平均值的更多相关文章
- MySQL 查询某个数据库中所有包含数据记录的表名
MySQL 查询某个数据库中所有包含数据记录的表名 有时根据实际应用需要,需要对数据进行备份. 如果一个数据库中有很多数据表,但是只想备份包含数据记录的那些表数据(空表不做数据备份). 如果通过如下S ...
- 在hibernate3中如何利用HQL语句查询出对象中的部分数据并且返回该对象?
例如现在有一个Customer对象 public class Customer{ private Integer cid; private String cname; private Integer ...
- jpa模糊查询(表中的某些数据)
业务代码 Controller @GetMapping({"/task/project"}) public ResponseEntity findByProjectTitle(@R ...
- ThinkPHP 数据库操作(四) : 聚合查询、时间查询、高级查询
聚合查询 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数.所有用户的最大积分.用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 用法示例: ...
- ES进行date_histogram时间聚合,聚合结果时间不正确问题
在做项目中,有一个需求是统计本周内每天的漏洞数量,我选用的是ES中的date_histogram函数来进行聚合统计: 但是出现了一个问题,聚合出来的结果和想要统计的结果时间不一致,如下图所示 时间区间 ...
- 聚合查询、分组查询、ORM中如何给表再次添加新的字段、F与Q查询、ORM查询优化、ORM事务操作、ORM常用字段类型、ORM常用字段参数、Ajax、数据编码格式(Content-Type)、ajax携带文件数据
今日内容 聚合查询 在ORM中支持单独使用聚合函数,需要使用aggregate方法. 聚合函数:Max最大.Min最小.Sum总和.Avg平均.count统计 from django.db.model ...
- sql 聚合查询
如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗? 这个方法当然可以,但是比较弱智.对于 ...
- SQL Server数据库中导入导出数据及结构时主外键关系的处理
2015-01-26 软件开发中,经常涉及到不同数据库(包括不同产品的不同版本)之间的数据结构与数据的导入导出.处理过程中会遇到很多问题,尤为突出重要的一个问题就是主从表之间,从表有外检约束,从而导致 ...
- 开发中使用mongoTemplate进行Aggregation聚合查询
笔记:使用mongo聚合查询(一开始根本没接触过mongo,一点一点慢慢的查资料完成了工作需求) 需求:在订单表中,根据buyerNick分组,统计每个buyerNick的电话.地址.支付总金额以及总 ...
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...
随机推荐
- ARP(Address Resolution Protocol) Packet
Address Resolution Protocol The Address Resolution Protocol (ARP) is a communication protocol used f ...
- Spring Cloud Openfeign微服务接口调用与Hystrix集成实战
关于openfeign 可以认为OpenFeign是Feign的增强版,不同的是OpenFeign支持Spring MVC注解.OpenFeign和Feign底层都内置了Ribbon负载均衡组件,在导 ...
- Spring源码之spring事务
目录 Spring事务 事务自定义标签 自定义标签 解析标签 bean 的初始化 InfrastructureAdvisorAutoProxyCreator 获取增强方法 获取所有增强中内适用于当前方 ...
- 为Study.BlazorOne引入Study.Trade模块
# 1.在Application项目中添加Trade的对应的包 默认的源多半是nuget.org 我们自己的模块,一般在我们自己的NuGet服务器 从"已安装"切换到"浏 ...
- 【Azure 应用服务】应用服务连接 Azure MySQL 一直失败,报错 Create connection error
问题描述 App Service上部署的Java应用,连接 Azure Database for MySQL 失败.错误信息:Create connection error, url: jdbc:my ...
- 【Azure 事件中心】如何查看事件中心的消息中具体报文内容呢?
问题描述 如何查看事件中心的消息中具体报文内容呢? 问题解答 正常情况是通过 Event Hub 的消费端获取消息进行处理查看,但是没有客户端代码的情况下,也可以通过微软的默认客户端Service B ...
- Java abstract 关键字使用
1 package com.bytezreo.abstractTest; 2 3 /** 4 * 5 * @Description Abstract 关键字使用 6 * @author Bytezer ...
- liunx 大文件切割,catalina.out 大文件打开
工作中,由于没有没有配日志文件切割,不小心日志文件上G了,用tail -f 或 cat 命令都难打开了,但偏这时候出了点事,需要查日志 怎么呢.第一条件命令 tail -50000f ca ...
- 使用 Docker 部署 File Browser 文件管理系统
1)File Browser 介绍 官网:https://filebrowser.org/ GitHub:https://github.com/filebrowser/filebrowser 今天为大 ...
- 协议CAN&报文&仲裁
简介 物理层 CAN 协议提供了 5 种帧格式来传输数据 数据链路层 中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID) 显性0,隐性1 ...