如何使用Java高级REST客户端Elasticsearch获取嵌套的聚合桶

时间:2019-11-20 10:33:00

标签: elasticsearch

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

"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
          }
       }
    }
 }

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

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代码中使用嵌套聚合生成器:

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);

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

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

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

2 个答案:

答案 0 :(得分:0)

尝试一下(未测试):

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());
}

希望这会有所帮助

答案 1 :(得分:0)

很久以前就想出了解决方案,但是由于其他原因,我一直在不断发现异常,因此没有意识到它是可行的。以下效果很好:

Nested distinct_authorsOuter=aggregations.get("distinct_authors");
            Aggregations distinct_authors_aggs=distinct_authorsOuter.getAggregations();

Terms distinct_firstNames= distinct_authors_aggs.get("distinct_first_names");