抑郁症健康,内容丰富有趣,生活中的好帮手!
抑郁症健康 > elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行gro

elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行gro

时间:2023-06-27 21:17:07

相关推荐

分析

最后,我们还有一个需求需要完成:允许管理者在职员目录中进行一些分析。 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就可以了。

elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by 统计下分组结果 包括min/max/avg...

如果觉得《elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行gro》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。