使用Elasticsearch中的日期直方图来计算顺序活动

时间:2015-11-12 17:36:31

标签: elasticsearch date-histogram

我正在将Tomcat访问日志数据索引到Elasticsearch(1.7.3)中。 我处理的文件有持续时间的概念,表示为以毫秒为单位的结束时间和持续时间 (开始时间可以计算,但我可以存储它,如果它有助于解决我的问题)。 例如:

{
  ztime: "10-17-2015T04:05:00.000+02:00",
  duration: 4500,
  thred: "http-nio-8080-exec-14"
},
{
  ztime: "10-17-2015T04:07:42.227+02:00",
  duration: 3100,
  thred: "http-nio-8080-exec-25"
}

我的目标是生成一个直方图,我每秒都会显示有多少线程存在。

我想过使用date_histogram将我的文档聚合成1秒的桶。

GET /mindex/mtype/_search?search_type=count
{
  "aggs": {
      "threads_per_hr": {
        "date_histogram": {
          "field": "ztime",
          "interval": "1s",
          "min_doc_count": 1
        },
       "aggs": {
          "per_hr_threads": {
             "cardinality": {
                "field": "thread"
             }
          }
       }
      }
  }
}

然而,因此每个线程只会被bucketized一次。

我需要的是将每个文档分成几个桶。 例如,我需要将第一个文件文本化为04:05:00.000,04:05:01.000,04:05:02.000,04:05:03.000桶。

什么样的查询(Java API和/或REST API)可以帮助我实现这一目标?

1 个答案:

答案 0 :(得分:0)

您需要在此处使用cardinality聚合。它给出了该字段的唯一值的数量。

GET /{index}/{type}/_search?search_type=count
{
  "aggs": {
      "threads_per_hr": {
        "date_histogram": {
          "field": "ztime",
          "interval": "1s",
          "min_doc_count": 0
        },
       "aggs": {
          "per_hr_threads": {
             "cardinality": {
                "field": "thread"
             }
          }
       }
      }
  }
}