当前位置:   article > 正文

elasticsearch高级功能之聚合查询_aggregationbuilders.sum

aggregationbuilders.sum

elasticsearch高级功能之聚合查询,是比较复杂的的高级功能,其中包含相关的统计功能,比如最大值、最小值、平均值、求和等,又比如筛选完数据后,还需要过滤筛选项,今天我们详细分析一下:

一、聚合指标

1、基本的统计指标

1.1、计算基本类型的平均值

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "avg": {
  7. "field": "price"
  8. }
  9. }
  10. }
  11. }

1.2、计算非基本类型的平均值

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "avg": {
  7. "field": "comment.properties.good"
  8. }
  9. }
  10. }
  11. }

java客户端:

  1. public void getAvgAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest(" scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String aggName = "my_agg";//聚合的名称
  5. //定义avg聚合,指定字段为价格
  6. AvgAggregationBuilder aggregationBuilder = AggregationBuilders.avg(aggName).field("price");
  7. searchSourceBuilder.aggregation(aggregationBuilder);//添加聚合
  8. searchRequest.source(searchSourceBuilder);//设置查询请求
  9. //执行查询
  10. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  11. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  12. Avg avg = aggregations.get(aggName);//获取avg聚合返回的对象
  13. String key = avg.getName();//获取聚合名称
  14. double avgValue = avg.getValue();//获取聚合值
  15. System.out.println("key=" + key + ",avgValue=" + avgValue);//打印结果
  16. }

1.3、返回多个统计数据

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "stats": {
  7. "field": "price"
  8. }
  9. }
  10. }
  11. }

java客户端

  1. public void getStatsAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String aggName = "my_agg";//聚合的名称
  5. //定义stats聚合,指定字段为价格
  6. StatsAggregationBuilder aggregationBuilder = AggregationBuilders.stats(aggName).field("price");
  7. searchSourceBuilder.aggregation(aggregationBuilder);//添加聚合
  8. searchRequest.source(searchSourceBuilder);//设置查询请求
  9. //执行查询
  10. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  11. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  12. Stats stats = aggregations.get(aggName);//获取stats聚合返回的对象
  13. String key = stats.getName();//获取聚合名称
  14. double sumVal = stats.getSum();//获取聚合加和值
  15. double avgVal = stats.getAvg();//获取聚合平均值
  16. long countVal = stats.getCount();//获取聚合文档数量值
  17. double maxVal = stats.getMax();//获取聚合最大值
  18. double minVal = stats.getMin();//获取聚合最小值
  19. System.out.println("key=" + key);//打印聚合名称
  20. System.out.println("sumVal=" + sumVal + ",avgVal=" + avgVal + ",countVal=" + countVal + ",maxVal=" + maxVal + ",minVal=" + minVal);//打印结果
  21. }

 2、空值处理

2.1、基本类型非空值的个数

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "value_count": {
  7. "field": "price"
  8. }
  9. }
  10. }
  11. }

java客户端

  1. public void getValueCountAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String aggName = "my_agg";//聚合的名称
  5. //定义value_count聚合,指定字段为价格
  6. ValueCountAggregationBuilder aggregationBuilder = AggregationBuilders.count(aggName).field("price");
  7. aggregationBuilder.missing("200");
  8. searchSourceBuilder.aggregation(aggregationBuilder);//添加聚合
  9. searchRequest.source(searchSourceBuilder);//设置查询请求
  10. //执行查询
  11. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  12. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  13. ValueCount valueCount = aggregations.get(aggName);//获取value_count聚合返回的对象
  14. String key = valueCount.getName();//获取聚合名称
  15. long count = valueCount.getValue();//获取聚合值
  16. System.out.println("key=" + key + ",count=" + count);//打印结果
  17. }

 2.2、数组非空值个数

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "value_count": {
  7. "field": "tag"
  8. }
  9. }
  10. }
  11. }

2.3、空值替换相加

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "sum": {
  7. "field": "price",
  8. "missing": 200
  9. }
  10. }
  11. }
  12. }

