带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(9)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(9)

《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.21.Aggregations(8) https://developer.aliyun.com/article/1229233

三、桶聚合(Buckets)

 

1、索引词 terms

 

1)基础用法

 

索引词 terms 聚合是根据文档中的指定字段进行分桶统计,并返回每个桶内命中的数量。

根据品牌信息来做聚合


GET order/_search
{
  "aggs": {
    "terms_test": {                  //聚合逻辑名称
      "terms": {                     //聚合类型
        "field": "brand",            //聚合字段
        "size": 3                    //返回结果数量
      }
}
  }
}

结果如下:


{
...
"aggregations" : {
    "terms_test" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "HUAWEI",
          "doc_count" : 4
        },
        {
          "key" : "Apple",
          "doc_count" : 3
        }
      ]
    }
  }
}

可以看到排在前二的结果为 HUAWEI、Apple。其他字段含义为:

 

doc_count_error_upper_bound代表每个索引词文档的错误上限。

sum_other_doc_count代表没有返回的其他桶的文档数的总和。

doc_count代表每个 term 匹配的项的数量。要注意的是,terms 结果是一个近似的值,并不是一个准确数。由于 Elasticserach 的分片机制,每个分片会根据各自拥有的数据进行计算并且排序之后将结果汇总到协调节点,最终由协调节点进行对结果整理排序返回给客户端。



2)其他参数

 

terms 聚合时还有以下参数可选:

 

order计算结果的排序规则,_count 代表按照 doc_count 的值进行排序,默认为 desc; _key 代表按照 key 的字母顺序进行排序。

missing:缺省值设置。

min_doc_count:规定最小的文档数目,只有满足这个参数要求的个数的词条才会被记录返回。

shard_size:每个分片返回给协调节点最多的数量,返回越多,结果越准确,同样的负载越高。shard_size 的大小默认为 (size * 1.5 + 10) 。

include:决定哪些值允许被聚合。

exclude:决定哪些值不能被聚合。当 include 和 exclude 被同时定义时,exclude 具有优先级,这意味着 include 会在 exclude 之前执行。

collect_mode:depth_first 和 breadth_first 两个值,默认为 depth_first。深度优先在聚合计算下,多层聚合会让一个文档与其他文档产生关联,也就是说会形成一颗颗聚合树。深度优先就是先计算获得所有的聚合树,然后再进行后续处理。广度优先将会先计算整理出所有父节点(第一层的桶),然后再进行后续步骤。

execution_hint:有 map 和 global_ordinals 两个值,默认为 global_ordinals。map,在内存中构建映射表,利用映射表完成聚合计算,可以看得出,这种方式会比较消耗内存。

global_ordinals每个桶都会有一个全局序列号,也就是指定域中的唯一值都会有一个全局序列号,根据这个序列号完成相关的聚合过程。计算过程消耗的内存较小,因为使用全局序列号的话可以将计算中的中间结果存储到硬盘等存储介质中。

show_term_doc_count_error:与 doc_count_error_upper_bound 类似,不过这个是精确到每个桶的。这个默认是关闭的,要开启就需要传递 show_term_doc_count_error 参数。

 

2、过滤聚合 filter 和 filters

 

1)基础用法

 

先看一个 filter 聚合的例子,需要对 HUAWEI 手机进行计算平均值,那么此时可以先试用

filter 进行 term 过滤,之后再进行平均值的聚合计算。


GET order/_search
{
  "aggs": {
    "avg_test":{
      "avg": {
      "field": "price"
      }
    },
    "filter_test": {
      "filter": {
        "term": {
          "brand": "HUAWEI"
        }
      },
      "aggs": {
        "avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}
//聚合结果如下:
 "aggregations" : {
    "avg_test" : {
      "value" : 8863.050000000001
    },
    "filter_test" : {
      "doc_count" : 4,
      "avg" : {
         "value" : 8734.25
      }
    }
  }

过滤聚合 filter 只能支持一个过滤条件,响应也只是单个桶。filters 聚合的存在正是为了解决对多个特定值进行聚合的问题。如下:可以使用 filters 聚合匹配出满足条件的品牌的数量和品牌下产品名称的数量。


GET order/_search
{
  "aggs": {
    "filters_test": {
      "filters": {
        "filters": {
          "brand_count":{    //过滤器名称
            "term": {
             "brand": "HUAWEI"
            }
          },
          "product_count":{  //过滤器名称
            "term": {
            "product_name": "mate11"
            } 
          }
        }
      }
    }
  }

上述例子中的过滤器名称不是必填项,当不存在时称之为匿名过滤器。filters 聚合还提供了

other_bucket,通过将其设置为 true 可以统计不满足任意一个条件的文档的数量。如果想要指定 other bucket 的名称,可以使用参数 other_bucket_key 设置。

 

3、空值聚合 missing

 

1)基础用法

 

空值聚合通常用来统计,某字段为空的文档的数量。例如:查看 price 价格有多少空值。

 

GET order/_search
{
  "aggs": {
    "missing_test": {               //聚合名称
      "missing": {                  //聚合类型
        "field": "price"   
      } 
    }
  }
}
//结果如下:
"aggregations" : {
    "missing_test" : {
      "doc_count" : 1
    }
  }

《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.21.Aggregations(10) https://developer.aliyun.com/article/1229231

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(10)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(10)
|
存储 自然语言处理 关系型数据库
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(14)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(14)
|
存储
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(8)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(8)
106 0
|
数据可视化 索引
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(13)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(13)
|
存储 SQL 数据挖掘
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(1)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(1)
|
存储
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(5)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(5)
|
存储
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(3)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(3)
|
资源调度
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(7)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(7)
|
存储 算法 索引
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(4)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(4)
|
编解码 算法
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(6)
带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(6)
105 0