`
kfcman
  • 浏览: 406272 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Elasticsearch Aggregation 多个字段分组统计 Java API实现

 
阅读更多

现有索引数据:

index:school

type:student

---------------------------------------------------

{"grade":"1", "class":"1", "name":"xiao 1"}

{"grade":"1", "class":"1", "name":"xiao 2"}

{"grade":"1", "class":"2", "name":"xiao 3"}

{"grade":"1", "class":"2", "name":"xiao 4"}

{"grade":"1", "class":"2", "name":"xiao 5"}

 

Java分组统计年级和班级学生个数,如SQL: SELECT grade,class,count(1) FROM student GROUP BY grade,class;

 

package test;

 

import java.util.Iterator;

import java.util.Map;

 

import org.elasticsearch.action.search.SearchRequestBuilder;

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.action.search.SearchType;

import org.elasticsearch.search.aggregations.Aggregation;

import org.elasticsearch.search.aggregations.AggregationBuilders;

import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;

import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;

import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;

import org.junit.Test;

 

import utils.NesUtils;

 

public class TestAggregation

{

@Test

public void testAggregation()

{

SearchRequestBuilder srb = NesUtils.getSearcher("school");

srb.setTypes("student");

srb.setSearchType(SearchType.COUNT);

 

TermsBuilder gradeTermsBuilder = AggregationBuilders.terms("gradeAgg").field("grade");

TermsBuilder classTermsBuilder = AggregationBuilders.terms("classAgg").field("class");

 

gradeTermsBuilder.subAggregation(classTermsBuilder);

 

srb.addAggregation(gradeTermsBuilder);

 

SearchResponse sr = srb.execute().actionGet();

 

Map<String, Aggregation> aggMap = sr.getAggregations().asMap();

 

StringTerms gradeTerms = (StringTerms) aggMap.get("gradeAgg");

 

Iterator<Bucket> gradeBucketIt = gradeTerms.getBuckets().iterator();

 

while(gradeBucketIt.hasNext())

{

Bucket gradeBucket = gradeBucketIt.next();

System.out.println(gradeBucket.getKey() + "年级有" + gradeBucket.getDocCount() +"个学生。");

 

StringTerms classTerms = (StringTerms) gradeBucket.getAggregations().asMap().get("classAgg");

Iterator<Bucket> classBucketIt = classTerms.getBuckets().iterator();

 

while(classBucketIt.hasNext())

{

Bucket classBucket = classBucketIt.next();

System.out.println(gradeBucket.getKey() + "年级" +classBucket.getKey() + "班有" + classBucket.getDocCount() +"个学生。");

}

System.out.println();

}

 

}

}

运行完成输出结果

---------------------------------------------------

1年级有5个学生。

1年级2班有3个学生。

1年级1班有2个学生。

分享到:
评论

相关推荐

    基于Elasticsearch Java API的参考手册

    **Elasticsearch Java API详解** Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,广泛应用于大数据领域的实时分析和信息检索。Java API是Elasticsearch官方提供的与Elasticsearch服务器进行交互的...

    elasticsearch5.6以上version通用java API

    在"elasticsearch5.6以上version通用java API"中,我们将会探讨如何利用Java编写工具类,以覆盖更全面的操作,如映射创建、批量插入、聚合查询以及模糊和精确查询。 1. **映射创建**:Elasticsearch的映射(Mapping...

    elasticsearch-8.5.1-windows-x86-64.zip

    7. **分片(Shard)**:为了实现水平扩展,Elasticsearch将索引分割为多个分片。分片可以在集群内的不同节点上分布,使得大型数据集可以分散在多个机器上处理。 8. **副本(Replica)**:每个分片都可以有零个或多个...

    elasticsearch demo

    排序允许我们按照特定字段或多个字段的值来返回结果。例如,以下请求按年龄降序排列结果: ```json GET /my_index/_search { "sort": [ { "age": { "order": "desc" } } ] } ``` 还可以结合多种排序方式,如同时...

    ElasticSearch 基础教程,包括基本概念安装和配置的详细信息

    - **聚合(Aggregation)**:通过对结果进行分组统计,实现数据分析和可视化。 - **脚本(Scripting)**:允许在查询和索引过程中执行自定义脚本代码。 - **别名(Alias)**:为一个或多个索引提供一个逻辑名称,方便管理...

    基于ElasticSearch7.3.2、RestHighLevelClient、SpringBoot搭建的通用搜索系统.zip

    - **结果聚合**:利用Aggregation进行数据聚合分析,如统计、分组、排序等。 - **高亮显示**:实现搜索结果的关键字高亮,增强用户体验。 - **错误处理和监控**:设置合理的错误处理机制,并通过Elasticsearch的...

    elasticmagic-kt:使用针对Kotlin的Elasticsearch查询构建器进行实验

    在本文中,我们将深入探讨如何使用`elasticmagic-kt`,这是一个专为Kotlin开发者设计的Elasticsearch查询构建器。这个库旨在简化与Elasticsearch的交互,提供一种更直观、更符合Kotlin语法的方式来构建复杂的查询和...

Global site tag (gtag.js) - Google Analytics