版权声明: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"
]
]