假设我在文档上有一个日期字段,我知道使用date_histogram聚合我可以按日,月,年等方式获得文档计数.
我想要做的是获得几年,一月,二月,三月等的平均文件数.在几个星期内,周一,周二,周三等也是如此.有没有办法做这个只有相同的日期字段或使用Elasticsearch实现这一目标的最佳方法是什么?
例
假设我们在三年内有一堆订单:
> 2012年 – 1月(10个订单),2月(5个订单),3月(7个订单),4月(11个订单)等
> 2013年 – 1月(13个订单),2月(7个订单),3月(12个订单),4月(15个订单)等
> 2014年 – 1月(10个订单),2月(7个订单),3月(6个订单),4月(13个订单)等
我想要的是在给定年份的每个月的平均值,因此输出将是:
1月(10 13 10/3 = 11个订单),2月(6.33个订单),3月(8.33个订单),4月(13个订单)等
如果这可以推广N年(或N Januaries等)最好,以便我们搜索任何日期范围.
最佳答案 您可以像这样使用’monthOfYear’:
"aggregations": {
"timeslice": {
"histogram": {
"script": "doc['timestamp'].date.getMonthOfYear()",
"interval": 1,
"min_doc_count": 0,
"extended_bounds": {
"min": 1,
"max": 12
},
"order": {
"_key": "desc"
}
}
}
扩展边界将确保您获得每月的值(即使它为零).
如果您想要月份名称,您可以在自己的代码中执行此操作,或者执行此操作(结果是您将无法获得没有数据的月份的值):
"aggregations": {
"monthOfYear": {
"terms": {
"script": "doc['timestamp'].date.monthOfYear().getAsText()",
"order": {
"_term": "asc"
}
}
}
一旦你有了这个,你可以将你的统计数据聚合嵌套在这个中:
"aggregations: {
"monthOfYear": {
"terms": {
...
},
"aggregations": {
"stats": ...
}
}
}
这个问题现在很老了,但是,希望这有助于某人.