ES中對應的SQL的count(distinct 列名) java實現


一、需求:select count(distinct city_name)  from tableA;

二、代碼:用的是cardinality基數統計,高版本API 

AggregationBuilders.cardinality(field).field(field);  // 第一個field是聚合的別名,別名就是下面根據這個別名獲取聚合結果 第二個是ES里的字段

 

 1 /**
 2      * 查詢去重后總量
 3      * @param req
 4      * @param field  es里字段名稱
 5      * @return
 6      */
 7     private Integer countDistinct(String field){
 8         // 創建查詢請求對象
 9         SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
10         // 創建查詢資源對象
11         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
12 15         // 查詢條件-分組
16         CardinalityAggregationBuilder cardinalityAggregationBuilder = AggregationBuilders.cardinality(field).field(field);
17         sourceBuilder.aggregation(cardinalityAggregationBuilder);
18         sourceBuilder.size(0);
19         searchRequest.source(sourceBuilder);
20 
21         SearchResponse searchResponse = null;
22         int size = 0;
23         try {
24             searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
25             if(null == searchResponse){ return 0; }
26             ParsedCardinality parsedCardinality = searchResponse.getAggregations().get(field);  // 這個field就是上面起的別名
27             size = (int) parsedCardinality.getValue();
28         } catch (IOException e) {
29             log.debug("ES查詢分組條數有誤!");
30         }
31         return size;
32     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM