您好,欢迎来到世旅网。
搜索
您的当前位置:首页ES计算指定索引,按多个字段去重后批量查询count结果

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 = 1;
        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_test16146165131/_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}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- esig.cn 版权所有 湘ICP备2023023988号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务