【Elasticsearch学习笔记-基础篇3】Elasticsearch 聚集(aggregation)与过滤器(filter)

前言

这篇主要总结一下 es 的聚集(aggregation)与过滤器(filter),不会涉及到具体的 API 操作与示例,主要总结概念性与本人理解的内容。以下是主要内容地图:
在这里插入图片描述
在写聚集之前,我们先来看一下过滤器。

过滤器(Filter)

首先,我们先来看一下查询与过滤器的区别。

在过滤时,es 会建立一个二进制的比特集合(bitset),来表示一个文档是否匹配过滤器。
在这里插入图片描述
上图即是 A、C 匹配。

  • 过滤器的查找是二元性的,也就是只有匹配与不匹配两种结果。如果匹配直接返回结果,不匹配看下一个文档。
  • 查询的查找是需要打分的,如果文档匹配,之后计算得分,返回结果。

因此,过滤器要比在同一搜索中,只查询不过滤的语句要快得多。 所以我们得知,如果能很好的应用过滤器,即先限定打分范围再打分,是可以优化查询语句的。这也符合 es 所有复杂查询、复杂打分的优化思路。

简单示例:

GET /books/book/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "python"
          }
        }
      ],
      "should": [
        {
          "match": {
            "title": "effective"
          }
        }
      ]
    }
  }
}

es 执行上述语句的过程也是先使用过滤器过滤文档,之后再查询给命中的文档打分。

聚集(aggregation)

首先,我们先了解一下聚集在具体 es 执行查询的生命周期中位于什么位置。
在这里插入图片描述
聚集位于整体查询之后进行,也就是针对查询的结果集进行聚集的操作。

从上图看来,查询的结果和聚集的结果是并行的,从实际返回的结果来看也是如此。es 会在同一级别下返回查询结果和查询的聚集结果。

聚集只聚集查询后的结果,对于后过滤器(post-filter)而言,聚集不会聚集到后过滤器过滤后的结果集。

度量聚集

对于命中的文档集,度量聚集是从结果集中提取各种统计数据的聚集。主要分为三种统计:

  • 精准统计
    顾名思义,对结果集进行最大、最小、加和、平均等统计。是一些常见的比较初级的统计。
  • 高级统计
    es 通过 extended_stats 字段来获取一些相对高级的统计结果:方差、平方值、标准差等等。
  • 近似统计
    通过文档中的某些值以及特定的统计方法,来进行近似统计。这些值对于结果集的描述是准确但不精确的。 与之对应的,近似统计相对于前两种统计方法而言,会有更快的速度,消耗更少的内存。

实际上前两种统计都没啥好说的,我们可以着重看一下近似统计,学习一下相关的统计学概念,开拓一下眼界。

在 es 中,有两种统计,百分位数(percentiles)和基数(cardinality)。

百分位数(percentiles)

统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列。如,处于p%位置的值称第p百分位数。

如果概念不太懂,我举个例子大家就明白了。

今年是单位体检的日子,所有人到体检中心来测身高。
单位一共100个人,所有人的身高都在 163cm-190cm 之间。同事 A 的身高值是180cm处于百分位70%。也就是说第70百分位数为180cm。
那么我们就可以理解,同事 A 的身高比公司中70%的人都高,比其他30%的人要矮。

所以也就不难理解,80%,95%,99.9%百分位数对于系统运维的同学来讲是多么重要了。因为很多的情况是通过平均数、中位数看不出来的,而获取最大最小值又并没有什么意义,如果能获取到一个 “特定群体的近似情况” ,那么解决起来才是有意义的。

最有代表性的例子就是运维中的网络时延问题,
在这里插入图片描述
上图摘自 es 官网,在图中如果我们只看中位数和平均数,我们貌似看不出啥问题,一切安好。
在这里插入图片描述
但如果我们看第99百分位数时发现,在早上九点多时有1%数量的用户忍受着800左右的延迟。看到了这个统计结果,运维人员就能更高效地排查问题,解决问题。这就是百分位数的作用。

当然,具体百分位数的算法以及实现在此不多展开,有兴趣的同学可以自己了解。

基数(cardinality)

基数(cardinality)实际上是一个离散数学中集合的概念,用来描述集合大小的,实际上在书中运用这个词我个人认为是不太合适的。所以我只能从离散数学上定义,推演出在 es 中的定义,也不一定准确,供大家参考。

在离散数学中,基数(cardinal number)在数学上,是集合论中刻画任意集合大小的一个概念。两个能够建立元素间一一对应的集合称为互相对等集合。例如3个人的集合和3匹马的集合可以建立一一对应,是两个对等的集合。

我们都知道集合的特定之一是没有重复元素,其二是无序。贴合到文档数据库中呢,基数(cardinality)我理解就是 一个文档集中,非重复文档的数量。

当然,在 es 种基数是一个近似统计,其实现方式是通过散列值来近似的基数,并不能精准的反馈不重复文档数量。每次计算,HyperLogLog++ 这个算法只会加载部分散列值到内存中,所以无论我们有多少文档,内存使用量只会是一个常数。

基数与内存

es 可以通过 precision_threshold 来配置散列范围的常数值,阈值越高,结果越精确,占用内存越大。对于查询命中的分片,聚集大约会占用 precision_threshold * 8 个 byte 的内存。如果 cardinality 在桶型聚集下进行了嵌套,那么内存使用量需要再乘父聚集桶的数量。

桶型聚集

度量聚集是将命中的所有文档进行统计计算。桶型聚集就是把,查询命中的结果按相同标准的不同结果作为标准分类。对于每个当前桶,我们可以通过一个或多个统计值来描述当前桶(度量)。

所以实际上,我们可以将之前度量聚集所讨论的结果集看成一个没有标准的大桶,而几个度量的统计标准就是在描述这个没有标准的大桶。有点套娃的味了啊~

桶聚集最常见的使用场景有5个:

  • 词条聚集(terms aggregation)
    可以聚集出文档中每个词条的频率。常用于热词搜索。
  • 范围聚集(range aggregation)
    通过切分一个特定的范围来观察子范围的分布。常用于日期、IP段统计、主流价格区间及其他特定可排序数值。
  • 直方图聚集(histogram aggregation)
    与范围聚集类似,但有所不同。其无需界定每个范围的区间,只需要定于间距值即可。es 会根据间距自动构建多个同桶。当不知道用户想要看什么,这个聚集能给到参考。
  • 嵌套聚集(nested aggregation)
    套娃聚集。
  • 地理距离聚集(geo distance aggregation)
    这个我个人感觉是给 GIS 系统服务的。通过地理距离聚集和地理散列格聚集,根据地理位置来创建桶。具体不太了解,有兴趣的同学可以自行了解。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值