我使用dateHistogram聚合与ElasticSearch Java API,它适用于简单的聚合,例如每小时/每天/每月/每年的点击次数(想象一系列文档,其中日期直方图聚合在" indexed_date'字段中进行。
但是,对于另一个字段,我可以使用单个查询进行多字段日期聚合吗? 像Kibana为图表做的事情。
我想要实现的一个例子:
我有一系列文件,其中每一个都是"事件",它有时间戳。这些文档有一系列字段,如" status"," version"等。
我可以根据日期直方图,时间戳字段和其他字段的所有值获得聚合吗?
一小时间隔聚合的示例结果:
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..)
答案 0 :(得分:3)
我会在日期直方图中做term aggregation。
在下面的示例中,您可以看到为每种不同的状态类型返回的文档计数:
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
} ]
}
} ]
}
}
}
答案 1 :(得分:0)
使用上一个答案中使用的相同聚合名称,我会执行以下操作:
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
}
}
}
}