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

最近有个需求,前端传入时间间隔,去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;
    }

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Karmada调度器

调度器就像一个发动机&#xff0c;如果没有了发动机输入动力&#xff0c;是无法正常运行的。就像 Kubernetes 的调度器&#xff0c;它会负责根据节点的资源状态、Pod 的运行状态&#xff0c;判断 Pod 是调度到怎样的集群节点上去。对于 Karmada 这样的多云能力的调度器来说&…

Webpack 性能优化 二次编译速度提升3倍!

本文作者为 360 奇舞团前端开发工程师 Rien. 本篇文章主要记录 webpack 的一次性能优化。 现状 随着业务复杂度的不断增加&#xff0c;项目也开始变得庞大&#xff0c;工程模块的体积也不断增加&#xff0c;webpack 编译的时间也会越来越久&#xff0c;我们现在的项目二次编译的…

【fbtft】如何添加fbtft驱动

获取lcd ic的datasheet&#xff0c;或者直接找到其他平台&#xff08;linux&#xff0c;stm32&#xff0c;esp32&#xff09;的驱动 我用的是合宙的esp32驱动&#xff0c;注意是c语言的&#xff0c;合宙上层用lua封装了&#xff0c;需要找到sdk源码。 源码路径&#xff1a; …

2021年09月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 如下图所示,小明想要做一个文字逐字出现的动画效果,他画出了程序的流程图,以下哪个程序可以实现? A: B: C: D: 答案&#

代号:408 —— 1000道精心打磨的计算机考研题

文章目录 &#x1f4cb;前言&#x1f3af;计算机科学与技术专业介绍&#xff08;14年发布&#xff09;&#x1f9e9;培养目标&#x1f9e9;毕业生应具备的知识和能力&#x1f9e9;主要课程 &#x1f3af;代号&#xff1a;408&#x1f525;文末送书&#x1f9e9;有什么优势&…

干货 | Elasticsearch 8.11 ES|QL 初体验

这里没有理论&#xff0c;只有验证后的结论和体验。 前提&#xff1a;这是 8.11 版本的新功能&#xff0c;必须提前安装最新 8.11 版本。 1、对比参考实现 1.1 DSL 原始语法 POST kibana_sample_data_ecommerce/_search 1.2 ES|QL 检索语法&#xff0c; 类似SQL实现 POST /_que…

2023亚太杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

机器学习—基本术语

目录 1.样本&#xff08;示例&#xff09; 2.属性 3.属性值 4.属性空间 5.样本空间 6.学习&#xff08;训练&#xff09; 7.数据集 8.测试 9.假设 10.学习器 11.标记 12.样例 13.标记空间&#xff08;样例空间&#xff09; 14.分类与回归 15.有监督学习、无监督…

GZ038 物联网应用开发赛题第5套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第5套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考评…

城市内涝对策,万宾科技内涝积水监测仪使用效果

随着城市化进程的加速&#xff0c;城市道路积水问题明显越来越多&#xff0c;给人们的出行和生活带来更多的不便。内涝积水监测仪作为高科技产品能够实时监测道路积水情况&#xff0c;为城市排水系统的管理和维护提供重要的帮助。 在城市生命线的基础设施规划之中&#xff0c;地…

Spring Cloud

1. 服务拆分和远程调用 任何分布式架构都离不开服务的拆分&#xff0c;微服务也一样。服务拆分&#xff1a;一个单体架构按照功能模块进行拆分&#xff0c;变成多个服务。 微服务需要根据业务模块拆分&#xff0c;做到单一职责&#xff0c;不要重复开发相同业务。 1.1 服务…

【论文阅读】(CGAN)Conditional Generative Adversarial Nets

论文地址&#xff1a;[1411.1784] Conditional Generative Adversarial Nets (arxiv.org) - 条件生成式对抗网络&#xff1b; 解读&#xff1a; 这篇论文中的Conditional GAN和原生GAN在结构上没有太大差别&#xff0c;时间也是紧随着原生GAN出来的&#xff0c;它的思想应该后…

理解Vue源码,从0开始撸了一个简版Vue

vue 的双向绑定、虚拟dom、diff算法等等面试常见问题你可能在几年前就学过了&#xff0c;其中有些人可能看过Vue的源码&#xff0c;了解过Vue是如何实现数据监听和数据绑定这些技术的。不过让从零开始实现一个 vue&#xff0c;你可以吗? 模板语法其实早就存在&#xff0c;在V…

03-学成在线内容管理模块之课程查询

课程查询 需求分析 教学机构人员点击课程管理按钮进入课程查询界面,在课程列表页面输入查询条件查询课程的信息 当不输入查询条件时默认会全部课程信息,输入查询条件会查询符合条件的课程信息,约束条件是本教学机构查询本机构的课程信息 数据模型(model工程) 课程查询功能…

MAT工具定位分析Java堆内存泄漏问题方法

原创/朱季谦 一、MAT概述与安装 MAT&#xff0c;全称Memory Analysis Tools&#xff0c;是一款分析Java堆内存的工具&#xff0c;可以快速定位到堆内泄漏问题。该工具提供了两种使用方式&#xff0c;一种是插件版&#xff0c;可以安装到Eclipse使用&#xff0c;另一种是独立版…

论文浅尝 | 用于开放式文本生成的事实增强语言模型

笔记整理&#xff1a;李煜&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2022/hash/df438caa36714f69277daa92d608dd63-Abstract-Conference.html 1. 动机 生成式语言模型&#xff08;例如 GPT-3…

【图论】最小生成树(python和cpp)

文章目录 一、声明二、简介三、代码C代码Python代码 一、声明 本帖持续更新中如有纰漏望指正&#xff01; 二、简介 &#xff08;a&#xff09;点云建立的k近邻图&#xff08;b&#xff09;k近邻图上建立的最小生成树 最小生成树 (Minimum Spanning Tree&#xff0c;简称 M…

使用Tauri开发桌面应用

本文是对视频 Tauri入门教程[1]的学习与记录 Tauri官网[2] 对 node版本有要求 创建项目及目录介绍: 项目的目录结构如下 可以安装推荐的插件 执行npm run tauri build出错,根据 https://github.com/tauri-apps/tauri/issues/7430 执行 yarn add -D tauri-apps/cli && y…

缺陷预测(一)——论文复现

运行CGCN文件 问题一&#xff1a;CNN输入维度的问题出现的问题解决问题原因 问题二&#xff1a;mix时&#xff0c;输入的train_in和train_gen.inputs数据格式不一致出现的问题解决问题 最终结果 问题一&#xff1a;CNN输入维度的问题 出现的问题 数据集改好之后&#xff0c;出…

Python Flask: 构建轻量级、灵活的Web应用

大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python Web开发框架 Flask&#xff0c;文章3400字&#xff0c;阅读大约15分钟&#xff0c;大家enjoy~~ Flask是一个流行的Python Web框架&#xff0c;以其轻量级、灵活和易学的特性受到开发者的喜爱。本文将深入探讨Flas…