【问题标题】:How to access Aggregations result with elasticSearch java api in SearchResponse?如何在 SearchResponse 中使用 elasticSearch java api 访问聚合结果?
【发布时间】: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 版本,可能还需要添加这个功能,但也没有找到关于这一点的信息。

【问题讨论】:

    标签: java elasticsearch buckets


    【解决方案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&lt;SignificantStringTerms.Bucket&gt; 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 2015-03-21
      • 2017-08-19
      相关资源
      最近更新 更多