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

简介: 带你读《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

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
存储 Java 关系型数据库
学生宿舍管理系统【GUI/Swing+MySQL】(Java课设)
学生宿舍管理系统【GUI/Swing+MySQL】(Java课设)
200 0
|
11月前
|
NoSQL Java Redis
Jedis高版本的JedisPoolConfig没有maxActive和maxWait
在高版本的Jedis中,连接池配置属性发生了一些变化。通过使用 `JedisPoolConfig`中的新属性,可以更好地管理和优化Redis连接池。本指南提供了详细的配置方法和示例代码,帮助开发者快速上手并正确配置Jedis连接池。希望本文对您有所帮助,能够在项目中高效地使用Jedis与Redis。
376 14
|
机器学习/深度学习 并行计算 PyTorch
如何搭建深度学习的多 GPU 服务器
如何搭建深度学习的多 GPU 服务器
如何搭建深度学习的多 GPU 服务器
|
存储 Java
|
定位技术
echarts引入百度地图通过脚本bmap.min.js解决关闭底图可点功能的底层解决方案
echarts引入百度地图通过脚本bmap.min.js解决关闭底图可点功能的底层解决方案
343 0
|
机器学习/深度学习
一文弄清池化层(pooling)的作用
一文弄清池化层(pooling)的作用
|
Java 中间件 Maven
如何实现Java类隔离加载?
Java 开发中,如果不同的 jar 包依赖了某些通用 jar 包的版本不一样,运行时就会因为加载的类跟预期不符合导致报错。如何避免这种情况呢?本文通过分析 jar 包产生冲突的原因及类隔离的实现原理,分享两种实现自定义类加载器的方法。
如何实现Java类隔离加载?
|
前端开发 区块链 数据安全/隐私保护
web3 的身份验证之以太坊签名消息
如果参与过以太坊 DApp 相关的开发,可能遇到过要求签名一条消息或一条数据以验证自己(以及哈希地址)。本文将讨论以太坊签名数据的基础知识。
2184 0
web3 的身份验证之以太坊签名消息
|
Web App开发 缓存 监控
Could not obtain transaction-synchronized Session for current thread原因及解决方案
Could not obtain transaction-synchronized Session for current thread原因及解决方案
482 1
Could not obtain transaction-synchronized Session for current thread原因及解决方案

热门文章

最新文章