【问题标题】:"Day Of Month" aggregation“Day Of Month”聚合
【发布时间】:2019-04-25 02:09:30
【问题描述】:

我一直在尝试获取“月中日”的 Elasticsearch 日期直方图聚合(存储桶必须从 1 到 31)。

例如,假设我的索引由以下组成:

LAST_MODIFIED_DATE
-------------------
2015-02-01 11:29
2015-03-01 11:41
2015-07-15 12:45
2015-05-15 12:47

我希望能够按“月中的一天”聚合它,这样聚合的结果集将是:

Day in Month   |   Count    
01             |   2
15             |   2

我宁愿得到:

Day in Month   |   Count    
01             |   1
01             |   1
15             |   1
15             |   1

我假设这是每天汇总的,而不是此处功能所需的“月中的一天”。

有人知道如何使用日期直方图方法来实现它吗?

由于这里的应用程序需要所有日期维度的时区支持,这似乎是最好的方法。

【问题讨论】:

  • 为什么不直接使用"interval" : "day"
  • "Day" 将返回几个数字“01”、“02”(一直到“31”)。他们每个人都一遍又一遍地重复,而不是汇总结果集。
  • 你能给出一个你想要得到的响应示例吗?
  • 当然!我会用它更新我的问题。

标签: elasticsearch


【解决方案1】:

你有两个解决方案

  1. 您在索引时添加另一个字段 dayOfMonth 并在该字段上进行聚合
  2. 您使用一点script 来提取月份中的某天并对其进行汇总(注意:您需要enable dynamic scripting

第一个解决方案是首选解决方案,因为它会更高效。

第二种解决方案如下所示:

{
  "size": 0,
  "aggs": {
    "day_in_month": {
      "histogram": {
        "script": "doc.LAST_MODIFIED_DATE.date.getDayOfMonth()",
        "interval": 1,
        "order": {
          "_key": "desc"
        }
      }
    }
  }
}

更新

date_histogram aggregation 支持时区

{
  "size": 0,
  "aggs": {
    "day_in_month": {
      "date_histogram": {
        "field": "LAST_MODIFIED_DATE",
        "interval": "day",
        "time_zone": "+02:00",
        "format": "dd",
        "order": {
          "_key": "desc"
        }
      }
    }
  }
}

【讨论】:

  • 嗨,瓦尔。感谢您的回复。我们使用 1 号方法。这两种方法的问题是不支持时区功能......
  • 使用方法一,您需要在索引dayOfMonth 时应用时区信息。使用方法 2,还可以在脚本中包含时区逻辑。也许如果你再解释一下你的时区限制是什么,我们可以弄清楚。
  • 嗨 Val,我不能选择第一种方法,因为我有太多的日期字段和所有时区要查询。第二个是我也在尝试的。我刚刚详细说明了自己的问题中发生了什么。再次感谢您的帮助。
猜你喜欢
  • 2021-03-30
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
相关资源
最近更新 更多