场景回顾:设备上传的数据保存在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. Error parsing HTTP request header--400 bad request

    问题描述: JSP中通过form post方式请求URL传入json格式参数报错: 信息: Error parsing HTTP request header  Note: further occur ...

  2. cronet 的简单学习

    官方的解释 "Cronet is the networking stack of Chromium put into a library for use on mobile. This is ...

  3. Hexo - 搭建个人博客的bug集合

    按照很多视频教程进行操作,发现到hexo d这一步后,无法部署到github远端. 目前的解决方法: npm un hexo-deployer-git npm i hexojs/hexo-deploy ...

  4. FileBeat简单使用

    简介 首先要了解ELK架构 这种结构因为需要在各个服务器上部署 Logstash,而它比较消耗 CPU 和内存资源,所以比较适合计算资源丰富的服务器,否则容易造成服务器性能下降,甚至可能导致无法正常工 ...

  5. Java 通过属性名称读取或者设置实体的属性值

    原因 项目实战中有这个需求,数据库中配置对应的实体和属性名称,在代码中通过属性名称获取实体的对应的属性值. 解决方案 工具类,下面这个工具是辅助获取属性值 import com.alibaba.fas ...

  6. SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448

    SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448 根据MES模赛思对其全球客户的问卷调查表明, 尽管有相当一部分的参与者(35%)认为SOTIF在功能安全 ...

  7. 影刀rpa:第二个项目学习心得

    教程有说到元素的关联操作,教程说自上而下的html路径,一时之间没弄清楚,索性就去看了下网页的html源码,才弄清楚到底是咋回事: 我是先选中了列表子元素的价格字段,选择两次以后就能选择到所有列表子元 ...

  8. .NET周刊【3月第1期 2024-03-03】

    国内文章 推荐10款C#开源好用的Windows软件 https://www.cnblogs.com/Can-daydayup/p/18035760 DevToys.Microsoft PowerTo ...

  9. config.baseUrl.dev 变量 转移到 .env.local 中

    config.baseUrl.dev 变量 转移到 .env.local 中 上下文 vue前端开发 问题 多人写代码的时候,会提交config.js里面的配置文件 解决方案 在根目录创建 .env. ...

  10. linux 前端 jenkins打包失败 permission 权限安装 root 安装nodejs,没有权限,另一个账号,需要chmod将文件权限打开

    linux 前端 jenkins打包失败 permission 权限安装 root 安装nodejs,没有权限,另一个账号,需要chmod将文件权限打开 开始以为nodejs版本问题 最后发现是安装n ...