首页 > 其他分享 >【Elasticsearch】聚合分析

【Elasticsearch】聚合分析

时间:2022-12-14 20:36:34浏览次数:53  
标签:分析 search 聚合 age field Elasticsearch aggs size


  1. 聚合分析
  1. 什么是聚合分析
  1. 聚合分析,英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能
  2. ES提供多种分析方式: Bucket、Metric、Pipeline、Matrix 等 
  1. Bucket,分桶类型,类似SQL语法中的group by语法。
  2. Metric,指标分析类型,如计算最大值,最小值,平均值等等。
  3. Pipeline,管道分析类型,基于上一级的聚合分析结果进行再分析。
  4. Matrix,矩阵分析类型。
  5. Metric聚合分析(指标分析)
  1. Metric分析分类
  1. 单值分析:只输出一个分析结果。
  1. min(最小值)
  2. max(最大值)
  3. avg(平均值)
  4. sum(总和)
  5. cardinality(计算数目的,类似sql中的distinct count)
  1. 多值分析,输出多个分析结果
  1. stats(多样统计分析,可以一次性得到最小值,最大值,平均值,中值等等)、
  2. extended stats、percentile(百分位数的统计)、
  3. percentile rank、top hits(排在前面的结果列表)
  4. 单值:最小值

GET /czxy2/_search

{

  "size": 0, // 不需要返回文档列表

  "aggs": {

    "min_age": { // 自定义聚合名称

      "min": { // 聚合类型

        "field": "age"

      }

    }

  }

}

  1. 单值:最大值

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "max_age": {

      "max": {

        "field": "age"

      }

    }

  }

}

  1. 单值:平均值

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "avg_age": {

      "avg": {

        "field": "age"

      }

    }

  }

}

  1. 单值:求和

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "sum_age": {

      "sum": {

        "field": "age"

      }

    }

  }

}

  1. 单值:多个结果

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "min_age": {

      "min": {

        "field": "age"

      }

    },

    "sum_age": {

      "sum": {

        "field": "age"

      }

    }

  }

}

  1. 多值:Stats
  1. 多值分析之Stats,返回一系列数值类型的统计值,包含min、max、avg、sum和count

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "stats_age": {

      "stats": {

        "field": "age"

      }

    }

  }

}

  1. 多值:Extended Stats
  1. 多值分析之Extended Stats,对stats的扩展,包含了更多的统计数据,如方差,标准差等等。

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "stats_age": {

      "extended_stats": {

        "field": "age"

      }

    }

  }

}

  1. 多值:percentile
  1. 多值分析之percentile,百分位数统计,percentiles是关键词。
  2. 计算99%数据年龄在多少以下(50%年龄的21岁以下)

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "per_age": {

      "percentiles": {

        "field": "age",

        "percents": [

          1,

          5,

          25,

          50,

          75,

          95,

          99

        ]

      }

    }

  }

}

【Elasticsearch】聚合分析_System

 

  1. 多值:percentile_ranks
  1. 14岁及其以下,所占的比例

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "per_rank_age": {

      "percentile_ranks": {

        "field": "age",

        "values": [

          14,

          18,

          26

        ]

      }

    }

  }

}

  1. 多值:top hits
  1. 多值分析之top hits,一般用于分桶后获取该桶内最匹配的顶部文档列表,即详情数据
  2. top_hits的作用就是在每个组下面的数据进行筛选
  1. size:每组显示的数据
  2. sort:每组的排序

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "group_agg": {

      "terms": {

        "field": "age",

        "size": 10

      },

      "aggs": {

        "top_data": {

          "top_hits": {

            "size": 2,

            "sort": [

              {

                "_id": {

                  "order": "desc"

                }

              }

            ]

          }

        }

      }

    }

  }

}

  1. Bucket 聚合分析(分桶)
  1. Bucket,分桶类型,类似SQL语法中的group by语法
  2. Bucked,意为桶,即按照一定的规则将文档分配到不同的桶中,达到分类分析的目的。
  3. 分桶策略:Terms、Range、Date Range、Histogram、Date Histogram。
  1. Terms
  1. Bucket聚合分析之Terms,该分桶策略最简单了,直接按照term来分桶,如果是text类型,则按照分词后的结果分桶。
  2. 按照省份分桶

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "city_bucket": {

      "terms": {

        "field": "city",

        "size": 10

      }

    }

  }

}

  1. 按照用户名分桶

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "username_bucket": {

      "terms": {

        "field": "username",

        "size": 10

      }

    }

  }

}

