elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

基于elasticsearch Java API的多数据直方图聚合

基于elasticsearch Java API的多数据直方图聚合,java,elasticsearch,Java,elasticsearch,我将dateHistogram聚合与ElasticSearch Java API结合使用,它非常适合于简单的聚合,例如每小时/天/月/年的点击次数(想象一系列文档,其中日期直方图聚合是在“索引的_日期”字段上进行的) 但是,我可以通过一个查询,针对另一个字段进行多字段日期聚合吗? 就像Kibana对图表所做的那样 我希望实现的一个例子: 我有一系列文档,其中每个文档都是一个“事件”,它有自己的时间戳。这些文档有一系列字段,如“状态”、“版本”等 我可以根据日期直方图、时间戳字段和其他字段的所有值

我将dateHistogram聚合与ElasticSearch Java API结合使用,它非常适合于简单的聚合,例如每小时/天/月/年的点击次数(想象一系列文档,其中日期直方图聚合是在“索引的_日期”字段上进行的)

但是,我可以通过一个查询,针对另一个字段进行多字段日期聚合吗? 就像Kibana对图表所做的那样

我希望实现的一个例子:

我有一系列文档,其中每个文档都是一个“事件”,它有自己的时间戳。这些文档有一系列字段,如“状态”、“版本”等

我可以根据日期直方图、时间戳字段和其他字段的所有值进行聚合吗

以一小时为间隔的聚合结果示例:

H:12 地位-{ 在职人数:34 暂停:12 }

H:13 地位-{ 现行:10 }

编辑:

一些样本数据:

"doc1" - { timestamp: "2014-12-23 12:01", status: "ACTIVE", version: 1 }
"doc2" - { timestamp: "2014-12-23 12.15", status: "PAUSED", version: 1 }
"doc3" - { timestamp: "2014-12-23 13.55", status: "ACTIVE", version: 2 }
(and so on..)
我会在日期柱状图里面做一个分析

在下面的示例中,您可以看到针对每个不同状态类型返回的文档计数:

curl -XGET 'http://localhost:9200/myindex/mydata/_search?search_type=count&pretty' -d '
> {
>  "query" : {
>     "match_all" : { } 
>   },
>     "aggs" : {
>         "date_hist_agg" : {
>             "date_histogram" : {"field" : "timestamp", "interval" : "hour"},
>             "aggs" : {
>              "status_agg" : {
>                 "terms" : { "field" : "status" }
>             }
>           }
>        }     
>      }
> }'
{
  "took" : 213,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "date_hist_agg" : {
      "buckets" : [ {
        "key_as_string" : "2014-12-23T17:00:00.000Z",
        "key" : 1419354000000,
        "doc_count" : 2,
        "status_agg" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [ {
            "key" : "active",
            "doc_count" : 1
          }, {
            "key" : "paused",
            "doc_count" : 1
          } ]
        }
      }, {
        "key_as_string" : "2014-12-23T18:00:00.000Z",
        "key" : 1419357600000,
        "doc_count" : 1,
        "status_agg" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [ {
            "key" : "active",
            "doc_count" : 1
          } ]
        }
      } ]
    }
  }
}

使用上一个答案中使用的相同聚合名称,我将执行以下操作:

    public void yourSearch(String indexName, String typeName) {

        SearchResponse sr =  client.prepareSearch(indexName)
                .setTypes(typeName)
                .addAggregation(AggregationBuilders.dateHistogram("date_hist_agg")
                                .field("timestamp")
                                .interval(DateHistogram.Interval.hours((1)))
                                .minDocCount(0)
                        .subAggregation(AggregationBuilders.terms("status_agg").field("status")))
            .execute().actionGet();

        DateHistogram componentsAgg =  sr.getAggregations().get("date_hist_agg");
        for (DateHistogram.Bucket entry : componentsAgg.getBuckets()) {

            Terms statusAgg =  entry.getAggregations().get("status_agg");
            for (Terms.Bucket entry2 : statusAgg.getBuckets()) {
                String key = entry2.getKey();
                long cnt = entry2.getDocCount();

                // use the key,cnt

            }
        }
    }
}

只是为了确认你在寻找什么——你想要每小时一次的存储桶(日期直方图),每个存储桶都包含一些东西的计数?e、 g.具有“活动”或“暂停”的字段计数:真?如果你能在这个问题上加上一些数据,就更容易弄明白了。是的,这就是我要找的。我正在编辑这个问题以添加更多的数据示例;是否有可能通过Elasticsearch Java API实现这一点?只要您能够构建请求主体,这应该适用于任何客户端库。