核心代码
java">SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
DateHistogramAggregationBuilder aggregationBuilder = AggregationBuilders
// 分组别名
.dateHistogram("dateDownStreamRequestTime")
// 查询字段
.field("downStreamRequestTime")
.calendarInterval(DateHistogramInterval.DAY)
.offset("-8h")
.minDocCount(0)
.order(BucketOrder.aggregation("_key", true));
sourceBuilder.aggregation(aggregationBuilder);
聚合查询示例
java">@Override
public RequestResult getDailyInvokeCount(InterfaceDTO interfaceDTO) throws Exception {
Date queryRequestLogStartTime = DateUtil.toDate(interfaceDTO.getQueryRequestLogStartTime(), "yyyy-MM-dd HH:mm:ss");
Date queryRequestLogEndTime = DateUtil.toDate(interfaceDTO.getQueryRequestLogEndTime(), "yyyy-MM-dd HH:mm:ss");
List<Date> betweenDates = DateUtil.getBetweenDates(queryRequestLogStartTime, queryRequestLogEndTime);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
if (interfaceDTO.getOrderId() != null) {
queryBuilder.must(QueryBuilders.termQuery("orderId", interfaceDTO.getOrderId()));
}
if (StringUtil.isNotEmpty(interfaceDTO.getPartnerId())) {
queryBuilder.must(QueryBuilders.termQuery("partnerId", interfaceDTO.getPartnerId().toLowerCase()));
}
if (interfaceDTO.getServiceId() != null) {
queryBuilder.must(QueryBuilders.termQuery("serviceId", interfaceDTO.getServiceId()));
}
if (StringUtil.isNotEmpty(interfaceDTO.getAppId())) {
queryBuilder.must(QueryBuilders.termQuery("appId", interfaceDTO.getAppId().toLowerCase()));
}
if (interfaceDTO.getId() != null) {
queryBuilder.must(QueryBuilders.termQuery("interfaceId", interfaceDTO.getId()));
}
queryBuilder.must(QueryBuilders.rangeQuery("downStreamRequestTime").from(queryRequestLogStartTime.getTime()).to(queryRequestLogEndTime.getTime()));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
DateHistogramAggregationBuilder aggregationBuilder = AggregationBuilders
.dateHistogram("dateDownStreamRequestTime")
.field("downStreamRequestTime")
.calendarInterval(DateHistogramInterval.DAY)
.offset("-8h")
.minDocCount(0)
.order(BucketOrder.aggregation("_key", true));
sourceBuilder.aggregation(aggregationBuilder);
sourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest(getEsIndices(betweenDates));
searchRequest.indicesOptions(IndicesOptions.fromOptions(true, true, true, false));
searchRequest.source(sourceBuilder);
List<Map<String, Object>> listMap = new ArrayList<>();
SearchResponse searchResponse = eslClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
if (aggregations == null) {
return RequestResult.success(interfaceInvokeEmptyData("day", "invokeCount", listMap));
}
Histogram histogram = searchResponse.getAggregations().get("dateDownStreamRequestTime");
for (Histogram.Bucket entry : histogram.getBuckets()) {
String key = entry.getKeyAsString();
String time = DateUtil.toString(new Date(Long.parseLong(key)), "yyyy-MM-dd");
Map<String, Object> map = new LinkedHashMap<>();
map.put("day", time);
map.put("invokeCount", entry.getDocCount());
listMap.add(map);
}
for (Date betweenDate : betweenDates) {
String tempDate = DateUtil.toString(betweenDate, "yyyy-MM-dd");
Map<String, Object> findMap = listMap.stream().filter(p -> p.get("day").equals(tempDate)).findAny().orElse(null);
if (findMap == null) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("day", tempDate);
map.put("invokeCount", 0);
listMap.add(map);
}
}
listMap.remove(listMap.size() - 1);
listMap = listMap .stream().sorted(Comparator.comparing(map -> map.get("day").toString(), Comparator.naturalOrder())).collect(Collectors.toList());
return RequestResult.success(listMap);
}