java elasticsearch聚合查詢實例
現有索引數據:
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個學生。
本文由用戶 admin 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!