ElasticSearch聚合查询返回结果buckets取值

it2024-07-23  43

ElasticSearch聚合查询返回结果buckets取值

1.聚合查询如下:

{ "size":0, "query":{ "bool":{ "must":[ { "wildcard":{ "county_company.keyword":{ "wildcard":"*3*", "boost":1 } } }, { "range":{ "fault_start_time.keyword":{ "from":"2019-10-01 00:00:00", "to":"2019-10-31 14:25:35", "include_lower":true, "include_upper":true, "boost":1 } } } ], "adjust_pure_negative":true, "boost":1 } }, "explain":true, "aggregations":{ //此处是聚合查询条件集合 "alarm":{//此处是第一个聚合条件的 别名(自定义)用于返回取值使用 "terms":{ "field":"alarm_level_title.keyword", //分组聚合字段 "size":10, "min_doc_count":1, "shard_min_doc_count":0, "show_term_doc_count_error":false, "order":[ { "_count":"desc" }, { "_key":"asc" } ] } }, "alarmLevel":{ //此处是第二个聚合条件的 别名 "terms":{ "field":"alarm_level.keyword", //聚合条件的字段名称 "size":10, "min_doc_count":1, "shard_min_doc_count":0, "show_term_doc_count_error":false, "order":[ { "_count":"desc" }, { "_key":"asc" } ] } } } }

2.返回结果分析

{ "took" : 50, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 438589, //返回总记录(总条数) "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { //此处是聚合返回结果 "alarm" : { //此处是第一个聚合条件命名的返回结果 "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ //此处返回的聚合值是一个数组 { "key" : "默认等级", "doc_count" : 438589 } ] }, "alarmLevel" : { //此处是第二个聚合条件命名的返回结果 "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ //此处返回的聚合值是一个数组 { "key" : "0000", "doc_count" : 438589 } ] } } }

3.使用java结果取值

String alarm = searchResponse.getAggregations().get("alarm").toString(); String alarmLevel = searchResponse.getAggregations().get("alarmLevel").toString();

根据别名取出返回的值,例如下:

{ "alarm":{ "doc_count_error_upper_bound":0, "sum_other_doc_count":0, "buckets":[ { "key":"默认等级", "doc_count":438589 } ] } }

进一步取出buckets中的单个key,doc_count的值:

JSONObject objectAlarm = JSONObject.parseObject(alarm); objectAlarm.forEach((k,v)->{ if(k.equals("alarm")){ Map v2 = (Map)v; v2.forEach((k1,v1)->{ if(k1.equals("buckets")){ JSONArray array = JSONArray.parseArray(v1.toString()); for (int i = 0; i < array.size(); i++) { HistoryFaultLevelDTO historyFaultLevelDTO = new HistoryFaultLevelDTO(); Map v4 = JSON.parseObject(array.get(i).toString(), Map.class); historyFaultLevelDTO.setFaultLevelTitle(v4.get("key").toString()); historyFaultLevelDTO.setFaultLevelCount(Integer.parseInt(v4.get("doc_count").toString())); resultList.add(historyFaultLevelDTO); } } }); } });
最后成功取到聚合的值,如有更简便的方法,欢迎留言,谢谢。
最新回复(0)