我使用的是elasticsearch6.4.3, RestHighLevelClient获取客户端,直接上代码吧
1、action
@RequestMapping(value = "/test4.do")
public void test4(){
try{
//指定索引库类型
SearchRequest searchRequest = new SearchRequest(index).types(type);
String aggName = "largeNum";//分组的字段
String aggField = "largeNum";
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
searchRequest.source(sourceBuilder);
long count = searchClient.searchCount(searchRequest);
System.out.println(count);
//字段类型为long
Map map2 = searchClient.searchGroupLong(sourceBuilder,searchRequest, aggName, aggField);
Iterator iter2 = map2.entrySet().iterator(); // 获得map的Iterator
while (iter2.hasNext()) {
Entry entry = (Entry) iter2.next();
System.out.println(entry.getValue());
}
}catch(Exception ex){
ex.printStackTrace();
}
2、service
/**
* 分组求和
* @param searchBuilder 查询条件
* @param searchRequest 索引信息
* @param aggName 分组后名称
* @param aggField 要分组的字段 long类型
* @return
*/
public Map searchGroupLong(SearchSourceBuilder searchBuilder,SearchRequest searchRequest,String aggName,String aggField){
try {
searchRequest.source(searchBuilder);
TermsAggregationBuilder termsBuilder = AggregationBuilders.terms(aggName).field(aggField);
searchBuilder.aggregation(termsBuilder);
//执行查询
SearchResponse response = client.search(searchRequest);
//获取搜索的文档结果
Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
ParsedLongTerms gradeTerms = (ParsedLongTerms) aggMap.get(aggName);
Map<String, Long> map = new HashMap<String, Long>();
List list = gradeTerms.getBuckets();
for (Object object : list) {
ParsedLongTerms.ParsedBucket obj = (ParsedLongTerms.ParsedBucket) object;
String key = obj.getKeyAsString();
long count = obj.getDocCount();
map.put(key, count);
}
return map;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 分组求和
* @param searchBuilder 查询条件
* @param searchRequest 索引信息
* @param aggName 分组后名称
* @param aggField 要分组的字段 string类型
* @return
*/
public Map searchGroupString(SearchSourceBuilder searchBuilder,SearchRequest searchRequest,String aggName,String aggField){
try {
searchRequest.source(searchBuilder);
TermsAggregationBuilder termsBuilder = AggregationBuilders.terms(aggName).field(aggField);
searchBuilder.aggregation(termsBuilder);
//执行查询
SearchResponse response = client.search(searchRequest);
//获取搜索的文档结果
Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
ParsedStringTerms gradeTerms = (ParsedStringTerms) aggMap.get(aggName);
Map<String, Long> map = new HashMap<String, Long>();
List list = gradeTerms.getBuckets();
for (Object object : list) {
ParsedStringTerms.ParsedBucket obj = (ParsedStringTerms.ParsedBucket) object;
String key = obj.getKeyAsString();
long count = obj.getDocCount();
map.put(key, count);
}
return map;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}