《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