我需要每 30 天(而不是一个月)汇总一次数据,所以我使用date_histogram
with"fixed_interval": "30d"
来获取该数据。例如,如果用户想要最近 90 天的聚合,则应该有 3 个桶:[90-60, 60-30, 30-0]。以今天的日期(2021 年 3 月 18 日)为例,我想要桶 [12 月 18 日、1 月 17 日、2 月 16 日]。
但是,我实际得到的是 [4-Dec,3-Jan,2-Feb,4-Mar]。第一个存储桶比任何可用数据都更早开始,这也意味着最终需要比预期更多的存储桶。
我发现您无法轻易判断您的存储桶何时开始(例如,我希望我的第一个存储桶在今天 - 90 天开始)。根据我能找到的内容(例如this),buckets 似乎从 1970-01-01 开始,并且文档也有点说这个(这个链接,虽然它没有深入影响影响)。
考虑到这一点,我发现我可以使用offset
“有趣的公式”,以便获得所需的正确存储桶。例如:
GET /my_index/_search?filter_path=aggregations
{
"size": 0,
"query": {
"bool": {
"must": [
{ "range" : {
"@timestamp" : {
"gte" : "TODAY - 90/60/30",
"lt" : "TODAY"
}}
}
]
}
},
"aggs": {
"discussion_interactions_chart": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "30d",
"format": "yyyy-MM-dd",
"offset": "(DAYS(@timestamp.gte, 1970-01-01) % 30)d"
}
}
}
}
(显然这个查询不能直接工作,我在代码中构建变量,例如18-Mar-2021
偏移量是14
)
所以基本上offset
计算为我的下限日期和纪元之间的天数,然后将该值修改为 30。这似乎可行,但在代码审查中很难证明这种逻辑的合理性。有更好的解决方案吗?