ES计算指定索引,按多个字段去重后批量查询count结果

ElasticSearch批量查询各个字段去重后的结果代码实现

计算指定索引,批量按多个字段去重后批量查询count结果
    /**
     * 计算指定索引,批量按多个字段去重后批量查询的count结果
     * @param indexName
     * @param distinctFieldNames
     * @return
     */
   public Map<String,Object> multiFieldDistinctCount(String indexName, List<String> distinctFieldNames){
        Map<String,Object> fieldCountMap = new HashMap<>();
        MultiSearchRequest request = new MultiSearchRequest();

        for (String distinctFieldName : distinctFieldNames) {
            String key = distinctFieldName;
            SearchRequest searchRequestEach = new SearchRequest(indexName);
            //2.构建SearchSourceBuilder查询对象
            SearchSourceBuilder sourceBuilderEach = new SearchSourceBuilder();
            //3.检索条件构造
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            AggregationBuilder aggregationBuilder = AggregationBuilders.cardinality(key).field("content." + distinctFieldName + ".keyword");
            sourceBuilderEach.query(boolQueryBuilder).aggregation(aggregationBuilder);
            //组装批量查询
            searchRequestEach.source(sourceBuilderEach);
            //添加searchRequestEach
            request.add(searchRequestEach);
        }
        Integer dataConnId = 164;
        DataConnModel dataConnModel = dataConnService.selectByPK(dataConnId);
        ESAdapter esAdapter = new ESAdapter(dataConnModel);
        try {
            client = esAdapter.getClient();
            MultiSearchResponse multiResponse = client.msearch(request, RequestOptions.DEFAULT);

            for (MultiSearchResponse.Item item : multiResponse) {
                SearchResponse response = item.getResponse();
                Map<String, Aggregation> aggregationMap = response.getAggregations().getAsMap();
                Set<String> keySet = aggregationMap.keySet();
                List<String> keyList = new ArrayList<>(keySet);
                ParsedCardinality result = response.getAggregations().get(keyList.get(0));
                long count = result.getValue();
                fieldCountMap.put(keyList.get(0),count);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fieldCountMap;
    }

ES语句

ES按多个字段去重后批量查询的count结果语句。(注意postman调用时最后面要有空行)
http://192.168.xx.xxx:9200/bc_label_test1689146165131/_msearch
{}
{"query":{"match_all":{}},"size":0,"aggs":{"国家_aggs":{"cardinality":{"field":"content.国家.keyword"}}}}
{}
{"query":{"match_all":{}},"size":0,"aggs":{"性别_aggs":{"cardinality":{"field":"content.性别.keyword"}}}}
{}
{"query":{"match_all":{}},"size":0,"aggs":{"装船_aggs":{"cardinality":{"field":"content.装船.keyword"}}}}

查询结果

批量查询结果如下:
{"国家":4,"性别":2,"装船":3}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值