前言
最近接触elasticsearch 使用聚合功能遇到了些问题,今天总结记录一下记个笔记。需求大致是这样的要根据合作方及调用的接口分组展示出api调用图表折线图,可以根据年份月份天小时展示不同维度。由于之前调用记录已经存入es了,所以想从es统计出来。于是有了下面的辛酸历程,日志大概记录了以下信息
问题1 如何根据多个字段分组统计,经过查询资料发现,可以使用script方式拼接出一个字段
{
"size":0,
"query":{
"bool":{
"must":[
],
"should":[
{
"range":{
"call_date":{
"gte":"20211023",
"lte":"20211023",
"format":"yyyyMMdd||yyyyMM||yyyy"
}
}
}
],
"minimum_should_match":1
}
},
"aggs":{
"group":{
"terms":{
"script":"Date date = new Date(doc['call_date'].value.toInstant().toEpochMilli() );java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('HH');format.setTimeZone(TimeZone.getTimeZone('Asia/Jakarta'));doc['partner_code'].value+ '<->'+doc['api_code'].value+ '<->'+format.format(date)",
"shard_size":100
}
}
}
}
问题2 存在时区问题,es 默认存储date是utc时间。所以最后存储带时区日期,查询知道相应timeZone
问题3 分片统计不准确问题,shard_size可以提高精准度。只分一片就不存在这个问题,
另外聚合结果默认返回10条 需要指定size
活到老学到老,es聚合方面还是弱了一些。