java客户端

  1. public void getSumAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String aggName = "my_agg";//聚合的名称
  5. //定义sum聚合,指定字段为价格
  6. SumAggregationBuilder aggregationBuilder = AggregationBuilders.sum(aggName).field("price");
  7. aggregationBuilder.missing("200");
  8. searchSourceBuilder.aggregation(aggregationBuilder);//添加聚合
  9. searchRequest.source(searchSourceBuilder);//设置查询请求
  10. //执行查询
  11. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  12. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  13. Sum sum = aggregations.get(aggName);//获取sum聚合返回的对象
  14. String key = sum.getName();//获取聚合名称
  15. double sumVal = sum.getValue();//获取聚合值
  16. System.out.println("key=" + key + ",count=" + sumVal);//打印结果
  17. }

 二、桶聚合查询

1、单维度桶聚合查询

1.1、按照城市聚合查询

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "terms": {
  7. "field": "city"
  8. }
  9. }
  10. }
  11. }

java客户端

  1. public void getBucketDocCountAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String termsAggName = "my_terms";//指定聚合的名称
  5. //定义terms聚合,指定字段为城市
  6. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms(termsAggName).field("full_room");
  7. searchSourceBuilder.aggregation(termsAggregationBuilder);//添加聚合
  8. searchRequest.source(searchSourceBuilder);//设置查询请求
  9. //执行查询
  10. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  11. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  12. Terms terms = aggregations.get(termsAggName);//获取聚合返回的对象
  13. for (Terms.Bucket bucket : terms.getBuckets()) {
  14. String bucketKey = bucket.getKeyAsString();//获取桶名称
  15. long docCount = bucket.getDocCount();//获取文档个数
  16. System.out.println("termsKey=" + bucketKey + ",docCount=" + docCount);
  17. }
  18. }

 1.2、范围聚合查询

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "range": {
  7. "field": "price",
  8. "ranges": [
  9. {
  10. "to": 20
  11. },
  12. {
  13. "from": 100,
  14. "to": 50
  15. },
  16. {
  17. "from": 1000,
  18. "to": 500
  19. }
  20. ]
  21. }
  22. }
  23. }
  24. }

