Elasticsearch - 按星期和小时分组

时间:2014-09-26 12:58:25

标签: elasticsearch aggregation

我需要按周和小时分组获取一些数据,例如

curl -XGET http://localhost:9200/testing/hello/_search?pretty=true -d '
{
        "size": 0,
        "aggs": {
          "articles_over_time" : {
            "date_histogram" : {
                "field" : "date",
                "interval" : "hour",
                "format": "E - k"
            }
          }
        }
}
'

给我这个:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2857,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "articles_over_time" : {
      "buckets" : [ {
        "key_as_string" : "Fri - 17",
        "key" : 1391792400000,
        "doc_count" : 6
      },
     ...
      {
        "key_as_string" : "Wed - 22",
        "key" : 1411596000000,
        "doc_count" : 1
      }, {
        "key_as_string" : "Wed - 22",
        "key" : 1411632000000,
        "doc_count" : 1
      } ]
    }
  }
}

现在我需要通过这个值总结文档计数"周三 - 22",我该怎么做? 也许是另一种方法?

3 个答案:

答案 0 :(得分:1)

this thread已经解决了同样的问题。

根据您的问题调整解决方案,我们需要制作一个脚本,将日期转换为一天中的小时和一周中的某一天:

Date date = new Date(doc['date'].value) ; 
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH');
format.format(date)

并在查询中使用它:

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

答案 1 :(得分:0)

您可以尝试使用子聚合从聚合结果中对“key_as_string”字段进行术语聚合。

希望有所帮助。

答案 2 :(得分:0)

这是因为您使用的是“小时”的间隔,但是,日期格式为“天”(E - k)。

将您的间隔更改为“天”,并且您将不再为“Weds - 22”获得单独的存储分区。

或者,如果您确实需要每小时,则更改格式以包含小时字段。