如何在弹性搜索中按月分组



我正在使用弹性搜索版本 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
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新