一、需求: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 }