es 分组根据分钟和天统计数量
1.遇见的问题
- 使用间隔天数去分割的时候,时间多8小时
2.解决方案
aggregationBuilder = AggregationBuilders
.dateHistogram("dateHistogram")
.dateHistogramInterval(DateHistogramInterval.days(1))
.minDocCount(0)
.field("cjTimestamp")
.format("")
.extendedBounds(new ExtendedBounds(start, end))
.offset("-8h");
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()));
}
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);
}
if (dateType.equals(2)) {
return DateHistogramInterval.days(1);
}
if (dateType.equals(3)) {
return DateHistogramInterval.days(1);
}
return DateHistogramInterval.days(1);
}
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();
}
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();
}