聚合查詢: 也就是類似mysql的count,max,avg等查詢,但要更為強大
聚合查詢語法
POST /index/type/_search
{
"aggs":{ "名字":{ "agg_type":{ "屬性":"值" } } } }
一. 去重計數查詢:Cardinality
去掉重復的數據,然后算出總數,也就是
Cardinality; 如查詢總共幾個省.
java 中的重復計數查詢
1 //重復計數查詢 2 @Test 3 public void cardinalityQuery() throws IOException { 4 // 1. 創建查詢對象 5 String index = "sms-logs-index"; 6 String type = "sms-logs-type"; 7 SearchRequest searchRequest = new SearchRequest(index);//指定索引 8 searchRequest.types(type);//指定類型 9 // 2. 封裝查詢條件 10 String aggName = "agg"; 11 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 12 searchSourceBuilder.aggregation(AggregationBuilders.cardinality(aggName).field("province")); 13 searchRequest.source(searchSourceBuilder); 14 15 // 3.執行查詢 16 // client執行 17 HttpHost httpHost = new HttpHost("192.168.43.30", 9200); 18 RestClientBuilder restClientBuilder = RestClient.builder(httpHost); 19 RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder); 20 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); 21 22 // 4.獲取數據(source中的數據) 23 Cardinality aggregation = search.getAggregations().get(aggName); //用Cardinality接收 24 System.out.println(aggregation.getValue()); 25 }
二. 范圍統計
根據某個屬性的范圍,統計文檔的個數,(from 包含, to不包含)
針對不同的類型指定不同的方法,
數值
:range
時間
:date_range
ip
:ip_range
數值統計:
日期型范圍查詢(data_range):加一個format來規定格式
ip范圍統計(ip_range)
java中用range查詢
1 @Test 2 public void rangeQuery() throws IOException { 3 // 1. 創建查詢對象 4 String index = "sms-logs-index"; 5 String type = "sms-logs-type"; 6 SearchRequest searchRequest = new SearchRequest(index);//指定索引 7 searchRequest.types(type);//指定類型 8 // 2. 封裝查詢條件 9 String aggName = "agg"; 10 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 11 searchSourceBuilder.aggregation(AggregationBuilders.range(aggName).field("fee").addUnboundedTo(3) 12 .addRange(3,4) 13 .addUnboundedFrom(4)); 14 searchRequest.source(searchSourceBuilder); 15 16 // 3.執行查詢 17 // client執行 18 HttpHost httpHost = new HttpHost("192.168.43.30", 9200); 19 RestClientBuilder restClientBuilder = RestClient.builder(httpHost); 20 RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder); 21 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); 22 23 // 4.獲取數據(source中的數據) 24 Range range = search.getAggregations().get(aggName);//用Range接收 25 List<? extends Range.Bucket> buckets = range.getBuckets(); 26 for( Range.Bucket bucket : buckets ){ 27 System.out.println(bucket.getDocCount()); 28 29 } 30 31 32 }
3. 統計聚合查詢
可以查詢屬性(
field
)的最大值,最小值,平均值,平方和.......

1 @Test 2 public void extended_status_Query() throws IOException { 3 // 1. 創建查詢對象 4 String index = "sms-logs-index"; 5 String type = "sms-logs-type"; 6 SearchRequest searchRequest = new SearchRequest(index);//指定索引 7 searchRequest.types(type);//指定類型 8 // 2. 封裝查詢條件 9 String aggName = "agg"; 10 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 11 searchSourceBuilder.aggregation(AggregationBuilders.extendedStats(aggName).field("fee")); 12 searchRequest.source(searchSourceBuilder); 13 14 // 3.執行查詢 15 // client執行 16 HttpHost httpHost = new HttpHost("192.168.43.30", 9200); 17 RestClientBuilder restClientBuilder = RestClient.builder(httpHost); 18 RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder); 19 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); 20 21 // 4.獲取數據(source中的數據) 22 ExtendedStats aggregation = search.getAggregations().get(aggName);//用Range接收 23 System.out.println(aggregation.getMax()); 24 System.out.println(aggregation.getSum()); 25 System.out.println(aggregation.getAvg()); 26 }
https://www.elastic.co/guide/en/elasticsearch/reference/6.5/getting-started.html