1

我需要每 30 天(而不是一个月)汇总一次数据,所以我使用date_histogramwith"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。这似乎可行,但在代码审查中很难证明这种逻辑的合理性。有更好的解决方案吗?

4

1 回答 1

0

这是您问题中答案的 Python 实现(您真的值得赞成,它很聪明,对我有帮助):

fixed_interval_days = 90

# offset needed to make fixed_interval histogram end on today's date (it starts the intervals at 1970-01-01)
offset_days = (datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).days % fixed_interval_days

...
    A(
        "date_histogram",
        fixed_interval=f"{fixed_interval_days}d",
        offset=f"{offset_days}d",
于 2021-10-27T00:19:43.797 回答