【Elasticsearch】聚合分析_数据_02

 

  1. text的聚合操作,使用fielddata进行处理,需要单独开启

PUT /czxy2/_mapping/user

{

  "properties": {

    "username": {

      "type":     "text",

      "analyzer": "ik_max_word",

      "fielddata": true

    }

  }

}

  1. Range

Bucket聚合分析之Range,通过指定数值的范围来设定分桶规则。

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "age_range": {

      "range": {

        "field": "age",

        "ranges": [

          {

            "to": 15

          },

          {

            "from": 15,

            "to": 20

          },

          {

            "from": 20

          }

        ]

      }

    }

  }

}

  1. Histogram
  1. Bucket聚合分析之Histogram,直方图,以固定间隔的策略来分割数据。
  1. interval:指定间隔大小
  2. extended_bounds:指定数据范围

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "age_hist": {

      "histogram": {

        "field": "age",

        "interval": 5,

        "extended_bounds": {

          "min": 10,

          "max": 30

        }

      }

    }

  }

}

  1. bucket和metric聚合分析整合
  1. Bucket聚合分析允许通过添加子分析来进一步进行分析,该子分析可以是Bucket也可以是Metric。这也使得es的聚合分析能力变得异常强大。

GET /czxy2/_search

{

  "size": 0,

  "aggs": {

    "city_bucket": {

      "terms": {

        "field": "city",

        "size": 10

      },

      "aggs": {

        "age": {

          "stats": {

            "field": "age"

          }

        }

      }

    }

  }

}

  1. 聚合

桶就是分组,比如这里我们按照品牌brand进行分组:

GET /item/_search

{

  "size": 0,

  "aggs": {

    "brands": {

      "terms": {

        "field": "brand",

        "size": 10

      }

    }

  }

}

@Test

public void testAgg() {

    //1 聚合条件

    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

    queryBuilder.addAggregation(AggregationBuilders.terms("brands").field("brand"));

    //2 查询获得聚合对象

    AggregatedPage<Item> aggPage = (AggregatedPage<Item>)this.itemRepository.search(queryBuilder.build());

    //3 解析结果:获得brands聚合内容

    ParsedStringTerms agg = (ParsedStringTerms) aggPage.getAggregation("brands");

    //4 遍历内容

    List<? extends Terms.Bucket> buckets = agg.getBuckets();

    for (Terms.Bucket bucket : buckets) {

        System.out.print(bucket.getKeyAsString() + " : ");

        System.out.println(bucket.getDocCount());

    }

}

关键API:

  • AggregationBuilders:聚合的构建工厂类。所有聚合都由这个类来构建,看看他的静态方法:

 

  • AggregatedPage:聚合查询的结果类。它是Page<T>的子接口:

【Elasticsearch】聚合分析_sed_03

 

 AggregatedPage在Page功能的基础上,拓展了与聚合相关的功能,它其实就是对聚合结果的一种封装,大家可以对照聚合结果的JSON结构来看。

 

【Elasticsearch】聚合分析_数据_04

 

 而返回的结果都是Aggregation类型对象,不过根据字段类型不同,又有不同的子类表示

 

【Elasticsearch】聚合分析_数据_05

 

我们看下页面的查询的JSON结果与Java类的对照关系:

 

【Elasticsearch】聚合分析_System_06

 

  1. 嵌套聚合

GET /item/_search

{

  "size": 0,

  "aggs": {

    "brands": {

      "terms": {

        "field": "brand",

        "size": 10

      },

      "aggs": {

        "price_range": {

          "range": {

            "field": "price",

            "ranges": [

              {

                "to": 3300

              },

              {

                "from": 3300,

                "to": 4000

              },

              {

                "from": 4000

              }

            ]

          }

        }

      }

    }

  }

}

@Test

