ElasticSearch Java周-时聚合查询(周-时热点查询)

版权声明:https://blog.csdn.net/qq_18769269/article/details/82746259

需求:

       选定一段时间,统计该段时间内,星期一到星期天中每个小时中文章发布数量,做周-时热点统计,效果如下:

      

Date histogram时间聚合介绍:

        按时间聚合,想到了ES查询中的Date histogram,它在区间上支持了日期的表达式。

        支持的区间包括:按年月日时分秒等条件来聚合,并且可以指定反馈格式!

        具体介绍查看 https://blog.csdn.net/qq_18769269/article/details/80773020

思路:      

        虽然有了按时间区间聚合,但是没有周一到周天这样现成的返回,那么我可以按小时来间隔,格式设置为yyyy-MM-dd HH,

然后自己来判断和拼装,需求是:“星期一到星期天,零点到二十四点。”  于是乎,想到了二维数组。思路和技术点有了,直接上代码。

代码:

 该方法传入的是一个实体,里面封装了查询条件。

public Object countByWeekAndHour(BoolQueryRequest boolQueryRequest) {

        int [][] arrays=new int[7][24];
        String[][] result=new String[1][168];

        BoolQueryBuilder boolQuery = QueryBuilderUtils.getBoolQueryBuilder(boolQueryRequest);

        DateHistogramBuilder dateHistogramAggregationBuilder= AggregationBuilders.dateHistogram("dateBucket").field("pubTime");
        dateHistogramAggregationBuilder.interval(DateHistogramInterval.hours(1))  //以一小时为间隔
                .format("yyyy-MM-dd HH");

        SearchRequestBuilder searchRequestBuilder = esUtil.getSearchRequestBuilder(boolQueryRequest.getDate());
        SearchResponse response = searchRequestBuilder.setQuery(boolQuery).addAggregation(dateHistogramAggregationBuilder)
                .execute()
                .actionGet();

        Histogram histogram = response.getAggregations().get("dateBucket");

        for (Histogram.Bucket entry : histogram.getBuckets()) {
            String keyAsString = entry.getKeyAsString();
            String[] strings = keyAsString.split(" ");
            String stringHour = strings[1];    //获取小时
            int weekNumer = weekNumer(strings[0]); //获取到星期 0-6 周日到周六
            int count = (int) entry.getDocCount();  //获取数量
            arrays[weekNumer][Integer.parseInt(stringHour)]=arrays[weekNumer][Integer.parseInt(stringHour)]+count;
        }

        for (int i = 0,resultNumber=0; i < arrays.length; i++) { // 遍历二维数组
            for (int j = 0; j < arrays[0].length; j++) {
                String s=String.valueOf(i)+", "+String.valueOf(j)+", "+arrays[i][j]; //封装返回格式
                result[0][resultNumber]=s;
                //System.out.println(resultNumber+"......."+s);
                resultNumber++;
            }
        }
        return result;
    }


public int weekNumer(String strDate)  {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = formatter.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int weekNumer=c.get(Calendar.DAY_OF_WEEK);
        return weekNumer-1;  //星期日到星期六 (0-6)
    }

    

传入参数:

{
  "date": {
    "endDate": "2018-09-05",
    "startDate": "2018-07-24"
  },
  "keyword": {
    "mustNotWord": "北京天气"
  },
  "type":[
    "news","weibo","bbs","bar","wechat"
  ]
}

返回结果:

