RestHighLevelClient————date_histogram(es自带聚合) 根据年月日做统计

只写了后台,前端请求带上dateType给后台,后端返回封装了json字符串的map

GsonUtil.getJsonStringByObject()是封装的Gson.toJson的方法

前端接受解析结果 并设置echatrs参数 即可完成图表绘制

/**
 * 消息趋势统计 dateType由前端传递 包括年月周
 * 按年则统计过去12个月
 * 按月则统计过去30天
 * 按周则统计过去7天
**/
public Map<String, String> msgTrendCount(String dateType) {
    //每个索引的时间field name 可能不同 根据索引设置
	String rangeField = "messageSendTime";
    //索引名
	String index = EsIndexName.TG_MESSAGE.getIndexName();
	return dateHistogram(rangeField, dateType, index);
}
 
 
 
 
private Map<String, String> dateHistogram(String rangeField, String dateType, String... indices) {
	Map<String, String> map = new HashMap<>(4);
	try {
 
		LocalDateTime now = LocalDateTime.now();
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
		String from;
		//extended bounds参数
		String boundsStart;
		String boundsEnd;
		String to = formatter.format(now);
		String format = "yyyy-MM-dd";
		//bounds的格式化类型需要和format相同
		DateTimeFormatter boundsFormatter = DateTimeFormatter.ofPattern(format);
		//间隔 年类型较为特殊
		DateHistogramInterval interval = DateHistogramInterval.DAY;
		switch (dateType) {
			case "week": {
				from = formatter.format(now.minusDays(6));
				boundsStart = boundsFormatter.format(now.minusDays(6));
				boundsEnd = boundsFormatter.format(now);
				break;
			}
			case "year": {
				from = formatter.format(now.minusMonths(11));
				format = "yyyy-MM";
				boundsFormatter = DateTimeFormatter.ofPattern(format);
				interval = DateHistogramInterval.MONTH;
				boundsStart = boundsFormatter.format(now.minusMonths(11));
				boundsEnd = boundsFormatter.format(now);
				break;
			}
			case "month":
			default: {
				from = formatter.format(now.minusDays(29));
				boundsStart = boundsFormatter.format(now.minusDays(29));
				boundsEnd = boundsFormatter.format(now);
				break;
			}
		}
 
		//范围查询
		BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
		boolQueryBuilder.must(QueryBuilders.rangeQuery(rangeField).from(from).to(to));
		//dateHistogram
		AggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram("dateHistogram")//自定义名称
				.dateHistogramInterval(interval)//设置间隔
				.minDocCount(0)//返回空桶
				.field(rangeField)//指定时间字段
				.format(format)//设定返回格式
				.extendedBounds(new ExtendedBounds(boundsStart, boundsEnd));//设定范围
 
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		//指定size为0 不返回文档 因为只需要数量
		searchSourceBuilder.query(boolQueryBuilder).aggregation(aggregationBuilder).size(0);
 
		SearchRequest searchRequest = new SearchRequest();
		searchRequest.source(searchSourceBuilder);
		searchRequest.indices(indices);
		SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
		Aggregation agg = searchResponse.getAggregations().get("dateHistogram");
 
		List<? extends Histogram.Bucket> buckets = ((Histogram) agg).getBuckets();
		List<String> dateList = new ArrayList<>(30);
		List<String> countList = new ArrayList<>(30);
		for (Histogram.Bucket bucket : buckets) {
			// maybe:如果不是年 则将key中的年份去掉
			dateList.add(bucket.getKeyAsString());
			countList.add(String.valueOf(bucket.getDocCount()));
		}
		map.put("chartTime", GsonUtil.getJsonStringByObject(dateList));
		map.put("chartCount", GsonUtil.getJsonStringByObject(countList));
	} catch (Exception e) {
		log.error("统计日期直方图出错:" + e.getMessage());
	}
	return map;
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Date Histogram是一个在Elasticsearch中使用的聚合方法,用于按照时间间隔对日期进行分组和计数。它类似于Histogram,但是支持日期表达式作为区间。 Date Histogram的用法相对于Histogram来说更加灵活,可以根据指定的日期表达式来对时间进行分组。例如,你可以将间隔(interval)指定为一个月,它会智能地知道2月比12月要短,并且还能根据时区进行定制,以便根据用户的时区来生成图形,而不是根据服务器的时区。 通常的Histogram桶也可以处理日期,但是它不具备自动识别日期并根据日期的特性进行处理的能力。而Date Histogram可以根据指定的时间间隔自动识别日期,并且能够合理地处理时区,这样就可以根据客户端的时区来进行图表的定制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [date_histogram](https://blog.csdn.net/opera95/article/details/78614244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [[Elasticsearch] 聚合 - 时间数据处理(Looking at Time)](https://blog.csdn.net/dm_vincent/article/details/42594043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值