Elasearch时间查询及分组统计
admin
2023-01-28 02:40:01
0
/**
 * 从ES中查询数据
 * ES的时间如果不设置的话,默认是UTC时间,与北京时间相差8个小时,在查询统计的时候,如果不做统计的话,数据肯定是不准确的。
 *  ES版本:6.4.1。使用的javaApi是 Elasearch High Level Rest Client6.4
 * @param monthDate (patten:yyyy-MM)
 * @return List 统计结果。
 */
public List queryOrderCountDataFromEs(String monthDate) {
    try {
        /**
         * 条件查询(时间范围)
         */
        String startTime = DateUtil.getMonthFirstDay(DateUtil.dateStr2Date(monthDate + "-01", DateUtil.PATTERN_DTSHORTLINE));
        String endTime = DateUtil.getMonthLastDay(DateUtil.dateStr2Date(monthDate + "-01", DateUtil.PATTERN_DTSHORTLINE));
        Date s = DateUtil.dateStr2Date(startTime + " 00:00:00", DateUtil.PATTERN_SIMPLE);
        Date e = DateUtil.dateStr2Date(endTime + " 23:59:59", DateUtil.PATTERN_SIMPLE);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.rangeQuery("order_time").gte(s).lte(e));
        searchSourceBuilder.query(boolQuery);
        /**
         * 分组聚合
         */
        TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("orderStatusCount").field("order_status");
        aggregationBuilder.size(ESConstants.ES_AGG_SIZE);
        aggregationBuilder.collectMode(Aggregator.SubAggCollectionMode.BREADTH_FIRST);
        DateHistogramAggregationBuilder field = AggregationBuilders.dateHistogram("orderTime").field("order_time");
        /*
         *时间统计的时候,注意时差问题。统计的时候,设置时区即可,不需要设置偏移量。
         *offset偏移量这个参数,在某些时刻也是有用的,它可以自己定义一天的开始,比如设置从第一天的3点到第二天的3点为一天,默认都是从0点开始0点结束算做一天的
         */
        field.dateHistogramInterval(DateHistogramInterval.DAY).timeZone(DateTimeZone.getDefault());//.offset("+8h");
        aggregationBuilder.subAggregation(field);
        searchSourceBuilder.aggregation(aggregationBuilder);
        SearchResponse response = client.searchDocument(ESConstants.ES_EC_ORDER_INDEX, ESConstants.ES_EC_ORDER_TYPE, searchSourceBuilder);
        //结果处理
        Terms byPath = response.getAggregations().get("orderStatusCount");
        List buckets = byPath.getBuckets();
        List resultVos = new ArrayList<>();
        for (Terms.Bucket bucket : buckets) {
            Histogram agg = bucket.getAggregations().get("orderTime");
            for (Histogram.Bucket entry : agg.getBuckets()) {
                SysCountResultVo sysCountVo = new SysCountResultVo();
                sysCountVo.setLocalPath(bucket.getKeyAsString());
                long t = ((DateTime)entry.getKey()).getMillis();
                Calendar cal = Calendar.getInstance();
                cal.setTimeInMillis(t);
                sysCountVo.setDimension(DateUtil.date2DateStr(cal.getTime(),DateUtil.PATTERN_SIMPLE));
                sysCountVo.setTimes(entry.getDocCount());
                resultVos.add(sysCountVo);
            }
        }
        return resultVos;
    } catch (Exception e) {
        logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>从ES中查询数据失败");
        e.printStackTrace();
        return null;
    }
}


相关内容

热门资讯

“外省结婚交1500元”的奇葩... 澎湃特约评论员 方圆红星新闻 图近日,云南临沧一村庄贴出的告示,被网友吐槽“太奇葩”。告示内容称:“...
【今日要闻】“乐乐四川麻将.到... 有 亲,根据资深记者爆料乐乐四川麻将是可以开挂的,确实有挂(咨询软件无需...
终于了解“新蜜瓜拼十.究竟有挂... 网上科普关于“新蜜瓜拼十有没有挂”话题很是火热,小编也是针对新蜜瓜拼十作*弊开挂的方法以及开挂对应的...
云南:将二孩、三孩育儿补助统一... 【大河财立方消息】12月17日,云南省政府印发《关于加快完善生育支持政策体系推动建设生育友好型社会的...
机构:脑机接口行业加速创新 来源:市场资讯 (来源:证券时报) 今天,中国科学院脑科学与智能技术卓越创新中心发布该中心与国内科研...
【第一财经】“新道游牛牛.可以... 有 亲,根据资深记者爆料新道游牛牛是可以开挂的,确实有挂(咨询软件无需打...
广东亚健康检测仪十大品牌排行:... 现代生活节奏加快,亚健康状态已成为都市人群的隐形困扰。在广东这片经济活跃的热土上,健康检测设备市场呈...
【第一资讯】“牛魔王牛牛.可以... 您好:牛魔王牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游...
今日重大通报“天府麻舍.辅助器... 网上科普关于“天府麻舍有没有挂”话题很是火热,小编也是针对天府麻舍作*弊开挂的方法以及开挂对应的知识...
玩家攻略科普“花城牌舍.开挂器... 您好:花城牌舍这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游戏...