zoukankan      html  css  js  c++  java
  • 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;

     1 package test;
     2 
     3 import java.util.Iterator;
     4 import java.util.Map;
     5 
     6 import org.elasticsearch.action.search.SearchRequestBuilder;
     7 import org.elasticsearch.action.search.SearchResponse;
     8 import org.elasticsearch.action.search.SearchType;
     9 import org.elasticsearch.search.aggregations.Aggregation;
    10 import org.elasticsearch.search.aggregations.AggregationBuilders;
    11 import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
    12 import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
    13 import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
    14 import org.junit.Test;
    15 
    16 import utils.NesUtils;
    17 
    18 public class TestAggregation
    19 {
    20     @Test
    21     public void testAggregation()
    22     {
    23         SearchRequestBuilder srb = NesUtils.getSearcher("school");
    24         srb.setTypes("student");
    25         srb.setSearchType(SearchType.COUNT);
    26         
    27         TermsBuilder gradeTermsBuilder = AggregationBuilders.terms("gradeAgg").field("grade");
    28         TermsBuilder classTermsBuilder = AggregationBuilders.terms("classAgg").field("class");
    29         
    30         gradeTermsBuilder.subAggregation(classTermsBuilder);
    31         
    32         srb.addAggregation(gradeTermsBuilder);
    33         
    34         SearchResponse sr = srb.execute().actionGet();
    35         
    36         Map<String, Aggregation> aggMap = sr.getAggregations().asMap();
    37         
    38         StringTerms gradeTerms = (StringTerms) aggMap.get("gradeAgg");
    39         
    40         Iterator<Bucket> gradeBucketIt = gradeTerms.getBuckets().iterator();
    41         
    42         while(gradeBucketIt.hasNext())
    43         {
    44             Bucket gradeBucket = gradeBucketIt.next();
    45             System.out.println(gradeBucket.getKey() + "年级有" + gradeBucket.getDocCount() +"个学生。");
    46             
    47             StringTerms classTerms = (StringTerms) gradeBucket.getAggregations().asMap().get("classAgg");
    48             Iterator<Bucket> classBucketIt = classTerms.getBuckets().iterator();
    49             
    50             while(classBucketIt.hasNext())
    51             {
    52                 Bucket classBucket = classBucketIt.next();
    53                 System.out.println(gradeBucket.getKey() + "年级" +classBucket.getKey() + "班有" + classBucket.getDocCount() +"个学生。");
    54             }
    55             System.out.println();
    56         }
    57         
    58     }
    59 }
    运行完成输出结果
    ---------------------------------------------------
    1年级有5个学生。
    1年级2班有3个学生。
    1年级1班有2个学生。
  • 相关阅读:
    一元2次方程求解
    react-native 相对项目路径导入组件
    appium页面元素封装(十一)
    pytest高级用法,跳过、失败函数,函数数据参数化(十)
    python之自定义分页代码模板
    pytest高级用法,参数、函数、自动、返回值引用(九)
    pytest.ini文件配置
    因安装pytest最新版本导致,运行pytest命令出错:pluggy.manager.PluginValidationError: unknown hook 'pytest_namespace' in plugin <module 'allure.pytest_plugin' from 'd:\anaconda3\lib\site-packages\allure\pytest_plug
    pytest的使用(八)
    运行pytest,提示编码错误
  • 原文地址:https://www.cnblogs.com/sha0830/p/5549331.html
Copyright © 2011-2022 走看看