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();
    }
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值