ES的聚合操作

半城伤御伤魂 提交于 2019-11-27 10:12:38

构建数据:

​    @Test    public void createIndex(){        /**         * 创建索引         * */        client.admin().indices().prepareCreate("player").get();    }​​​    /**     * 创建映射     */    @Test    public void testCreateIndexMapping_boost() throws Exception{        /**         * 格式:         "mappings": {            "player": {                "properties": {                     "name": {"index": "not_analyzed","type": "string"},                    "age": {"type": "integer"},                    "salary": {"type": "integer"},                    "team": {"index": "not_analyzed","type": "string"},                    "position": {"index": "not_analyzed","type": "string"}                }            }         }​         */        //构建json的数据格式,创建映射        XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()                .startObject()                .startObject("player")                .startObject("properties")                .startObject("name").field("type","string").field("index", "not_analyzed").endObject()                .startObject("age").field("type","integer").endObject()                .startObject("salary").field("type","integer").endObject()                .startObject("team").field("type","string").field("index", "not_analyzed").endObject()                .startObject("position").field("type","string").field("index", "not_analyzed").endObject()                .endObject()                .endObject()                .endObject();        PutMappingRequest request = Requests.putMappingRequest("player")                .type("player")                .source(mappingBuilder);        client.admin().indices().putMapping(request).get();    }​    @Test    public void BulkInsertDocument() throws IOException {        BulkRequestBuilder bulkRequest = client.prepareBulk();​// either use client#prepare, or use Requests# to directly build index/delete requests        bulkRequest.add(client.prepareIndex("player", "player", "1")                .setSource(jsonBuilder()                        .startObject()                        .field("name", "郭德纲")                        .field("age", 33)                        .field("salary",3000)                        .field("team" , "cav")                        .field("position" , "sf")                        .endObject()                )        );        bulkRequest.add(client.prepareIndex("player", "player", "2")                .setSource(jsonBuilder()                        .startObject()                        .field("name", "于谦")                        .field("age", 25)                        .field("salary",2000)                        .field("team" , "cav")                        .field("position" , "pg")                        .endObject()                )        );        bulkRequest.add(client.prepareIndex("player", "player", "3")                .setSource(jsonBuilder()                        .startObject()                        .field("name", "岳云鹏")                        .field("age", 29)                        .field("salary",1000)                        .field("team" , "war")                        .field("position" , "pg")                        .endObject()                )        );        bulkRequest.add(client.prepareIndex("player", "player", "4")                .setSource(jsonBuilder()                        .startObject()                        .field("name", "孙越")                        .field("age", 26)                        .field("salary",2000)                        .field("team" , "war")                        .field("position" , "sg")                        .endObject()                )        );        bulkRequest.add(client.prepareIndex("player", "player", "5")                .setSource(jsonBuilder()                        .startObject()                        .field("name", "张云雷")                        .field("age", 26)                        .field("salary",2000)                        .field("team" , "war")                        .field("position" , "pf")                        .endObject()                )        );        bulkRequest.add(client.prepareIndex("player", "player", "6")                .setSource(jsonBuilder()                        .startObject()                        .field("name", "爱迪生")                        .field("age", 40)                        .field("salary",1000)                        .field("team" , "tim")                        .field("position" , "pf")                        .endObject()                )        );        bulkRequest.add(client.prepareIndex("player", "player", "7")                .setSource(jsonBuilder()                        .startObject()                        .field("name", "牛顿")                        .field("age", 21)                        .field("salary",500)                        .field("team" , "tim")                        .field("position" , "c")                        .endObject()                )        );        bulkRequest.add(client.prepareIndex("player", "player", "4")                .setSource(jsonBuilder()                        .startObject()                        .field("name", "爱因斯坦")                        .field("age", 21)                        .field("salary",300)                        .field("team" , "tim")                        .field("position" , "sg")                        .endObject()                )        );        bulkRequest.add(client.prepareIndex("player", "player", "8")                .setSource(jsonBuilder()                        .startObject()                        .field("name", "特斯拉")                        .field("age", 20)                        .field("salary",500)                        .field("team" , "tim")                        .field("position" , "sf")                        .endObject()                )        );​​        BulkResponse bulkResponse = bulkRequest.get();        if (bulkResponse.hasFailures()) {            // process failures by iterating through each bulk response item        }    }​​

1:分组求count

计算每个球队的球员数量:

select team, count(*) as player_count from player group by team;

@Testpublic void groupAndCount() {    //1:构建查询提交    SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");    //2:指定聚合条件    TermsAggregationBuilder team = AggregationBuilders.terms("player_count").field("team");    //3:将聚合条件放入查询条件中    builder.addAggregation(team);    //4:执行action,返回searchResponse    SearchResponse searchResponse = builder.get();    //5:将查询返回的searchResponse转换成map    Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();    //6:取出聚合的字段    StringTerms teamTerms = (StringTerms)aggregationMap.get("player_count");    System.out.println(teamTerms);    //7:对聚合的字段进行迭代    Iterator<StringTerms.Bucket> iterator = teamTerms.getBuckets().iterator();    while (iterator.hasNext()){        StringTerms.Bucket bucket = iterator.next();        System.out.println("每个球队 :" + bucket.getKey() + "有 【"+bucket.getDocCount()+"】 个人");    }​}​​

2:Group by 多个字段

计算每个球队每个位置的球员数 select team, position, count(*) as pos_count from player group by team,position;

/** * group by 多个字段 * 计算每个球队每个位置的球员数 * select team, position, count(*) as pos_count from player group by team, position; * */@Testpublic void groupMutilFields() {    //1:构建查询提交    SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");    //2:指定聚合条件    TermsAggregationBuilder team = AggregationBuilders.terms("player_count").field("team");    TermsAggregationBuilder potition = AggregationBuilders.terms("position_count").field("position");    //注意父子关系team.subAggregation(potition);    //3:将聚合条件放入查询条件中    builder.addAggregation(team).addAggregation(potition);    //4:执行action,返回searchResponse    SearchResponse searchResponse = builder.get();    //5:将查询返回的searchResponse转换成map    Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();    //6:取出聚合的字段    StringTerms teamTerms = (StringTerms)aggregationMap.get("player_count");    //7:对聚合的字段进行迭代    Iterator<StringTerms.Bucket> iterator = teamTerms.getBuckets().iterator();    while (iterator.hasNext()){        StringTerms.Bucket bucket = iterator.next();        //8:获取所有子聚合        Map<String, Aggregation> position_map = bucket.getAggregations().asMap();        StringTerms potitionTerms = (StringTerms)position_map.get("position_count");        //9:对子集合下面的内容迭代  队名--位置--球员        Iterator<StringTerms.Bucket> sub_iterator = potitionTerms.getBuckets().iterator();        while (sub_iterator.hasNext()){            StringTerms.Bucket sub_bucket = sub_iterator.next();            System.out.println("球队 :" + bucket.getKey() + "下面的 "+sub_bucket.getKey()+"的位置 有"+sub_bucket.getDocCount());        }    }}​​

3:分组求最大

计算每个球队年龄最大/最小/总/平均的球员年龄

select team, max(age) as max_age from player group by team;

​/** * 分组求:最大值、最小值、平均值 * 计算每个球队年龄最大/最小/总/平均的球员年龄 select team, max(age) as max_age from player group by team; * * */@Testpublic void groupMax(){    //1:构建查询提交    SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");    //2:指定聚合条件    TermsAggregationBuilder team = AggregationBuilders.terms("player_count").field("team");    //3: 指定要查哪一个字段的最大值    MaxAggregationBuilder ageFiled = AggregationBuilders.max("max_age").field("age");    //: 找到聚合关系:父子关系    team.subAggregation(ageFiled);    //3:将聚合条件放入查询条件中    builder.addAggregation(team);    //4:执行action,返回searchResponse    SearchResponse searchResponse = builder.get();    //5:将查询返回的searchResponse转换成map    Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();    //6:取出聚合的字段    StringTerms teamTerms = (StringTerms)aggregationMap.get("player_count");    //7:对聚合的字段进行迭代    Iterator<StringTerms.Bucket> iterator = teamTerms.getBuckets().iterator();    while (iterator.hasNext()){        StringTerms.Bucket bucket = iterator.next();        //8:获取所有子聚合        Map age_map = bucket.getAggregations().asMap();        int age = (int)((InternalMax) age_map.get("max_age")).getValue();        System.out.println("球队 :" + bucket.getKey() + "  最大年龄: "+age);    }}​​

4:分组求最小

计算每个球队年龄最大/最小/总/平均的球员年龄 select team, min(age) as max_age from player group by team;

/** * 分组求:最大值、最小值、平均值 * 计算每个球队年龄最大/最小/总/平均的球员年龄 select team, min(age) as max_age from player group by team; * * */@Testpublic void groupMin(){    //1:构建查询提交    SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");    //2:指定聚合条件    TermsAggregationBuilder team = AggregationBuilders.terms("player_count").field("team");    //3: 指定要查哪一个字段的最大值    MinAggregationBuilder ageFiled = AggregationBuilders.min("min_age").field("age");    //: 找到聚合关系:父子关系    team.subAggregation(ageFiled);    //3:将聚合条件放入查询条件中    builder.addAggregation(team);    //4:执行action,返回searchResponse    SearchResponse searchResponse = builder.get();    //5:将查询返回的searchResponse转换成map    Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();    //6:取出聚合的字段    StringTerms teamTerms = (StringTerms)aggregationMap.get("player_count");    //7:对聚合的字段进行迭代    Iterator<StringTerms.Bucket> iterator = teamTerms.getBuckets().iterator();    while (iterator.hasNext()){        StringTerms.Bucket bucket = iterator.next();        //8:获取所有子聚合        Map age_map = bucket.getAggregations().asMap();        int age = (int)((InternalMin) age_map.get("max_age")).getValue();        System.out.println("球队 :" + bucket.getKey() + "  最小年龄: "+age);    }}​​

5:分组求平均值

计算每个球队年龄最大/最小/总/平均的球员年龄 select team, min(age) as max_age from player group by team;

/** * 分组求:最大值、最小值、平均值 * 计算每个球队年龄最大/最小/总/平均的球员年龄 select team, min(age) as max_age from player group by team; * * */@Testpublic void groupAvg(){    //1:构建查询提交    SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");    //2:指定聚合条件    TermsAggregationBuilder team = AggregationBuilders.terms("player_count").field("team");    //3: 指定要查哪一个字段的最大值    AvgAggregationBuilder ageFiled = AggregationBuilders.avg("avg_age").field("age");    //: 找到聚合关系:父子关系    team.subAggregation(ageFiled);    //3:将聚合条件放入查询条件中    builder.addAggregation(team);    //4:执行action,返回searchResponse    SearchResponse searchResponse = builder.get();    //5:将查询返回的searchResponse转换成map    Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();    //6:取出聚合的字段    StringTerms teamTerms = (StringTerms)aggregationMap.get("player_count");    //7:对聚合的字段进行迭代    Iterator<StringTerms.Bucket> iterator = teamTerms.getBuckets().iterator();    while (iterator.hasNext()){        StringTerms.Bucket bucket = iterator.next();        //8:获取所有子聚合        Map age_map = bucket.getAggregations().asMap();        Double age = ((InternalAvg) age_map.get("avg_age")).getValue();        System.out.println("球队 :" + bucket.getKey() + "  平均年龄: "+age);    }}​​

6:分组求和

计算每个球队球员的平均年龄,同时又要计算总年薪 select team, avg(age)as avg_age, sum(salary) as total_salary from player group by team;

/** * 分组求:最大值、最小值、平均值 * 计算每个球队球员的平均年龄,同时又要计算总年薪 select team, avg(age)as avg_age, sum(salary) as total_salary from player group by team; * * */@Testpublic void groupsum(){    //1:构建查询提交    SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");    //2:指定聚合条件    TermsAggregationBuilder team = AggregationBuilders.terms("player_count").field("team");    //3: 指定要查哪一个字段    AvgAggregationBuilder ageFiled = AggregationBuilders.avg("avg_age").field("age");​    SumAggregationBuilder salaryField= AggregationBuilders.sum("sum_salary").field("salary");    //: 找到聚合关系:父子关系    team.subAggregation(ageFiled).subAggregation(salaryField);    //3:将聚合条件放入查询条件中    builder.addAggregation(team);    //4:执行action,返回searchResponse    SearchResponse searchResponse = builder.get();    //5:将查询返回的searchResponse转换成map    Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();    //6:取出聚合的字段    StringTerms teamTerms = (StringTerms)aggregationMap.get("player_count");    //7:对聚合的字段进行迭代    Iterator<StringTerms.Bucket> iterator = teamTerms.getBuckets().iterator();    while (iterator.hasNext()){        StringTerms.Bucket bucket = iterator.next();        //8:获取所有子聚合        Map age_map = bucket.getAggregations().asMap();​        Double age = ((InternalAvg) age_map.get("avg_age")).getValue();        double sum_salary = ((InternalSum) age_map.get("sum_salary")).getValue();        System.out.println("球队 :" + bucket.getKey() + "  平均年龄: "+age + "  球队总salary:" + sum_salary);    }}​​

7:聚合排序

计算每个球队总年薪,并按照总年薪倒序排列 select team, sum(salary) as total_salary from player group by team order by total_salary desc;

/** * 排序 计算每个球队总年薪,并按照总年薪倒序排列 select team, sum(salary) as total_salary from player group by team order by total_salary desc; * */@Testpublic void groupOrder(){    /**     *     * TermsBuilder teamAgg= AggregationBuilders.terms("team").order(Order.aggregation("total_salary ", false);     SumBuilder salaryAgg= AggregationBuilders.avg("total_salary ").field("salary");     sbuilder.addAggregation(teamAgg.subAggregation(salaryAgg));     * */​    //1:构建查询提交    SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");    //2:指定聚合条件    TermsAggregationBuilder team = AggregationBuilders.terms("player_count").field("team")            .order(Terms.Order.aggregation("total_salary", false));//false是降序,true是升序    //3: 指定要查哪一个字段    SumAggregationBuilder salaryField= AggregationBuilders.sum("total_salary").field("salary");    //: 找到聚合关系:父子关系    team.subAggregation(salaryField);    //3:将聚合条件放入查询条件中    builder.addAggregation(team);    //4:执行action,返回searchResponse    SearchResponse searchResponse = builder.get();    //5:将查询返回的searchResponse转换成map    Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();    //6:取出聚合的字段    StringTerms teamTerms = (StringTerms)aggregationMap.get("player_count");    //7:对聚合的字段进行迭代    Iterator<StringTerms.Bucket> iterator = teamTerms.getBuckets().iterator();    while (iterator.hasNext()){        StringTerms.Bucket bucket = iterator.next();        //8:获取所有子聚合        Map age_map = bucket.getAggregations().asMap();​        double sum_salary = ((InternalSum) age_map.get("total_salary")).getValue();        System.out.println("球队 :" + bucket.getKey() + "  球队总salary:" + sum_salary);    }}​​

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!