java客户端

  1. public void getRangeDocCountAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String rangeAggName = "my_range";//sum聚合的名称
  5. //定义range聚合,指定字段为price
  6. RangeAggregationBuilder rangeAgg = AggregationBuilders.range(rangeAggName).field("price");
  7. rangeAgg.addRange(new RangeAggregator.Range(null,null,200d));
  8. rangeAgg.addRange(new RangeAggregator.Range(null,200d,500d));
  9. rangeAgg.addRange(new RangeAggregator.Range(null,500d,null));
  10. searchSourceBuilder.aggregation(rangeAgg);//添加range聚合
  11. searchRequest.source(searchSourceBuilder);//设置查询请求
  12. //执行查询
  13. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  14. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  15. Range range = aggregations.get(rangeAggName);//获取range聚合返回的对象
  16. for (Range.Bucket bucket : range.getBuckets()) {
  17. String bucketKey = bucket.getKeyAsString();//获取桶名称
  18. long docCount = bucket.getDocCount();//获取聚合文档个数
  19. System.out.println("bucketKey=" + bucketKey + ",docCount=" + docCount);
  20. }
  21. }

 1.3、按照城市维度聚合查询各城市的平均价格

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "terms": {
  7. "field": "city"
  8. },
  9. "aggs": {
  10. "my_sum": {
  11. "sum": {
  12. "field": "price",
  13. "missing": 100
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }

java客户端

  1. public void getBucketAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String termsAggName = "my_terms";//sum聚合的名称
  5. //定义terms聚合,指定字段为城市
  6. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms(termsAggName).field("city");
  7. String sumAggName = "my_sum";//sum聚合的名称
  8. //定义sum聚合,指定字段为价格
  9. SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum(sumAggName).field("price");
  10. //定义聚合的父子关系
  11. termsAggregationBuilder.subAggregation(sumAggregationBuilder);
  12. searchSourceBuilder.aggregation(termsAggregationBuilder);//添加聚合
  13. searchRequest.source(searchSourceBuilder);//设置查询请求
  14. //执行查询
  15. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  16. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  17. Terms terms = aggregations.get(termsAggName);//获取sum聚合返回的对象
  18. for (Terms.Bucket bucket : terms.getBuckets()) {
  19. String termsKey = bucket.getKey().toString();
  20. System.out.println("termsKey=" + termsKey);
  21. Sum sum = bucket.getAggregations().get(sumAggName);
  22. String key = sum.getName();//获取聚合名称
  23. double sumVal = sum.getValue();//获取聚合值
  24. System.out.println("key=" + key + ",count=" + sumVal);//打印结果
  25. }
  26. }

 2、多维度桶嵌套聚合查询

查询景区时搜索各城市的满房状态和平均价格等

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_city": {
  6. "terms": {
  7. "field": "city"
  8. },
  9. "aggs": {
  10. "grup_full_room": {
  11. "terms": {
  12. "field": "full"
  13. },
  14. "aggs": {
  15. "my_sum": {
  16. "avg": {
  17. "field": "price",
  18. "missing": 100
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. }

java客户端

  1. public void getExternalBucketAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String aggNameCity = "my_terms_city";//按城市聚合的名称
  5. //定义terms聚合,指定字段为城市
  6. TermsAggregationBuilder termsAggCity = AggregationBuilders.terms(aggNameCity).field("city");
  7. String aggNameFullRoom = "my_terms_full_room";//按满房状态聚合的名称
  8. //定义terms聚合,指定字段为满房状态
  9. TermsAggregationBuilder termsArrFullRoom = AggregationBuilders.terms(aggNameCity).field("full_room");
  10. String sumAggName = "my_sum";//sum聚合的名称
  11. //定义sum聚合,指定字段为价格
  12. SumAggregationBuilder sumAgg = AggregationBuilders.sum(sumAggName).field("price");
  13. //定义聚合的父子关系
  14. termsArrFullRoom.subAggregation(sumAgg);
  15. termsAggCity.subAggregation(termsArrFullRoom);
  16. searchSourceBuilder.aggregation(termsAggCity);//添加聚合
  17. searchRequest.source(searchSourceBuilder);//设置查询请求
  18. //执行查询
  19. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  20. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  21. Terms terms = aggregations.get(aggNameCity);//获取sum聚合返回的对象
  22. for (Terms.Bucket bucket : terms.getBuckets()) {//遍历第一层bucket
  23. String termsKeyCity = bucket.getKey().toString();//获取第一层bucket名称
  24. System.out.println("--------" + "termsKeyCity=" + termsKeyCity + "--------");
  25. Terms termsFullRom = bucket.getAggregations().get(aggNameCity);
  26. for (Terms.Bucket bucketFullRoom : termsFullRom.getBuckets()) {//遍历第二层bucket
  27. String termsKeyFullRoom = bucketFullRoom.getKeyAsString();//获取第二层bucket名称
  28. System.out.println("termsKeyFullRoom=" + termsKeyFullRoom);
  29. Sum sum = bucketFullRoom.getAggregations().get(sumAggName);//获取聚合指标
  30. String key = sum.getName();//获取聚合指标名称
  31. double sumVal = sum.getValue();//获取聚合指标值
  32. System.out.println("key=" + key + ",count=" + sumVal);//打印结果
  33. }
  34. }
  35. }

 3、地理位置聚合

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "my_agg": {
  6. "geo_distance": {
  7. "field": "location",
  8. "origin": {
  9. "lat": 39.915143,
  10. "lon": 116.4039
  11. }
  12. , "unit": "km",
  13. "ranges": [
  14. {
  15. "to": 2
  16. },
  17. {
  18. "from": 3,
  19. "to": 10
  20. },
  21. {
  22. "from": 10
  23. }
  24. ]
  25. },
  26. "aggs": {
  27. "my_min": {
  28. "min": {
  29. "field": "price",
  30. "missing": 200
  31. }
  32. }
  33. }
  34. }
  35. }
  36. }

java客户端

  1. public void geGeoDistanceAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String geoDistanceAggName = "location";//sum聚合的名称
  5. //定义GeoDistance聚合
  6. GeoDistanceAggregationBuilder geoDistanceAgg=AggregationBuilders.geoDistance(geoDistanceAggName,new GeoPoint(39.915143,116.4039));
  7. geoDistanceAgg.unit(DistanceUnit.KILOMETERS);
  8. geoDistanceAgg.field("location");
  9. //指定分桶范围规则
  10. geoDistanceAgg.addRange(new GeoDistanceAggregationBuilder.Range(null,0d,3d));
  11. geoDistanceAgg.addRange(new GeoDistanceAggregationBuilder.Range(null,3d,110d));
  12. geoDistanceAgg.addRange(new GeoDistanceAggregationBuilder.Range(null,110d,null));
  13. String minAggName = "my_min";//min聚合的名称
  14. //定义sum聚合,指定字段为价格
  15. MinAggregationBuilder minAgg = AggregationBuilders.min(minAggName).field("price");
  16. minAgg.missing(100);//指定默认值
  17. //定义聚合的父子关系
  18. geoDistanceAgg.subAggregation(minAgg);
  19. searchSourceBuilder.aggregation(geoDistanceAgg);//添加聚合
  20. searchRequest.source(searchSourceBuilder);//设置查询请求
  21. //执行查询
  22. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  23. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  24. ParsedGeoDistance range = aggregations.get(geoDistanceAggName);//获取GeoDistance聚合返回的对象
  25. for (Range.Bucket bucket : range.getBuckets()) {
  26. String termsKey = bucket.getKeyAsString();//获取bucket名称的字符串形式
  27. System.out.println("termsKey=" + termsKey);
  28. ParsedMin min = bucket.getAggregations().get(minAggName);
  29. String key = min.getName();//获取聚合名称
  30. double minVal = min.getValue();//获取聚合值
  31. System.out.println("key=" + key + ",min=" + minVal);//打印结果
  32. }
  33. }

三、聚合方式

1、先查询在聚合

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "query": {
  5. "term": {
  6. "city": {
  7. "value": "河南"
  8. }
  9. }
  10. },
  11. "aggs": {
  12. "my_agg": {
  13. "avg": {
  14. "field": "price"
  15. }
  16. }
  17. }
  18. }

