如何使用Java高级REST客户端Elasticsearch获取嵌套的聚合桶 [英] How to get nested aggregations buckets using java high level REST client Elasticsearch

查看:82
本文介绍了如何使用Java高级REST客户端Elasticsearch获取嵌套的聚合桶的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些嵌套字段,我想计算其中所有不同的值,例如:

I have some nested fields, of which I want to calculate all distinct values, for example:

"author":{
  "type":"nested",
  "properties":{
    "first_name":{
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
         }
       }
     }
   "last_name":{
      "type": "text",
      "fields": {
         "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
       }
    }
 }

假设我需要所有唯一的名字,所以我要添加一个像这样的聚合:

Suppose I need all unique first names, so I am adding an aggregation like this :

GET /statementmetadataindex/data/_search?size=0
{
  "aggs": {
    "distinct_authors": {
      "nested": {
        "path": "authors"
      },
      "aggs": {
        "distinct_first_names": {
          "terms": {
            "field": "authors.first_name.keyword"
          }
        }
      }
    }
  }
}

返回这样的聚合:

"aggregations" : {
    "distinct_authors" : {
      "doc_count" : 20292,
      "distinct_first_names" : {
        "doc_count_error_upper_bound" : 4761,
        "sum_other_doc_count" : 124467,
        "buckets" : [
          {
            "key" : "Charles",
            "doc_count" : 48411
          },
          {
            "key" : "Rudyard",
            "doc_count" : 30954
          }
        ]
      }
    }
  } 

现在,我正在像这样的Java代码中使用嵌套聚合生成器:

Now, I am using Nested aggregation builder in the java code like this :

NestedAggregationBuilder uniqueAuthors=AggregationBuilders.nested("distinct_authors", "authors");
TermsAggregationBuilder distinct_first_name= AggregationBuilders.terms("distinct_first_names")
 .field("authors.first_name.keyword").size(size);
uniqueAuthors.subAggregation(distinct_first_name);

通常,我会从响应中得到这样的聚合:

and I usually get the aggregation like this from the response:

Terms distinct_authornames=aggregations.get("distinct_authors");

但是我需要的存储桶位于"distinct_authors"内部的子聚合"distinct_first_names"中,那么如何解析聚合结果以获取具有名字的唯一存储桶?

but the buckets that I need are in the sub-aggregation "distinct_first_names" inside "distinct_authors" , so how do I parse the aggregation result to get the unique buckets with the first names?

推荐答案

尝试一下(未测试):

Nested distinct_authornames=aggregations.get("distinct_authors");
Terms distinct_first_names=distinct_authornames.getAggregations().get("distinct_first_names");

for (Terms.Bucket bucket : distinct_first_names.getBuckets()) 
{
    System.out.println((int) bucket.getDocCount());
    System.out.println(bucket.getKeyAsString());
}

希望这会有所帮助

这篇关于如何使用Java高级REST客户端Elasticsearch获取嵌套的聚合桶的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