ElasticSearch(十)【聚合查询】

约定不等于承诺〃 2024-04-06 10:35 219阅读 0赞

十、聚合查询


上一篇文章《ElasticSearch - SpringBoot整合》

简介

聚合英文为Aggregation Aggs,是ES除搜索功能外提供的针对ES数据做统计分析的功能。聚合有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于SQL中的group by再加一些函数方法的操作

注意】text类型是不支持聚合的

10.1 Kibana操作聚合查询

下面使用size省略查询结果的输出

terms基于某个字段分组

  1. # 非组名字可以自定义price_group
  2. GET /products/_search
  3. {
  4. "query": {
  5. "match_all": {
  6. }
  7. },
  8. "size": 0,
  9. "aggs": {
  10. "price_group": {
  11. "terms": {
  12. "field": "price"
  13. }
  14. }
  15. }
  16. }

在这里插入图片描述

最大值、最小值

  1. # 最大值
  2. GET /products/_search
  3. {
  4. "query": {
  5. "match_all": {
  6. }
  7. },
  8. "size": 0,
  9. "aggs": {
  10. "max_price": {
  11. "max": {
  12. "field": "price"
  13. }
  14. }
  15. }
  16. }
  17. # 最小值
  18. GET /products/_search
  19. {
  20. "query": {
  21. "match_all": {
  22. }
  23. },
  24. "size": 0,
  25. "aggs": {
  26. "min_price": {
  27. "min": {
  28. "field": "price"
  29. }
  30. }
  31. }
  32. }

在这里插入图片描述

在这里插入图片描述

sum求和、avg平均值

  1. # 求和
  2. GET /products/_search
  3. {
  4. "query": {
  5. "match_all": {
  6. }
  7. },
  8. "size": 0,
  9. "aggs": {
  10. "sum_price": {
  11. "sum": {
  12. "field": "price"
  13. }
  14. }
  15. }
  16. }
  17. # 平均值
  18. GET /products/_search
  19. {
  20. "query": {
  21. "match_all": {
  22. }
  23. },
  24. "size": 0,
  25. "aggs": {
  26. "avg_price": {
  27. "avg": {
  28. "field": "price"
  29. }
  30. }
  31. }
  32. }

在这里插入图片描述

在这里插入图片描述

10.2 RestHighLevelClient 操作聚合查询

  1. package com.vinjcent;
  2. import org.elasticsearch.action.search.SearchRequest;
  3. import org.elasticsearch.action.search.SearchResponse;
  4. import org.elasticsearch.client.RequestOptions;
  5. import org.elasticsearch.client.RestHighLevelClient;
  6. import org.elasticsearch.index.query.QueryBuilders;
  7. import org.elasticsearch.search.aggregations.AggregationBuilders;
  8. import org.elasticsearch.search.aggregations.Aggregations;
  9. import org.elasticsearch.search.aggregations.bucket.terms.ParsedDoubleTerms;
  10. import org.elasticsearch.search.aggregations.bucket.terms.Terms;
  11. import org.elasticsearch.search.aggregations.metrics.ParsedSum;
  12. import org.elasticsearch.search.builder.SearchSourceBuilder;
  13. import org.junit.jupiter.api.Test;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Qualifier;
  16. import org.springframework.boot.test.context.SpringBootTest;
  17. import java.io.IOException;
  18. import java.util.List;
  19. @SpringBootTest
  20. public class RestHighLevelClientAggregationTests {
  21. private final RestHighLevelClient restHighLevelClient;
  22. @Autowired
  23. public RestHighLevelClientAggregationTests(@Qualifier("elasticsearchClient") RestHighLevelClient restHighLevelClient) {
  24. this.restHighLevelClient = restHighLevelClient;
  25. }
  26. /**
  27. * 基于 term 类型进行聚合,并且基于字段进行分组聚合
  28. * @throws IOException
  29. */
  30. @Test
  31. public void testAggs() throws IOException {
  32. // 1.创建请求对象
  33. SearchRequest searchRequest = new SearchRequest("products");
  34. // 2.创建查询对象
  35. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  36. searchSourceBuilder
  37. .query(QueryBuilders.matchAllQuery())
  38. .aggregation(AggregationBuilders.terms("price_group").field("price")) // 用于设置聚合处理
  39. .size(0);
  40. // 3.为请求对象配置查询对象
  41. searchRequest.source(searchSourceBuilder);
  42. // 4.接收响应对象
  43. SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  44. // 5.处理聚合结果
  45. Aggregations aggregations = searchResponse.getAggregations();
  46. // 根据字段类型,转移
  47. ParsedDoubleTerms price_group = aggregations.get("price_group");
  48. // 解析桶里的内容
  49. List<? extends Terms.Bucket> buckets = price_group.getBuckets();
  50. for (Terms.Bucket bucket : buckets) {
  51. System.out.println(bucket.getKey() + " " + bucket.getDocCount());
  52. }
  53. }
  54. /**
  55. * 基于 sum(ParsedSum)、avg(ParsedAvg)、max(ParsedMax)、min(ParsedMin) 函数聚合,
  56. * @throws IOException
  57. */
  58. @Test
  59. public void testAggsFunction() throws IOException {
  60. // 1.创建请求对象
  61. SearchRequest searchRequest = new SearchRequest("products");
  62. // 2.创建查询对象
  63. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  64. searchSourceBuilder
  65. .query(QueryBuilders.matchAllQuery())
  66. .aggregation(AggregationBuilders.sum("sum_price").field("price")) // 用于设置聚合处理,sum、avg、max、min
  67. .size(0);
  68. // 3.为请求对象配置查询对象
  69. searchRequest.source(searchSourceBuilder);
  70. // 4.接收响应对象
  71. SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  72. // 5.处理聚合结果
  73. Aggregations aggregations = searchResponse.getAggregations();
  74. // 根据字段类型,转移 ParsedSum、ParsedAvg、ParsedMax、ParsedMin
  75. ParsedSum sum_price = aggregations.get("sum_price");
  76. // 解析桶里的内容
  77. System.out.println(sum_price.getValue());
  78. }
  79. }

下一篇文章《ElasticSearch - 集群搭建》

发表评论

表情:
评论列表 (有 0 条评论,219人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ElasticSearch java API - 聚合查询

    今天给大家转载一篇关于ES聚合相关的文章,是利用Java API实现的。因为公司最近要上搜索引擎相关的功能,所以最近一直在学习es相关的内容。基本内容有:组合查询、聚合、分页、