java客户端

  1. public void getQueryAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String avgAggName = "my_avg";//avg聚合的名称
  5. //定义sum聚合,指定字段为价格
  6. AvgAggregationBuilder avgAgg = AggregationBuilders.avg(avgAggName).field("price");
  7. searchSourceBuilder.aggregation(avgAgg);//添加聚合
  8. searchSourceBuilder.query(QueryBuilders.termQuery("city", "北京"));//构建query查询
  9. searchRequest.source(searchSourceBuilder);//设置查询请求
  10. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索
  11. SearchHits searchHits = searchResponse.getHits();//获取搜索结果集
  12. System.out.println("---------------hit--------------");
  13. for (SearchHit searchHit : searchHits) {//遍历搜索结果集
  14. String index = searchHit.getIndex();//获取索引名称
  15. String id = searchHit.getId();//获取文档_id
  16. Float score = searchHit.getScore();//获取得分
  17. String source = searchHit.getSourceAsString();//获取文档内容
  18. System.out.println("index=" + index + ",id=" + id + ",source=" + source);//打印数据
  19. }
  20. System.out.println("---------------agg--------------");
  21. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  22. ParsedAvg avg = aggregations.get(avgAggName);//获取sum聚合返回的对象
  23. String avgName = avg.getName();//获取聚合名称
  24. double avgVal = avg.getValue();//获取聚合值
  25. System.out.println("avgName=" + avgName + ",avgVal=" + avgVal);//打印结果
  26. }

 2、前过滤器

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "query": {
  5. "term": {
  6. "city": {
  7. "value": "河南"
  8. }
  9. }
  10. },
  11. "aggs": {
  12. "my_agg": {
  13. "filter": {
  14. "term": {
  15. "full": false
  16. }
  17. },
  18. "aggs": {
  19. "my_avg": {
  20. "avg": {
  21. "field": "price"
  22. }
  23. }
  24. }
  25. }
  26. }
  27. }

