• 数据聚合——DSL&RestAPI


    聚合(aggregations可以让我们极其方便的实现对数据的统计、分析、运算。

    1.1.聚合的种类

    聚合常见的有三类:

    • 桶(Bucket)聚合:用来对文档做分组

      • TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组

      • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

    • 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等

      • Avg:求平均值

      • Max:求最大值

      • Min:求最小值

      • Stats:同时求max、min、avg、sum等

    • 管道(pipeline)聚合:其它聚合的结果为基础做聚合

    注意:参加聚合的字段必须是keyword、日期、数值、布尔类型

    1.2.DSL实现聚合

    1.2.1.Bucket聚合语法(桶聚合)

    相当于mysql中的分组

    语法如下:

    1. # 聚合 - 桶聚合(bucket)- terms(分组汇总)
    2. GET /hotel/_search
    3. {
    4.   "size": 0,  // 设置size为0,结果中不包含文档详情,只包含聚合结果
    5.   "aggs": { // 定义聚合,固定写法
    6.     "brandAgg": { //给聚合起个名字
    7.       "terms": { // 聚合的类型,按照品牌值聚合,所以选择terms
    8.         "field""brand", // 指定以哪个字段进行分组汇总
    9.         "size": 20 // 希望获取的聚合结果数量
    10.       }
    11.     }
    12.   }
    13. }

     

    1.2.2.聚合结果排序

    默认情况下,Bucket聚合会统计Bucket内的文档数量,记为count,并且按照count降序排序。

    我们可以指定order属性,自定义聚合的排序方式:

    1. GET /hotel/_search
    2. {
    3.   "size": 0, 
    4.   "aggs": {
    5.     "brandAgg": {
    6.       "terms": {
    7.         "field""brand",
    8.         "order": {
    9.           "_count""asc" // 按照_count升序排列
    10.         },
    11.         "size": 20
    12.       }
    13.     }
    14.   }
    15. }

    1.2.3.限定聚合范围

    1. # 聚合 - 桶聚合(bucket)- terms(分组汇总)
    2. # 限定数据范围
    3. # 在聚合之前先按照条件过滤一次
    4. GET /hotel/_search
    5. {
    6. "query": {
    7. "term": {
    8. "city": {
    9. "value": "北京"
    10. }
    11. }
    12. },
    13. "size": 0,
    14. "aggs": {
    15. "brandAgg": {
    16. "terms": {
    17. "field": "brand",
    18. "size": 50
    19. }
    20. }
    21. }
    22. }

    1.2.4.Metric聚合语法(度量聚合)

    用以计算一些值,比如:最大值、最小值、平均值等

    语法如下:

    1. # 聚合 - 度量聚合(metric)
    2. # 计算最大值,最小值
    3. # stats 表示要计算数值
    4. # field 按照哪个字段进行聚合
    5. GET /hotel/_search
    6. {
    7. "size": 0,
    8. "aggs": {
    9. "scoreAgg": {
    10. "stats": {
    11. "field": "score"
    12. }
    13. }
    14. }
    15. }

     不过,一般度量聚合与桶聚合一起使用

    1. # 聚合 - 度量聚合(metric)
    2. # 与桶聚合进行嵌套使用
    3. # 先按照酒店品牌分组
    4. # "size": 0 表示不显示文档详情
    5. # "size": 50 显示的数量
    6. # 在分组的基础上再计算总数和最值
    7. GET /hotel/_search
    8. {
    9. "size": 0,
    10. "aggs": {
    11. "brandAgg": {
    12. "terms": {
    13. "field": "brand",
    14. "size": 50
    15. },
    16. "aggs": {
    17. "scoreAgg": {
    18. "stats": {
    19. "field": "score"
    20. }
    21. }
    22. }
    23. }
    24. }
    25. }

     1.3.RestAPI实现聚合

    请求

     聚合结果解析

     代码实现:

    1. @Test
    2. void testAggs() throws Exception{
    3. //初始化RestHighLevelClient:
    4. RestHighLevelClient client = new RestHighLevelClient(
    5. RestClient.builder(HttpHost.create("http://192.168.177.132:9200"))
    6. );
    7. //创建请求
    8. //hotel 是查询的文档名
    9. SearchRequest request = new SearchRequest("hotel");
    10. //设置参数
    11. //AggregationBuilders 工具类
    12. //terms 桶聚合--分组汇总,聚合的类型,按照品牌值聚合
    13. //field 按照哪个字段分组
    14. //size(50) 显示的数量
    15. request.source().size(0);//不在结果中包含文档详情
    16. request.source().aggregation(
    17. AggregationBuilders.terms("brandAgg").field("brand").size(50)
    18. );
    19. //执行请求
    20. //第一个参数:创建的请求,第二个参数:是否还有其他的选项,一般选DEFAULT
    21. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    22. //解析响应
    23. Aggregations aggregations = response.getAggregations();
    24. Terms brandAgg = aggregations.get("brandAgg");
    25. Listextends Terms.Bucket> buckets = brandAgg.getBuckets();
    26. for (Terms.Bucket bucket : buckets) {
    27. String key = bucket.getKeyAsString();
    28. long count = bucket.getDocCount();
    29. System.out.println(key + ":" + count);
    30. }
    31. }

  • 相关阅读:
    wordpress实时在线聊天室
    Android事件分发机制
    (BGV12)方案初学
    基于Python实现制作的接金币小游戏
    IP地址定位的特点
    【LeetCode刷题-双指针】--16.最接近的三数之和
    [架构之路-239]:目标系统 - 纵向分层 - 中间件middleware
    Maven:命令行
    【web-攻击数据存储区】(6.2)SQL注入
    网络编程
  • 原文地址:https://blog.csdn.net/LINING_GG/article/details/128210653