es 对Long类型时间分组 根据间隔分钟或者间隔天数统计数量

es 分组根据分钟和天统计数量

1.遇见的问题

  1. 使用间隔天数去分割的时候,时间多8小时

2.解决方案

aggregationBuilder = AggregationBuilders.dateHistogram("dateHistogram")//自定义名称.dateHistogramInterval(DateHistogramInterval.days(1))//设置间隔.minDocCount(0)//返回空桶.field("cjTimestamp")//指定时间字段.format("").extendedBounds(new ExtendedBounds(start, end))//设定范围.offset("-8h");//默认多8小时,需要减掉

3.完整代码

HashMap<String, Object> map = new HashMap<>(1);CommonExceptionEnum.NOT_NULL.assertNotEmpty(request);CommonExceptionEnum.NOT_NULL.assertNotEmpty(request.getPlatform());CommonExceptionEnum.NOT_NULL.assertNotEmpty(request.getType());if ("2".equals(request.getPlatform())) {Long deptId = SecurityUtils.getDeptId();if (ObjectUtil.isEmpty(deptId)) {return RequestResult.success(map);}request.setDeptId(deptId.intValue());}Long start = System.currentTimeMillis();SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DateUtils.YYYY_MM_DD);//日if (request.getType().equals(1)) {simpleDateFormat = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS);start = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()).getTime();}//周if (request.getType().equals(2)) {start = getTimesWeekmorning().getTime();}//月if (request.getType().equals(3)) {start = getTimesMonthmorning().getTime();}String substring = start.toString().substring(0,start.toString().length() - 5);start = (Long.parseLong(substring) * 100000L);SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();long end = System.currentTimeMillis();boolQueryBuilder.must(QueryBuilders.rangeQuery("cjTimestamp").gte(start).lte(end));if (ObjectUtil.isNotEmpty(request.getDeptId())) {boolQueryBuilder.must(QueryBuilders.termQuery("devicesInfo.deptId", request.getDeptId()));}//dateHistogram  间隔是天的话 差距8小时,需要减去8小时AggregationBuilder aggregationBuilder = null;if (!request.getType().equals(1)) {aggregationBuilder = AggregationBuilders.dateHistogram("dateHistogram")//自定义名称.dateHistogramInterval(getDateHistogramInterval(request.getType()))//设置间隔.minDocCount(0)//返回空桶.field("cjTimestamp")//指定时间字段.format("").extendedBounds(new ExtendedBounds(start, end))//设定范围.offset("-8h");} else {aggregationBuilder = AggregationBuilders.dateHistogram("dateHistogram")//自定义名称.dateHistogramInterval(getDateHistogramInterval(request.getType()))//设置间隔.minDocCount(0)//返回空桶.field("cjTimestamp")//指定时间字段.format("").extendedBounds(new ExtendedBounds(start, end));//设定范围}searchSourceBuilder.query(boolQueryBuilder).aggregation(aggregationBuilder).size(0);SearchRequest searchRequest = new SearchRequest();searchRequest.source(searchSourceBuilder);searchRequest.indices("standard_device_data");SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);Aggregation agg = searchResponse.getAggregations().get("dateHistogram");List<? extends Histogram.Bucket> buckets = ((Histogram) agg).getBuckets();List<CollectDataResponse> list = new ArrayList<>();for (Histogram.Bucket bucket : buckets) {CollectDataResponse collectDataResponse = new CollectDataResponse();long time = Long.parseLong(bucket.getKeyAsString().replace(",", ""));if (time >= start) {String dateString = simpleDateFormat.format(time);collectDataResponse.setDate(dateString);collectDataResponse.setNum(bucket.getDocCount());list.add(collectDataResponse);}}map.put("allNum", list);private DateHistogramInterval getDateHistogramInterval(Integer dateType) {if (dateType.equals(1)) {return DateHistogramInterval.minutes(15);//统计一个小时内数据,每隔10分钟一个显示}//周if (dateType.equals(2)) {return DateHistogramInterval.days(1);}//月if (dateType.equals(3)) {return DateHistogramInterval.days(1);}return DateHistogramInterval.days(1);}// 获得本周一0点时间public static Date getTimesWeekmorning() {Calendar cal = Calendar.getInstance();cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);return cal.getTime();}// 获得本月第一天0点时间public static Date getTimesMonthmorning() {Calendar cal = Calendar.getInstance();cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));return cal.getTime();}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部