场景回顾:设备上传的数据保存在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通过时间聚合查询一周中每天的数据平均值的更多相关文章

  1. MySQL 查询某个数据库中所有包含数据记录的表名

    MySQL 查询某个数据库中所有包含数据记录的表名 有时根据实际应用需要,需要对数据进行备份. 如果一个数据库中有很多数据表,但是只想备份包含数据记录的那些表数据(空表不做数据备份). 如果通过如下S ...

  2. 在hibernate3中如何利用HQL语句查询出对象中的部分数据并且返回该对象?

    例如现在有一个Customer对象 public class Customer{ private Integer cid; private String cname; private Integer ...

  3. jpa模糊查询(表中的某些数据)

    业务代码 Controller @GetMapping({"/task/project"}) public ResponseEntity findByProjectTitle(@R ...

  4. ThinkPHP 数据库操作(四) : 聚合查询、时间查询、高级查询

    聚合查询 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数.所有用户的最大积分.用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 用法示例: ...

  5. ES进行date_histogram时间聚合,聚合结果时间不正确问题

    在做项目中,有一个需求是统计本周内每天的漏洞数量,我选用的是ES中的date_histogram函数来进行聚合统计: 但是出现了一个问题,聚合出来的结果和想要统计的结果时间不一致,如下图所示 时间区间 ...

  6. 聚合查询、分组查询、ORM中如何给表再次添加新的字段、F与Q查询、ORM查询优化、ORM事务操作、ORM常用字段类型、ORM常用字段参数、Ajax、数据编码格式(Content-Type)、ajax携带文件数据

    今日内容 聚合查询 在ORM中支持单独使用聚合函数,需要使用aggregate方法. 聚合函数:Max最大.Min最小.Sum总和.Avg平均.count统计 from django.db.model ...

  7. sql 聚合查询

    如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗? 这个方法当然可以,但是比较弱智.对于 ...

  8. SQL Server数据库中导入导出数据及结构时主外键关系的处理

    2015-01-26 软件开发中,经常涉及到不同数据库(包括不同产品的不同版本)之间的数据结构与数据的导入导出.处理过程中会遇到很多问题,尤为突出重要的一个问题就是主从表之间,从表有外检约束,从而导致 ...

  9. 开发中使用mongoTemplate进行Aggregation聚合查询

    笔记:使用mongo聚合查询(一开始根本没接触过mongo,一点一点慢慢的查资料完成了工作需求) 需求:在订单表中,根据buyerNick分组,统计每个buyerNick的电话.地址.支付总金额以及总 ...

  10. 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有相关 ...

随机推荐

  1. ARP(Address Resolution Protocol) Packet

    Address Resolution Protocol The Address Resolution Protocol (ARP) is a communication protocol used f ...

  2. Spring Cloud Openfeign微服务接口调用与Hystrix集成实战

    关于openfeign 可以认为OpenFeign是Feign的增强版,不同的是OpenFeign支持Spring MVC注解.OpenFeign和Feign底层都内置了Ribbon负载均衡组件,在导 ...

  3. Spring源码之spring事务

    目录 Spring事务 事务自定义标签 自定义标签 解析标签 bean 的初始化 InfrastructureAdvisorAutoProxyCreator 获取增强方法 获取所有增强中内适用于当前方 ...

  4. 为Study.BlazorOne引入Study.Trade模块

    # 1.在Application项目中添加Trade的对应的包 默认的源多半是nuget.org 我们自己的模块,一般在我们自己的NuGet服务器 从"已安装"切换到"浏 ...

  5. 【Azure 应用服务】应用服务连接 Azure MySQL 一直失败,报错 Create connection error

    问题描述 App Service上部署的Java应用,连接 Azure Database for MySQL 失败.错误信息:Create connection error, url: jdbc:my ...

  6. 【Azure 事件中心】如何查看事件中心的消息中具体报文内容呢?

    问题描述 如何查看事件中心的消息中具体报文内容呢? 问题解答 正常情况是通过 Event Hub 的消费端获取消息进行处理查看,但是没有客户端代码的情况下,也可以通过微软的默认客户端Service B ...

  7. Java abstract 关键字使用

    1 package com.bytezreo.abstractTest; 2 3 /** 4 * 5 * @Description Abstract 关键字使用 6 * @author Bytezer ...

  8. liunx 大文件切割,catalina.out 大文件打开

    工作中,由于没有没有配日志文件切割,不小心日志文件上G了,用tail -f   或 cat 命令都难打开了,但偏这时候出了点事,需要查日志 怎么呢.第一条件命令    tail -50000f  ca ...

  9. 使用 Docker 部署 File Browser 文件管理系统

    1)File Browser 介绍 官网:https://filebrowser.org/ GitHub:https://github.com/filebrowser/filebrowser 今天为大 ...

  10. 协议CAN&报文&仲裁

    简介 物理层 CAN 协议提供了 5 种帧格式来传输数据 数据链路层 中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)  显性0,隐性1 ...