private String final SPLIT= ",";
public List<Option> errorCount() {
List<Option> result = new ArrayList<Option>();
SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
searchRequest.types(SEARCH_TYPE);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder groupAgg =
buildTermsAggregationBuilder(Arrays.asList("user_no","user_name"), "agg_group");
searchSourceBuilder.aggregation(groupAgg).size(0);
searchRequest.source(searchSourceBuilder);
SearchResponse sr = restHighLevelClient.search(searchRequest);
Map<String, Aggregation> aggMap = sr.getAggregations().getAsMap();
if (aggMap.containsKey("agg_group")) {
ParsedStringTerms teams = (ParsedStringTerms) aggMap.get("agg_group");
if (CollectionUtils.isNotEmpty(teams.getBuckets())) {
for (Terms.Bucket bucket : teams.getBuckets()) {
String key = bucket.getKey() == null ? "" : bucket.getKey().toString();
if (StringUtils.isNotBlank(key) && !key.contains("null")) {
String[] split = StringUtils.split(key, SPLIT);
Option option = new Option();
option.setCode(split[0]);
option.setName(split[1]);
result.add(option);
}
}
}
}
return result;
}
private TermsAggregationBuilder buildTermsAggregationBuilder(List<String>
aggregationFields, String termsName) {
String content = aggregationFields.stream().map(one ->
String.format("doc['%s'].value", one)).collect(Collectors.joining("+'" + SPLIT +
"'+"));
TermsAggregationBuilder builder = AggregationBuilders.terms(termsName);
builder.script(new Script(ScriptType.INLINE, "painless", content, new HashMap<>()));
builder.size(Integer.MAX_VALUE);
return builder;
}
es 查询语句
GET /index/type/_search
{
"size":0,
"query":{
"bool":{
"adjust_pure_negative":true,
"boost":1
}
},
"aggregations":{
"agg_group":{
"terms":{
"script":{
"source":"doc['user_no'].value+','+doc['user_name'].value",
"lang":"painless"
},
"size":2147483647,
"order":[
{
"_count":"desc"
},
{
"_key":"asc"
}
]
}
}
}
}