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

news/2024/7/24 11:43:34 标签: java, elasticsearch, 开发语言

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

java">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

java">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.niftyadmin.cn/n/5179708.html

相关文章

go-bindata - embed结合嵌入静态文件打包可执行二进制文件

## embed 嵌入静态文件到可执行二进制文件 # 安装go-bindata go get -u github.com/jteeuwen/go-bindata/... # 打包静态文件 go-bindata web/... 执行次命令之后会在项目目录下生成bindata.go文件,示例命令中模板文件都在项目的web目录下 # 使用embed注册模板示例文档 http…

Qt 自定义event

本文章从属于 Qt实验室-CSDN博客系列 自定义事件携带数据 在某些情况下&#xff0c;可能需要通过事件携带一些额外的数据 可以通过自定义事件类来完成 一种实现方法是自定义一个QObject的子类&#xff0c;通过property来携带数据 class MyEvent : public QObject,public …

第五章ARM处理器的嵌入式硬件系统设计——课后习题

1ARM处理器的工作状态 ARM处理器有两种工作状态。具体而言&#xff0c;ARM处理器执行32位ARM指令集时&#xff0c;工作在ARM状态&#xff0c;当ARM处理器执行16位thumb指令集时候&#xff0c;工作在thumb状态。 1ARM指令特点 1一个大的&#xff0c;统一的寄存器文件。 2基于…

混合开发(Android原生与H5交互) 说明文档

前言 目前&#xff0c;比如微信、QQ、淘宝、京东、知乎、各大银行App等大量软件都内嵌了部分H5。Android与H5&#xff08;JS&#xff09;互调可以让我们实现混合开发。混合开发就是在一个APP中内嵌一个轻量级的浏览器&#xff0c;一部分原生的功能改为Html5来开发。 拿微信举例…

间歇性工作的时钟波形对行sdc约束怎么写

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 如下图&#xff0c;紫色部分波形间歇式工作&#xff0c;如果要写约束应该怎么写&#xff1f; 答&#xff1a;按照最小周期写即可&#xff0c;只看active的部分&#xff0c;至于…

每个程序员都在找的免费API接口

免费好用的api接口&#xff0c;含免费次数&#xff1a; IP归属地-IPv6区县级&#xff1a;根据IP地址&#xff08;IPv6版本&#xff09;查询归属地信息&#xff0c;包含国家、省、市、区县和运营商等信息。IP归属地-IPv6城市级&#xff1a;根据IP地址&#xff08;IPv6版本&…

ESP32/ESP8266基于Arduino框架下驱动1.8“tft_oled屏幕仿数码管时钟

ESP32/ESP8266基于Arduino框架下驱动1.8"tft_oled屏幕仿数码管时钟 &#x1f4cd;相关篇《ESP32基于Arduino框架下U8g2驱动I2C OLED 时间显示》&#x1f4fa;效果演示&#xff1a; &#x1f33f;屏幕显示部分&#xff0c;采用使用TFT_eSPI库驱动&#xff0c;利用该库自带的…

华为层层“能力外溢”,让数智世界一触即达——选择华为,让您的企业轻松数智化

作者 | 曾响铃 文 | 响铃说 7万多人现场观赛&#xff0c;手机信号不掉链子&#xff0c;能发图片视频、能分享朋友圈&#xff1b; 消防、闸机等多个安防系统联动&#xff0c;风险事件自动报告&#xff0c;观赛、办赛安心&#xff1b; 运营数据全面打通、实时更新&#xff0c…