实现思路
- 确定时间范围:获取当前时间,并计算30天前的时间,以此确定要查询的订单时间范围。
- 聚合分析:使用Elasticsearch的日期直方图(date histogram)进行按周聚合,在聚合内对订单金额进行求和。
- 处理跨年:日期直方图会自动处理跨年等情况,按周划分时会根据实际的日期进行准确切割。
ElasticSearch DSL代码
{
"query": {
"range": {
"order_create_time": {
"gte": "now-30d/d",
"lt": "now/d"
}
}
},
"aggs": {
"weekly_order_amount": {
"date_histogram": {
"field": "order_create_time",
"calendar_interval": "week",
"format": "yyyy - w"
},
"aggs": {
"total_amount": {
"sum": {
"field": "order_amount"
}
}
}
}
}
}
日期数学格式说明
- now-30d/d:
now
代表当前时间,now-30d
表示30天前的时间,/d
是日期舍入操作,将时间舍入到当天的开始(即凌晨0点),确保准确获取过去30天内的订单数据。
- now/d:将当前时间舍入到当天的开始,用于确定查询范围的上限。
- "format": "yyyy - w":设置日期直方图返回结果的格式,
yyyy
表示4位年份,w
表示一年中的第几周,这样可以清晰标识每周的聚合结果,即使跨年也能准确区分不同周的数据。