java客户端

  1. public void getFilterAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String filterAggName = "my_terms";//sum聚合的名称
  5. TermQueryBuilder termQueryBuilder=QueryBuilders.termQuery("full",true);
  6. FilterAggregationBuilder filterAggregationBuilder=AggregationBuilders.filter(filterAggName,termQueryBuilder);
  7. String avgAggName = "my_avg";//avg聚合的名称
  8. //定义sum聚合,指定字段为价格
  9. AvgAggregationBuilder avgAgg= AggregationBuilders.avg(avgAggName).field("price");
  10. filterAggregationBuilder.subAggregation(avgAgg);//为filter聚合添加子聚合
  11. searchSourceBuilder.aggregation(filterAggregationBuilder);//添加聚合
  12. searchSourceBuilder.query(QueryBuilders.termQuery("city", "北京"));//构建term查询
  13. searchRequest.source(searchSourceBuilder);//设置查询请求
  14. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索
  15. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  16. ParsedFilter filter = aggregations.get(filterAggName);//获取sum聚合返回的对象
  17. Avg avg =filter.getAggregations().get(avgAggName);
  18. String key = avg.getName();//获取聚合名称
  19. double avgVal = avg.getValue();//获取聚合值
  20. System.out.println("key=" + key + ",avgVal=" + avgVal);//打印结果
  21. }

 3、后过滤器

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "query": {
  5. "match": {
  6. "title": "山"
  7. }
  8. },
  9. "post_filter": {
  10. "term": {
  11. "city": "北京"
  12. }
  13. },
  14. "aggs": {
  15. "my_avg": {
  16. "avg": {
  17. "field": "price",
  18. "missing": 100
  19. }
  20. }
  21. }
  22. }

java客户端

  1. public void getPostFilterAggSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String avgAggName = "my_avg";//avg聚合的名称
  5. //定义sum聚合,指定字段为价格
  6. AvgAggregationBuilder avgAgg= AggregationBuilders.avg(avgAggName).field("price");
  7. avgAgg.missing(200);//设置默认值为200
  8. searchSourceBuilder.aggregation(avgAgg);//添加聚合
  9. searchSourceBuilder.query(QueryBuilders.matchQuery("title", "假日"));//构建term查询
  10. TermQueryBuilder termQueryBuilder=QueryBuilders.termQuery("city","北京");
  11. searchSourceBuilder.postFilter(termQueryBuilder);
  12. searchRequest.source(searchSourceBuilder);//设置查询请求
  13. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索
  14. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  15. Avg avg =aggregations.get(avgAggName);
  16. String key = avg.getName();//获取聚合名称
  17. double avgVal = avg.getValue();//获取聚合值
  18. System.out.println("key=" + key + ",avgVal=" + avgVal);//打印结果
  19. }

四、聚合排序

