博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Elasticsearch 多字段聚合 结果封装为map
阅读量:7105 次
发布时间:2019-06-28

本文共 5923 字,大约阅读时间需要 19 分钟。

hot3.png

elasticsearch版本:6.1.1

数据字段:

    id    aac003    yka055    id_drg    name_drg    id_mdc    name_mdc    id_depa

索引创建:

    

//todo 创建索引    private void createIndex(TransportClient client)throws Exception{        CreateIndexRequestBuilder cib=client.admin().indices().prepareCreate("hisms_sz");        // 设置该index的Mapping,可暂时不设置,后面建完index之后再设置也可        cib.addMapping("cz", createMapping());        // 设置该index的Settings配置,常用的有shard数量、副本数        cib.setSettings(createSetting());        cib.execute().get();        System.out.println("----------添加映射成功----------");    }    /**     * 创建索引--id	aac003	yka055	id_drg	name_drg	id_mdc	name_mdc	id_depa     */    private XContentBuilder createMapping() throws IOException {        XContentBuilder mapping = XContentFactory.jsonBuilder()                .startObject()                    .startObject("properties") //设置之定义字段                        .startObject("aac003")                            .field("type","keyword") //设置数据类型                        .endObject()                        .startObject("yka055")                            .field("type","double")                        .endObject()                        .startObject("name_drg")                        .field("type","keyword")                        .endObject()                        .startObject("id_mdc")                        .field("type","keyword")                        .endObject()                        .startObject("name_mdc")                        .field("type","keyword")                        .endObject()                        .startObject("id_drg")                            .field("type","text")                            .startObject("fields")                                .startObject("id_drg_key")                                    .field("type","keyword")                                .endObject()                            .endObject()                        .endObject()                        .startObject("id_depa")                            .field("type","text")                            .startObject("fields")                                .startObject("id_depa_key")                                    .field("type","keyword")                                 .endObject()                            .endObject()                        .endObject()                        .startObject("date")                            .field("type","date")  //设置Date类型                            .field("format","yyyy-MM-dd HH:mm:ss")//设置Date的格式                        .endObject()                    .endObject()                .endObject();        return mapping;    }

聚合查询:

    

private void getAggsResult(TransportClient client){        SearchResponse agg = client.prepareSearch("hisms_sz")                .setTypes("cz")                .addAggregation(                        AggregationBuilders.terms("id_mdc").field("id_mdc").size(26)//设置聚合条件 group by id_mdc,id_drg                                .subAggregation(                                        AggregationBuilders.terms("name_drg").field("name_drg").size(700)                                                .subAggregation(AggregationBuilders.avg("avg").field("yka055"))// 聚合结果 avg(date                                                .subAggregation(AggregationBuilders.sum("sum").field("yka055"))                                                .subAggregation(AggregationBuilders.min("min").field("yka055"))                                                .subAggregation(AggregationBuilders.count("count").field("aac003"))                                                .subAggregation(AggregationBuilders.cardinality("cardinality").field("aac003"))                                )                )                .execute().actionGet();        ArrayList results = results(agg);        System.out.println(results.size());    }

调用封装方法:

    

private ArrayList results(SearchResponse agg){        Map
aggregations = agg.getAggregations().asMap(); ArrayList
objects = new ArrayList<>(); for (Map.Entry
entry:aggregations.entrySet() ) { String key = entry.getKey(); Aggregation value = entry.getValue(); HashMap
group = new HashMap<>(); parseAggs(value,group,key,objects); } return objects; } //解析聚合结果 private ArrayList
parseAggs(Aggregation agg, HashMap
group,String field,ArrayList
objects){ if (agg instanceof Terms){ for (Terms.Bucket bucket:((Terms) agg).getBuckets() ){ String keyAsString = bucket.getKeyAsString(); group.put(field,keyAsString); for (Map.Entry
entry :bucket.getAggregations().asMap().entrySet() ) { String key = entry.getKey(); Aggregation value = entry.getValue(); if (value instanceof Terms){ parseAggs(value,group,key,objects); }else { LinkedHashMap
map = package2map(bucket); map.putAll(group); objects.add(map); break; } } } } return objects; } private LinkedHashMap
package2map(Terms.Bucket bucket){ LinkedHashMap
map = new LinkedHashMap<>(); for (Map.Entry
entry :bucket.getAggregations().asMap().entrySet() ) { String key = entry.getKey(); Aggregation value = entry.getValue(); map.put(key,getvalue(value)); } return map; } //取值 public String getvalue(Aggregation agg){ String type = agg.getType(); String result=""; switch (type){ case "avg": result=String.valueOf(((InternalAvg) agg).getValue()); break; case "sum": result=String.valueOf(((Sum) agg).getValue()); break; case "value_count": result=String.valueOf(((InternalValueCount) agg).getValue()); break; case "min": result=String.valueOf(((InternalMin) agg).getValue()); break; case "max": result=String.valueOf(((InternalMax) agg).getValue()); break; case "cardinality": result=String.valueOf(((InternalCardinality) agg).getValue()); break; default: result=String.valueOf(agg); break; } return result; }

封装后结果为List<Map>,同sql数据库中查询的一样,方便遍历查询,不用再循环遍历取出各桶的数据。

转载于:https://my.oschina.net/shea1992/blog/3033283

你可能感兴趣的文章
leetcode394
查看>>
(18)odoo规范
查看>>
PHP:第一章——PHP中静态变量和常量
查看>>
软件过程与项目管理(第三次作业)
查看>>
MyEclipse junit测试问题initializationError
查看>>
webMethods中有趣的尝试【一】
查看>>
Android IOS WebRTC 音视频开发总结(四七)-- 深度解读国内首届WebRTC大会背后的真相...
查看>>
OpenCV-Python:霍夫变换
查看>>
[学习经验] 孩子到底什么时候学习自然拼读和国际音标?
查看>>
wamp phpMyAdmin error #1045 - Access denied for user root@locahost Fixed!
查看>>
MySQL的四种事务隔离级别
查看>>
mysql---3种常用引擎 和优点
查看>>
input通过id的赋值 js jquery innerHTML和outerHTML 的区别
查看>>
电路交换与分组交换的区别?优劣对比(转)
查看>>
数据结构栈的链表实现
查看>>
CAD绘制室外平台步骤5.3
查看>>
洛谷 P3382 【模板】三分法
查看>>
poj 1177 Picture
查看>>
bzoj千题计划179:bzoj1237: [SCOI2008]配对
查看>>
【第一阶段】第一周作业
查看>>