public void testSubAgg() {

    //1 聚合条件

    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

    //1.1 设置品牌聚合

    TermsAggregationBuilder brandAgg = AggregationBuilders.terms("brands").field("brand");

    //1.2 设置子聚合数据

    RangeAggregationBuilder priceAgg = AggregationBuilders.range("price_range").field("price");

    priceAgg.addUnboundedTo(3300).addRange(3300,4000).addUnboundedFrom(4000);

    //1.3 父子聚合

    brandAgg.subAggregation(priceAgg);

    //1.4 添加聚合条件

    queryBuilder.addAggregation(brandAgg);

    //2 查询获得聚合对象

    AggregatedPage<Item> aggPage = (AggregatedPage<Item>)this.itemRepository.search(queryBuilder.build());

    //3 解析结果:获得brands聚合内容

    ParsedStringTerms agg = (ParsedStringTerms) aggPage.getAggregation("brands");

    //4 遍历内容

    List<? extends Terms.Bucket> buckets = agg.getBuckets();

    for (Terms.Bucket bucket : buckets) {

        System.out.print(bucket.getKeyAsString() + " : ");

        System.out.println(bucket.getDocCount());

        ParsedStringTerms.ParsedBucket parsedBucket = (ParsedStringTerms.ParsedBucket) bucket;

        Aggregations aggregations = parsedBucket.getAggregations();

        ParsedRange priceParsedRange = (ParsedRange)aggregations.get("price_range");

        List<? extends Range.Bucket> rangebuckets = priceParsedRange.getBuckets();

        for (Range.Bucket rangebucket : rangebuckets) {

            System.out.print(rangebucket.getKeyAsString() + ": \t\t");

            System.out.print(rangebucket.getFrom() + "\t");

            System.out.print(rangebucket.getTo() + "\t");

            System.out.println(rangebucket.getDocCount());

        }

    }

}

标签:分析,search,聚合,age,field,Elasticsearch,aggs,size
From: https://blog.51cto.com/u_15680317/5938350

相关文章

  • 评价模型 - 层次分析法
    应用场景:决策模型(通过赋权,然后利用加权值来进行决策)、给指标赋权准则层:先给这5个部分进行\(5\times5\)的赋权(比如,景色相比费用略微重要,赋成3),然后对这个矩阵进行求解,得......
  • [JAVA反序列化]Javacc链1分析
    文章目录​​写在前面​​​​动态代理​​​​简单介绍​​​​动态代理的实现​​​​JavaCC链1分析​​​​参考文章​​写在前面这几天算是好好一边审计PHP的一些CMS一......
  • 项目分析
    1、项目背景学习过SpringBoot和SpringCloud技术之后我们知道,SpringBoot框架可以让我们快速开发一个项目,特别适合小项目或者单一服务的开发,这意味着诸如CRM(CustomerRel......
  • 常见系统问题分析方法
    一常见日志关键字1.AppCrashFATALEXCEPTION:2.SystemCrash***FATALEXCEPTIONINSYSTEMPROCESS:574574IServiceManager:service‘statusbar’died574574......
  • 深入分析JavaWeb 25 -- 自定义标签开发案例和打包自定义标签库
    一、开发标签库案例1.1、开发防盗链标签1、编写标签处理器类:RefererTag.javapackageme.gacl.web.simpletag;importjava.io.IOException;importjavax.servlet.http.Ht......
  • Elasticsearch+Logstash+Kiabana 日志管理
       日志是分析线上问题的重要手段,通常我们会把日志输出到控制台或者本地文件中,排查问题时通过根据关键字搜索本地日志,但越来越多的公司,项目开发中采用分布式的架构,日......
  • 数学分析笔记【3】数集的扩充(2)
    有理数集上一篇中,我们已经构造了整数集\(\mathbb{Z}\).现在,我们令\(\hat{\rm{Q}}=\mathbb{Z}\times(\mathbb{Z}-\{0\})\).现在,我们定义\(\hat{\rm{Q}}\)上的相等......
  • 【校招VIP】【约起来】活动发布模块:产品原型——产品需求要点分析
    VIP的服务,不一样的校招。今天,我们来看商业实战项目的第二个章节,真正到模块开发里面。 第一个模块叫活动发布模块,和正常的商业项目一样,把任务分解成多个模块,从最核心的模......
  • Hystrix原理分析
    通过上面两节我们了解了Hystrix的基本使用,下面我们将通过Hystrix官方的工作流程(如图所示)来解析Hystrix是怎样实现服务熔断】  图中执行的步骤如下:①创建一个Hystri......
  • [pdf]2021年170套数学分析高等代数试题及其29个分类774页及做题版
    [pdf]2021年170套数学分析高等代数试题及其29个分类774页及做题版 ......