如何在 SearchResponse 中使用 elasticSearch java api 访问聚合结果?
Posted
技术标签:
【中文标题】如何在 SearchResponse 中使用 elasticSearch java api 访问聚合结果?【英文标题】:How to access Aggregations result with elasticSearch java api in SearchResponse? 【发布时间】:2014-01-27 21:38:42 【问题描述】:有没有办法使用 java API 在搜索响应中检索聚合的存储桶?
"took" : 185,
"timed_out" : false,
"_shards" :
"total" : 5,
"successful" : 5,
"failed" : 0
,
"hits" :
"total" : 200,
"max_score" : 1.0,
"hits" : [...]
,
"aggregations" :
"agg1" :
"buckets" : [...]
,
"agg2" :
"buckets" : [...]
目前,可以获取聚合,但我不知道如何获取存储桶。
当前的 1.0 版本的 ElasticSearch (v1.0.0.Beta2) 仍然是 beta 版本,可能还需要添加这个功能,但也没有找到关于这一点的信息。
【问题讨论】:
【参考方案1】:看着ES source on Github,我在他们的测试中看到了以下内容:
SearchResponse response = client().prepareSearch("idx").setTypes("type")
.setQuery(matchAllQuery())
.addAggregation(terms("keys").field("key").size(3).order(Terms.Order.count(false)))
.execute().actionGet();
Terms terms = response.getAggregations().get("keys");
Collection<Terms.Bucket> buckets = terms.getBuckets();
assertThat(buckets.size(), equalTo(3));
【讨论】:
太棒了!这正是我一直在寻找的缺失的“链接”,我希望 API 或参考中能有一些东西来解释这部分。 我认为你现在必须使用terms.getBuckets()
而不是terms.buckets()
。
这个答案如何正确? Terms.Bucket 受包保护,无法访问。
我看到了 Terms.Bucket 不受包保护;但是, DateHistogram.Bucket 是。要获取 DateHistogram 存储桶,您必须使用: Collection buckets = dateHistogram.getBuckets();这让我感到困惑。
如果您正在尝试获取重要字符串术语聚合的桶:Collection<SignificantStringTerms.Bucket> buckets = ((SignificantStringTerms) response.getAggregations().get("keys")).getBuckets();
【参考方案2】:
如果有人想知道如何访问这些存储桶中的实际文档,那么下面的代码可能会有所帮助。
Terms terms = response.getAggregations().get("agg1");
Collection<Terms.Bucket> buckets = terms.getBuckets();
for (Bucket bucket : buckets)
System.out.println(bucket.getKeyAsText() +" ("+bucket.getDocCount()+")");
【讨论】:
注意bucket可以有子bucket【参考方案3】:如果有人正在寻找 sum
聚合,只需将结果分配给 org.elasticsearch.search.aggregations.metrics.sum.Sum
变量即可:
ElasticConnector connector = ... // initialize ES connector
SearchResponde response = connector.getClient()
.prepareSearch(...)
.setQuery(...)
.addAggregation(AggregationBuilders.sum("my_sum").field(...))
.get();
Sum sum = response.getAggregations().get("my_sum");
double result = sum.getValue();
【讨论】:
以上是关于如何在 SearchResponse 中使用 elasticSearch java api 访问聚合结果?的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch 可以流式传输 SearchResponse 吗?
如何在表格中添加图片(使用el-table、el-table-column),即在Vue.js中使用ui-element?
如何在 Facelets 的 EL 布尔表达式中使用 &&?
如何在 Telerik Grid 中为 ASP.NET MVC 绑定图像
在vue中使用elementUI饿了么框架使用el-tabs,切换Tab如何实现实时加载,以及el-table表格使用总结