博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg...
阅读量:7047 次
发布时间:2019-06-28

本文共 2165 字,大约阅读时间需要 7 分钟。

分析

最后,我们还有一个需求需要完成:允许管理者在职员目录中进行一些分析。 Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计。它很像SQL中的GROUP BY但是功能更强大。

+

 

举个例子,让我们找到所有职员中最大的共同点(兴趣爱好)是什么:

GET /megacorp/employee/_search{  "aggs": {    "all_interests": {      "terms": { "field": "interests" } } } }

暂时先忽略语法只看查询结果:

{   ...   "hits": { ... },   "aggregations": {      "all_interests": {         "buckets": [            {               "key": "music", "doc_count": 2 }, { "key": "forestry", "doc_count": 1 }, { "key": "sports", "doc_count": 1 } ] } } }

我们可以看到两个职员对音乐有兴趣,一个喜欢林学,一个喜欢运动。这些数据并没有被预先计算好,它们是实时的从匹配查询语句的文档中动态计算生成的。如果我们想知道所有姓"Smith"的人最大的共同点(兴趣爱好),我们只需要增加合适的语句既可:

GET /megacorp/employee/_search{  "query": {    "match": {      "last_name": "smith"    }  },  "aggs": { "all_interests": { "terms": { "field": "interests" } } } }

all_interests聚合已经变成只包含和查询语句相匹配的文档了:

...  "all_interests": {     "buckets": [        {           "key": "music",           "doc_count": 2 }, { "key": "sports", "doc_count": 1 } ] }

聚合也允许分级汇总。例如,让我们统计每种兴趣下职员的平均年龄:

GET /megacorp/employee/_search{    "aggs" : {        "all_interests" : {            "terms" : { "field" : "interests" }, "aggs" : { "avg_age" : { "avg" : { "field" : "age" } } } } } }

虽然这次返回的聚合结果有些复杂,但任然很容易理解:

3

 

...  "all_interests": {     "buckets": [        {           "key": "music",           "doc_count": 2, "avg_age": { "value": 28.5 } }, { "key": "forestry", "doc_count": 1, "avg_age": { "value": 35 } }, { "key": "sports", "doc_count": 1, "avg_age": { "value": 25 } } ] }

该聚合结果比之前的聚合结果要更加丰富。我们依然得到了兴趣以及数量(指具有该兴趣的员工人数)的列表,但是现在每个兴趣额外拥有avg_age字段来显示具有该兴趣员工的平均年龄。

2

 

即使你还不理解语法,但你也可以大概感觉到通过这个特性可以完成相当复杂的聚合工作,你可以处理任何类型的数据。

 

为了掌握聚合aggs语法,你一定要了解两个主要概念:

Buckets(桶):

满足某个条件的文档集合。

Metrics(指标):

为某个桶中的文档计算得到的统计信息。

就是这样!每个聚合只是简单地由一个或者多个桶,零个或者多个指标组合而成。

桶和SQL中的组(Grouping)拥有相似的概念,而指标则与COUNT(),SUM(),MAX(),MIN(), AVG()等相似。

让我们仔细看看这些概念。

桶(Buckets)

一个桶就是满足特定条件的一个文档集合:

一名员工要么属于男性桶,或者女性桶。

 

一个聚合就是一些桶和指标的组合。一个聚合可以只有一个桶,或者一个指标,或者每样一个。在桶中甚至可以有多个嵌套的桶。比如,我们可以将文档按照其所属国家进行分桶,然后对每个桶计算其平均薪资(一个指标)。

因为桶是可以嵌套的,我们能够实现一个更加复杂的聚合操作:

将文档按照国家进行分桶。(桶)

然后将每个国家的桶再按照性别分桶。(桶)
然后将每个性别的桶按照年龄区间进行分桶。(桶)
最后,为每个年龄区间计算平均薪资。

大家一定要理解Buckets(桶)及Metrics(指标)概念,buckets多层嵌套的概念,想基于哪个桶做统计计算,只需要嵌入一层aggs就可以了。

转载地址:http://ppzol.baihongyu.com/

你可能感兴趣的文章
Nginx/LVS/HAProxy负载均衡软件的优缺点详解
查看>>
Java -Xms -Xmx -Xss -XX:MaxNewSize -XX:MaxPermSize含义记录
查看>>
微信小程序开发之常见BUG
查看>>
汇编指令-MRS(读)和MSR(写)指令操作CPSR寄存器和SPSR寄存器使用(1)
查看>>
Instagram的Material Design概念设计文章分享
查看>>
Jersey VS Django-Rest
查看>>
安装 openCV 2.4.10
查看>>
去哪网实习总结:用到的easyui组件总结(JavaWeb)
查看>>
spring-oauth-server实践:使用授权方式四:client_credentials 模式下access_token做业务!!!...
查看>>
jquery miniui 学习笔记
查看>>
dubbo AdaptiveExtension
查看>>
Scrapy系列教程(1)------命令行工具
查看>>
Using Autorelease Pool Blocks
查看>>
spring-struts-mybatis整合错误集锦
查看>>
Maven 通过maven对项目进行拆分、聚合(重点)
查看>>
TWaver版3D化学元素周期表
查看>>
Java 中最常见的 5 个错误
查看>>
[AWS vs Azure] 云计算里AWS和Azure的探究(2)
查看>>
查看是否安装.NET Framework、.NET Framework的版本号、CLR版本号
查看>>
数据结构基础温故-5.图(下):最短路径
查看>>