我正在使用弹性搜索版本 6.0.0 对于按月分组,我正在使用日期直方图聚合。 我尝试过的例子:
{
"from":0,
"size":2000,
"_source":{
"includes":[
"cost",
"date"
],
"excludes":[
],
"aggregations":{
"date_hist_agg":{
"date_histogram":{
"field":"date",
"interval":"month",
"format":"M",
"order":{
"_key":"asc"
},
"min_doc_count":1
},
"aggregations":{
"cost":{
"sum":{
"field":"cost"
}
}
}
}
}
}
}
结果我多次得到 1(1 月/1 月(。 因为我有1月-2016,1月-2017,1月-2018的数据,所以将返回3次1月。但我只想要一月一次,其中包含一月的所有年份的总和。
您可以使用terms
聚合和从日期中提取月份的脚本,而不是使用date_histogram
聚合。
{
"from": 0,
"size": 2000,
"_source": {"includes": ["cost","date"],"excludes"[]},
"aggregations": {
"date_hist_agg": {
"terms": {
"script": "doc['date'].date.monthOfYear",
"order": {
"_key": "asc"
},
"min_doc_count": 1
},
"aggregations": {
"cost": {
"sum": {
"field": "cost"
}
}
}
}
}
}
请注意,使用脚本不是最佳选择,如果您知道需要月份信息,只需使用该信息创建另一个字段,以便您可以在其上使用简单的术语聚合,而无需使用脚本。
我们可以使用具有month
值的calendar_interval
:
文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html#calendar_interval_examples
GET my_index/_search
{
"size": 0,
"query": {},
"aggs": {
"over_time": {
"date_histogram": {
"field": "yourDateAttribute",
"calendar_interval": "month",
"format": "yyyy-MM" // <--- control the output format
}
}
}
}