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个学生。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10250.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论