如何在elasticsearch中按小时分组文档?

时间:2016-02-01 12:14:04

标签: elasticsearch

我的文档在不同时间编入索引。现在我需要按照每小时的时间对这些文档进行分组。聚合后的桶应该显示从00到23的范围。在elasticsearch中这种排序是否可行?

3 个答案:

答案 0 :(得分:3)

使用date_histogram并将format设为"k"

{
"aggs": {
  "Group By Date": {
     "date_histogram": {
        "field": "dateCreated",
        "interval": "hour",
        "format" : "k"

        }
     }
  }
}

答案 1 :(得分:0)

如果您希望按小时对文档进行分组,而不考虑年份,日期,毫秒,则可能需要使用以下聚合:

{
    "aggs": {
        "perHour": {
            "terms": {
            "script": "Date date = new Date(doc['dateCreated'].value) ;java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('HH');format.format(date)"
            }
        }
    }
}

HH 意味着我们想获得一天的时间。您将获得24个桶,每个桶对应一个小时。如this answer中所述,这也适用于星期几的统计数据。

如果您希望每天都有小时数,请使用 date_histogram 解决方案:

{
"aggs": {
  "Group By Date": {
     "date_histogram": {
        "field": "dateCreated",
        "interval": "hour",
        "format" : "k"
        }
     }
  }
}

答案 2 :(得分:0)

可能迟到了派对,但使用Elasticsearch不能直接进行这种聚合。但有几种解决方法:

  1. 您可以在编制索引时将小时字段存储为单独的字段。
  2. 您可以使用Elasticsearch提供的直方图,并将结果合并到应用程序代码中。
  3. 您可以使用@Heschoon建议的脚本。 (如果这是生产中的一个问题,您可能已禁用内联脚本,因此您无法在查询中直接执行此操作。相反,您将需要添加脚本)