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
);
}
}
});
}
});
最后成功取到聚合的值,如有更简便的方法,欢迎留言,谢谢。