ElasticSearch多字段分组查询


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"
                    }
                ]
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值