Elasticsearch Aggregation 多个字段分组统计 Java API实现
2016-06-01 13:41
573 查看
现有索引数据:
Java分组统计年级和班级学生个数,如SQL: SELECT grade,class,count(1) FROM student GROUP BY grade,class;
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个学生。
相关文章推荐
- javase知识点
- worldwind java导入栅格影像时的无效区域透明问题
- [疯狂Java]集合:Collections工具类、Enumeration(摒弃)
- Eclipse快捷
- java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫
- [转]Elasticsearch Java API总汇
- Spring AOP 实现原理与 CGLIB 应用
- Java集合类框架—List、ArrayList、LinkedList
- spring hibernate框架问题
- Spring Boot 快速入门
- udp穿透简单讲解和实现(Java)
- Java传值
- Java 对象释放与 finalize 方法
- java报错Syntax error on token int, Dimensions expected after this token
- Error:(320, 57) java: -source 1.6 中不支持 diamond 运算符
- java中自定义时间减去某几天返回减去的天数时间
- spring 初始化 bean 或者销毁 bean 操作
- JDK各个版本的新特性jdk1.5-jdk8
- spring MVC
- java mvc