1、 按文档计数排序

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_city": {
  6. "terms": {
  7. "field": "city",
  8. "order": {
  9. "_count": "asc"
  10. }
  11. },
  12. "aggs": {
  13. "my_avg": {
  14. "avg": {
  15. "field": "price",
  16. "missing": 100
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }

java客户端

  1. public void getAggDocCountOrderSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String termsAggName = "my_terms";//sum聚合的名称
  5. //定义terms聚合,指定字段为城市
  6. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms(termsAggName).field("city");
  7. BucketOrder bucketOrder=BucketOrder.count(true);
  8. termsAggregationBuilder.order(bucketOrder);
  9. String avgAggName = "my_avg";//avg聚合的名称
  10. //定义sum聚合,指定字段为价格
  11. SumAggregationBuilder avgAgg = AggregationBuilders.sum(avgAggName).field("price");
  12. //定义聚合的父子关系
  13. termsAggregationBuilder.subAggregation(avgAgg);
  14. searchSourceBuilder.aggregation(termsAggregationBuilder);//添加聚合
  15. searchRequest.source(searchSourceBuilder);//设置查询请求
  16. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索
  17. SearchHits searchHits = searchResponse.getHits();//获取搜索结果集
  18. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  19. Terms terms = aggregations.get(termsAggName);//获取sum聚合返回的对象
  20. for (Terms.Bucket bucket : terms.getBuckets()) {
  21. String bucketKey = bucket.getKey().toString();
  22. System.out.println("termsKey=" + bucketKey);
  23. Sum sum = bucket.getAggregations().get(avgAggName);
  24. String key = sum.getName();//获取聚合名称
  25. double sumVal = sum.getValue();//获取聚合值
  26. System.out.println("key=" + key + ",count=" + sumVal);//打印结果
  27. }
  28. }

2、 按照聚合指标排序

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_city": {
  6. "terms": {
  7. "field": "city",
  8. "order": {
  9. "my_avg": "asc"
  10. }
  11. },
  12. "aggs": {
  13. "my_avg": {
  14. "avg": {
  15. "field": "price",
  16. "missing": 200
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }

java客户端

  1. public void getAggMetricsOrderSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String termsAggName = "my_terms";//sum聚合的名称
  5. //定义terms聚合,指定字段为城市
  6. String avgAggName = "my_avg";//avg聚合的名称
  7. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms(termsAggName).field("city");
  8. BucketOrder bucketOrder=BucketOrder.aggregation(avgAggName,true);
  9. termsAggregationBuilder.order(bucketOrder);
  10. //定义sum聚合,指定字段为价格
  11. AvgAggregationBuilder avgAgg = AggregationBuilders.avg(avgAggName).field("price");
  12. //定义聚合的父子关系
  13. termsAggregationBuilder.subAggregation(avgAgg);
  14. searchSourceBuilder.aggregation(termsAggregationBuilder);//添加聚合
  15. searchRequest.source(searchSourceBuilder);//设置查询请求
  16. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索
  17. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  18. Terms terms = aggregations.get(termsAggName);//获取聚合返回的对象
  19. for (Terms.Bucket bucket : terms.getBuckets()) {
  20. String bucketKey = bucket.getKey().toString();
  21. System.out.println("termsKey=" + bucketKey);
  22. Avg avg = bucket.getAggregations().get(avgAggName);
  23. String key = avg.getName();//获取聚合名称
  24. double avgVal = avg.getValue();//获取聚合值
  25. System.out.println("key=" + key + ",avgVal=" + avgVal);//打印结果
  26. }
  27. }

 3、 分组key排序

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_city": {
  6. "terms": {
  7. "field": "city",
  8. "order": {
  9. "_key": "asc"
  10. }
  11. },
  12. "aggs": {
  13. "my_avg": {
  14. "avg": {
  15. "field": "price",
  16. "missing": 200
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }

java客户端

  1. public void getAggKeyOrderSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String termsAggName = "my_terms";//sum聚合的名称
  5. //定义terms聚合,指定字段为城市
  6. String avgAggName = "my_avg";//avg聚合的名称
  7. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms(termsAggName).field("city");
  8. BucketOrder bucketOrder=BucketOrder.key(true);
  9. termsAggregationBuilder.order(bucketOrder);
  10. //定义sum聚合,指定字段为价格
  11. SumAggregationBuilder avgAgg = AggregationBuilders.sum(avgAggName).field("price");
  12. //定义聚合的父子关系
  13. termsAggregationBuilder.subAggregation(avgAgg);
  14. searchSourceBuilder.aggregation(termsAggregationBuilder);//添加聚合
  15. searchRequest.source(searchSourceBuilder);//设置查询请求
  16. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索
  17. SearchHits searchHits = searchResponse.getHits();//获取搜索结果集
  18. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  19. Terms terms = aggregations.get(termsAggName);//获取sum聚合返回的对象
  20. for (Terms.Bucket bucket : terms.getBuckets()) {
  21. String bucketKey = bucket.getKey().toString();
  22. System.out.println("termsKey=" + bucketKey);
  23. Sum sum = bucket.getAggregations().get(avgAggName);
  24. String key = sum.getName();//获取聚合名称
  25. double sumVal = sum.getValue();//获取聚合值
  26. System.out.println("key=" + key + ",count=" + sumVal);//打印结果
  27. }
  28. }

五、聚合分页

1、Top hits 聚合分页

  1. GET /nandao_scenic/_search
  2. {
  3. "size": 0,
  4. "query": {
  5. "match": {
  6. "title": "山"
  7. }
  8. },
  9. "aggs": {
  10. "group_city": {
  11. "terms": {
  12. "field": "city"
  13. },
  14. "aggs": {
  15. "my_avg": {
  16. "top_hits": {
  17. "size": 10
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }

java客户端

  1. public void getAggTopHitsSearch() throws IOException {
  2. SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. String termsAggName = "my_terms";//sum聚合的名称
  5. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms(termsAggName).field("city");
  6. BucketOrder bucketOrder=BucketOrder.key(true);
  7. termsAggregationBuilder.order(bucketOrder);
  8. String topHitsAggName = "my_top";//avg聚合的名称
  9. TopHitsAggregationBuilder topHitsAgg=AggregationBuilders.topHits(topHitsAggName);
  10. topHitsAgg.size(3);
  11. //定义聚合的父子关系
  12. termsAggregationBuilder.subAggregation(topHitsAgg);
  13. searchSourceBuilder.aggregation(termsAggregationBuilder);//添加聚合
  14. searchSourceBuilder.query(QueryBuilders.matchQuery("title","金都"));
  15. searchRequest.source(searchSourceBuilder);//设置查询请求
  16. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索
  17. Aggregations aggregations = searchResponse.getAggregations();//获取聚合结果
  18. Terms terms = aggregations.get(termsAggName);//获取sum聚合返回的对象
  19. for (Terms.Bucket bucket : terms.getBuckets()) {
  20. String bucketKey = bucket.getKey().toString();
  21. System.out.println("termsKey=" + bucketKey);
  22. TopHits topHits = bucket.getAggregations().get(topHitsAggName);
  23. SearchHit[] searchHits=topHits.getHits().getHits();
  24. for(SearchHit searchHit:searchHits){
  25. System.out.println(searchHit.getSourceAsString());
  26. }
  27. }
  28. }

此种分页影响性能,优化方向可以一次性存到redis,然后再redis里面做分页缓存

stringRedisTemplate.opsForList().range(key,0, 10); 

  2、Collapse 聚合分页

  1. GET /nandao_scenic/_search
  2. {
  3. "from": 0,
  4. "size": 5,
  5. "query": {
  6. "match": {
  7. "title": "山"
  8. }
  9. },
  10. "collapse": {
  11. "field": "city"
  12. }
  13. }

 java客户端

  1. public void getCollapseAggSearch() throws IOException{
  2. //按照spu进行分组
  3. CollapseBuilder collapseBuilder = new CollapseBuilder("city");//按照城市进行分组
  4. SearchRequest searchRequest = new SearchRequest();//新建搜索请求
  5. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  6. searchSourceBuilder.query(QueryBuilders.matchQuery("title", "金都"));//新建match查询
  7. searchSourceBuilder.collapse(collapseBuilder);//设置折叠
  8. searchRequest.source(searchSourceBuilder);//设置查询
  9. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索
  10. SearchHits searchHits = searchResponse.getHits();//获取搜索结果集
  11. for (SearchHit searchHit : searchHits) {//遍历搜索结果集
  12. String index = searchHit.getIndex();//获取索引名称
  13. String id = searchHit.getId();//获取文档_id
  14. Float score = searchHit.getScore();//获取得分
  15. String source = searchHit.getSourceAsString();//获取文档内容
  16. System.out.println("index=" + index + ",id=" + id + ",score=" + score + ",source=" + source);//打印数据
  17. }
  18. }

到此,聚合相关的查询分享完毕,大家一定要结合项目多多实战练习,定会早日掌握,下篇我们分析文本搜索相关的内容,敬请期待。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/38024
推荐阅读
相关标签
  

闽ICP备14008679号