Java Elasticsearch 按一定时间间隔(timeInterval)循环查询数据

news/2024/11/25 2:34:01/

最近有个需求,前端传入时间间隔,去elasticsearch按照时间间隔统计每个时间间隔内数据量。

public List<HashMap<String,Object>> getCount(@RequestParam Integer time, @RequestParam String selectedDatedTime) {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");format.setTimeZone(TimeZone.getTimeZone(ZoneId.of(DateUtil.TIMEZONE_ZONE_ID)));Date date = CommonUtil.getDateByString(selectedDatedTime);Calendar fromDate = Calendar.getInstance();fromDate.setTime(date);fromDate.add(Calendar.HOUR_OF_DAY, -time);Calendar toDate = Calendar.getInstance();toDate.setTime(date);RangeQueryBuilder timeRangeQuery = QueryBuilders.rangeQuery(ApplicationConstant.TIMESTAMP)// .timeZone("Asia/Singapore").gte(fromDate.getTimeInMillis()).lt(toDate.getTimeInMillis());String application = "";if (applications != null && applications.size() > 0){application = applications.get(0);}IndexCoordinates index = IndexCoordinates.of("xxxxxxx");DateHistogramInterval timeInterval = null;if(time==1){timeInterval= DateHistogramInterval.minutes(5);}else if(time==24 || time==6 ||time==12){timeInterval = DateHistogramInterval.hours(1);}else{timeInterval= DateHistogramInterval.hours(12);}Query sq = new NativeSearchQueryBuilder().withQuery(timeRangeQuery).addAggregation(AggregationBuilders.dateHistogram("date_histogram").field(TIMESTAMP_FIELD_NAME).fixedInterval(timeInterval).minDocCount(0).timeZone(ZoneId.of(DateUtil.TIMEZONE_ZONE_ID)).extendedBounds(new ExtendedBounds(fromDate.getTimeInMillis(), toDate.getTimeInMillis()))).withPageable(Pageable.unpaged()).build();return esservice.getCountApi(sq, index);}

这里面的 timeInterval 就是设定间隔时间。

加入 extendedBounds 目的就是防止出现0数据不会返回,例如我只有8am到12am内有数据,现在是12am,timeInterval是一小时,总共时间跨度是12小时。如果不设置extendedBounds的话,date_histogram查询出来的聚合只会有8am-9am,9am-10am,10am-11am,11am-12am这几个的聚合,不会有8am之前的聚合出现,照理来说,会出现12个聚合,不管有没有数据都有聚合返回,只不过某些聚合出来docCount是0而已。所以需要加上这个条件
因为前端ui需要进行展示,就算没有数据也需要展示。例如这个chart的前半段,虽然聚合出来没有数据,但是也需要展示0数据。

 

 

这边是处理数据的service

public List<HashMap<String, Object>> getCountApi(Query sq, IndexCoordinates esindex) {HashMap<String, Object> data = new HashMap<>();List<HashMap<String, Object>> list = new ArrayList<>();SearchHits<HashMap> result = template.search(sq, HashMap.class, esindex);Aggregations agg = result.getAggregations();if (agg != null) {ParsedDateHistogram histogram = agg.get("date_histogram");List<HashMap<String, Object>> innerlist = new ArrayList<>();for (Histogram.Bucket timebucket : histogram.getBuckets()) {HashMap<String, Object> tempMap = new HashMap<>();ZonedDateTime zdt = (ZonedDateTime) timebucket.getKey();DateTime dt = new DateTime(zdt.toEpochSecond() * 1000L, DateTimeZone.forID(DateUtil.TIMEZONE_ZONE_ID));// String dateStr = dt.toString("yyyy-MM-dd HH:mm:ss");tempMap.put("x", dt.getMillis());tempMap.put("y", timebucket.getDocCount());innerlist.add(tempMap);}data.put("data", innerlist);data.put("name", NAME_OF_TYPE);list.add(data);}return list;}

 


http://www.ppmy.cn/news/1219570.html

相关文章

JZ22:链表中倒数第k个结点

JZ22&#xff1a;链表中倒数第k个结点 题目描述&#xff1a; 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 示例1 输入&#xff1a; 1,{1,2,3,4,5} 返回值&#xff1a; {5} 分析&#xff1a; 快慢指针思想&#xff1a; 需要两个指针&#xff0c;快指针fast&…

前端设计模式之【外观模式】

文章目录 前言介绍兼容浏览器事件绑定封装接口场景优缺点后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端设计模式 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(…

table表格的某一行数据如何回填

目的&#xff1a;table表格的某一行数据的输入框按钮触发对话框&#xff0c;对话框选择的数据再回填到table表格的这一行中。 1.插槽中传递本行的index: v-slot"{ row, $index }" 2.点击事件或者change事件传递index: click"val > tpmClicked($index)"…

继承、多态

复习 需求&#xff1a; 编写一个抽象类&#xff1a;职员Employee,其中定义showSalary(int s)抽象方法&#xff1b;编写Employee的子类&#xff0c;分别是销售员Sales和经理Manager,分别在子类中实现对父类抽象方法的重写&#xff0c;并编写测试类Test查看输出结果 package cn.…

js 深度学习(六)

立即执行函数 immediate invoked function expression 自动执行 执行完成后立即释放 (function(){var a 1,b2;console.log(ab) }()) // w3c建议 (function(a,b){return ab; })(a,b); // 可以加参数 可以有返回值表达式才能被执行符号执行&#xff0c;被小括号包裹的是表达式…

Linux实战一天一个小指令--《文件管理/文件查找》

阿丹&#xff1a; 作为一个java程序员进行实战开发不接触linux操作系统基本上是不可能的&#xff0c;所以这个专题就出现了&#xff0c;本文章重点解决大家关于文件管理以及文件查找查看的疑惑。我将采用语法基础用法并在下面进行高级语法的总结使用&#xff0c;方便大家学习和…

自动备份pgsql数据库

bat文件中的内容&#xff1a; PATH D:\Program Files\PostgreSQL\13\bin;D:\Program Files\7-Zip set PGPASSWORD**** pg_dump -h 8.134.151.187 -p 5466 -U sky -d mip_db --schema-only -f D:\DB\backup\%TODAY%-schema-mip_db_ali.sql pg_dump -h 8.134.151.187 -p 5466…

react hook ts 实现 列表的滚动分页加载,多参数混合混合搜索

InfiniteScroll 的组件见&#xff1a; https://blog.csdn.net/Zhooson/article/details/134396945 search.tsx 页面 import { FC, useEffect, useState } from react import InfiniteScroll from ../../components/InfiniteScrollconst tabs [{id: 1,title: tab-1,index: 1…