[
  [
    "0, 0, 414",
    "0, 1, 7",
    "0, 2, 35",
    "0, 3, 15",
    "0, 4, 5",
    "0, 5, 13",
    "0, 6, 12",
    "0, 7, 22",
    "0, 8, 21",
    "0, 9, 46",
    "0, 10, 13",
    "0, 11, 8",
    "0, 12, 5",
    "0, 13, 11",
    "0, 14, 10",
    "0, 15, 25",
    "0, 16, 119",
    "0, 17, 12",
    "0, 18, 19",
    "0, 19, 12",
    "0, 20, 13",
    "0, 21, 23",
    "0, 22, 23",
    "0, 23, 22",
    "1, 0, 663",
    "1, 1, 15",
    "1, 2, 18",
    "1, 3, 9",
    "1, 4, 4",
    "1, 5, 10",
    "1, 6, 14",
    "1, 7, 41",
    "1, 8, 52",
    "1, 9, 51",
    "1, 10, 48",
    "1, 11, 39",
    "1, 12, 20",
    "1, 13, 19",
    "1, 14, 28",
    "1, 15, 50",
    "1, 16, 177",
    "1, 17, 24",
    "1, 18, 19",
    "1, 19, 15",
    "1, 20, 27",
    "1, 21, 39",
    "1, 22, 40",
    "1, 23, 31",
    "2, 0, 647",
    "2, 1, 25",
    "2, 2, 31",
    "2, 3, 19",
    "2, 4, 16",
    "2, 5, 10",
    "2, 6, 27",
    "2, 7, 47",
    "2, 8, 90",
    "2, 9, 94",
    "2, 10, 41",
    "2, 11, 50",
    "2, 12, 31",
    "2, 13, 19",
    "2, 14, 31",
    "2, 15, 17",
    "2, 16, 225",
    "2, 17, 17",
    "2, 18, 8",
    "2, 19, 13",
    "2, 20, 15",
    "2, 21, 18",
    "2, 22, 13",
    "2, 23, 18",
    "3, 0, 824",
    "3, 1, 29",
    "3, 2, 30",
    "3, 3, 11",
    "3, 4, 7",
    "3, 5, 12",
    "3, 6, 23",
    "3, 7, 42",
    "3, 8, 83",
    "3, 9, 42",
    "3, 10, 25",
    "3, 11, 23",
    "3, 12, 16",
    "3, 13, 22",
    "3, 14, 34",
    "3, 15, 50",
    "3, 16, 198",
    "3, 17, 28",
    "3, 18, 9",
    "3, 19, 21",
    "3, 20, 22",
    "3, 21, 14",
    "3, 22, 9",
    "3, 23, 16",
    "4, 0, 798",
    "4, 1, 23",
    "4, 2, 26",
    "4, 3, 9",
    "4, 4, 7",
    "4, 5, 14",
    "4, 6, 27",
    "4, 7, 42",
    "4, 8, 38",
    "4, 9, 44",
    "4, 10, 56",
    "4, 11, 32",
    "4, 12, 19",
    "4, 13, 32",
    "4, 14, 29",
    "4, 15, 24",
    "4, 16, 116",
    "4, 17, 15",
    "4, 18, 14",
    "4, 19, 12",
    "4, 20, 18",
    "4, 21, 11",
    "4, 22, 5",
    "4, 23, 4",
    "5, 0, 458",
    "5, 1, 16",
    "5, 2, 12",
    "5, 3, 6",
    "5, 4, 1",
    "5, 5, 9",
    "5, 6, 14",
    "5, 7, 20",
    "5, 8, 30",
    "5, 9, 37",
    "5, 10, 34",
    "5, 11, 21",
    "5, 12, 18",
    "5, 13, 23",
    "5, 14, 17",
    "5, 15, 22",
    "5, 16, 114",
    "5, 17, 20",
    "5, 18, 18",
    "5, 19, 9",
    "5, 20, 7",
    "5, 21, 7",
    "5, 22, 5",
    "5, 23, 11",
    "6, 0, 377",
    "6, 1, 6",
    "6, 2, 13",
    "6, 3, 17",
    "6, 4, 5",
    "6, 5, 13",
    "6, 6, 19",
    "6, 7, 22",
    "6, 8, 18",
    "6, 9, 13",
    "6, 10, 11",
    "6, 11, 9",
    "6, 12, 12",
    "6, 13, 28",
    "6, 14, 17",
    "6, 15, 24",
    "6, 16, 134",
    "6, 17, 12",
    "6, 18, 19",
    "6, 19, 4",
    "6, 20, 10",
    "6, 21, 13",
    "6, 22, 17",
    "6, 23, 24"
  ]
]

猜你喜欢

转载自blog.csdn.net/qq_18769269/article/details/82746259