es 时间字段聚合_ES之五:ElasticSearch聚合

本文详细介绍了Elasticsearch中各种聚合操作,包括单值聚合的Sum、Min、Max、Avg、Cardinality,以及多值聚合的percentiles、stats、extended_stats、Terms等,并探讨了如何处理数据不确定性、order排序、min_doc_count与shard_min_doc_count的设置,以及filter、脚本和多字段聚合的使用技巧。
摘要由CSDN通过智能技术生成

1、单值聚合

Sum求和,dsl参考如下:

f2940af480e1b4b65ede0eee02de2ab9.png

{

"size": 0,

"aggs": {

"return_balance": {

"sum": {

"field": "balance"

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

返回balance之和,其中size=0 表示不需要返回参与查询的文档。

20180110223510027532.png

Min求最小值

f2940af480e1b4b65ede0eee02de2ab9.png

{

"size": 0,

"aggs": {

"return_min_balance": {

"min": {

"field": "balance"

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

返回结果

20180110223510031439.png

Max求最大值

f2940af480e1b4b65ede0eee02de2ab9.png

{

"size": 0,

"aggs": {

"return_max_balance": {

"max": {

"field": "balance"

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

返回结果:

20180110223510033392.png

AVG求平均值

f2940af480e1b4b65ede0eee02de2ab9.png

{

"size": 0,

"aggs": {

"return_avg_balance": {

"avg": {

"field": "balance"

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

返回结果:

20180110223510034368.png

Cardinality 求基数(如下示例,查找性别的基数 M、F,共两个)

f2940af480e1b4b65ede0eee02de2ab9.png

{

"size": 0,

"aggs": {

"return_cardinality": {

"cardinality": {

"field": "gender"

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

结果为:

20180110223510036322.png

2、多值聚合

percentiles 求百分比

查看官方文档时候,没看懂,下面是自己测试时的例子,按照性别(F,M)查看工资范围的百分比

f2940af480e1b4b65ede0eee02de2ab9.png

{

"size": 0,

"aggs": {

"states": {

"terms": {

"field": "gender"

},

"aggs": {

"banlances": {

"percentile_ranks": {

"field": "balance",

"values": [

20000,

40000

]

}

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

结果:

20180110223510038275.png

stats 统计

查看balance的统计情况:

f2940af480e1b4b65ede0eee02de2ab9.png

{

"size": 0,

"aggs": {

"balance_stats": {

"stats": {

"field": "balance"

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

返回结果:

20180110223510040228.png

extended_stats 扩展统计

f2940af480e1b4b65ede0eee02de2ab9.png

{

"size": 0,

"aggs": {

"balance_stats": {

"extended_stats": {

"field": "balance"

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

结果:

20180110223510041205.png

更加复杂的查询,后续慢慢在实践中道来。

Terms聚合

记录有多少F,多少M

f2940af480e1b4b65ede0eee02de2ab9.png

{

"size": 0,

"aggs": {

"genders": {

"terms": {

"field": "gender"

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

返回结果如下:m记录507条,f记录493条

20180110223510044134.png

数据的不确定性

使用terms聚合,结果可能带有一定的偏差与错误性。

比如:

我们想要获取name字段中出现频率最高的前5个。

此时,客户端向ES发送聚合请求,主节点接收到请求后,会向每个独立的分片发送该请求。

分片独立的计算自己分片上的前5个name,然后返回。当所有的分片结果都返回后,在主节点进行结果的合并,再求出频率最高的前5个,返回给客户端。

这样就会造成一定的误差,比如最后返回的前5个中,有一个叫A的,有50个文档;B有49。 但是由于每个分片独立的保存信息,信息的分布也是不确定的。 有可能第一个分片中B的信息有2个,但是没有排到前5,所以没有在最后合并的结果中出现。 这就导致B的总数少计算了2,本来可能排到第一位,却排到了A的后面。

size与shard_size

为了改善上面的问题,就可以使用size和shard_size参数。

size参数规定了最后返回的term个数(默认是10个)

shard_size参数规定了每个分片上返回的个数

如果shard_size小于size,那么分片也会按照size指定的个数计算

通过这两个参数,如果我们想要返回前5个,size=5;shard_size可以设置大于5,这样每个分片返回的词条信息就会增多,相应的误差几率也会减小。

order排序

order指定了最后返回结果的排序方式,默认是按照doc_count排序。

f2940af480e1b4b65ede0eee02de2ab9.png

{

"aggs" : {

"genders" : {

"terms" : {

"field" : "gender",

"order" : { "_count" : "asc" }

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

也可以按照字典方式排序:

f2940af480e1b4b65ede0eee02de2ab9.png

{

"aggs" : {

"genders" : {

"terms" : {

"field" : "gender",

"order" : { "_term" : "asc" }

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

当然也可以通过order指定一个单值聚合,来排序。

f2940af480e1b4b65ede0eee02de2ab9.png

{

"aggs" : {

"genders" : {

"terms" : {

"field" : "gender",

"order" : { "avg_balance" : "desc" }

},

"aggs" : {

"avg_balance" : { "avg" : { "field" : "balance" } }

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

同时也支持多值聚合,不过要指定使用的多值字段:

f2940af480e1b4b65ede0eee02de2ab9.png

{

"aggs" : {

"genders" : {

"terms" : {

"field" : "gender",

"order" : { "balance_stats.avg" : "desc" }

},

"aggs" : {

"balance_stats" : { "stats" : { "field" : "balance" } }

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

返回结果:

20180110223510047064.png

min_doc_count与shard_min_doc_count

聚合的字段可能存在一些频率很低的词条,如果这些词条数目比例很大,那么就会造成很多不必要的计算。

因此可以通过设置min_doc_count和shard_min_doc_count来规定最小的文档数目,只有满足这个参数要求的个数的词条才会被记录返回。

通过名字就可以看出:

min_doc_count:规定了最终结果的筛选

shard_min_doc_count:规定了分片中计算返回时的筛选

script

桶聚合也支持脚本的使用:

f2940af480e1b4b65ede0eee02de2ab9.png

{

"aggs" : {

"genders" : {

"terms" : {

"script" : "doc[‘gender‘].value"

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

以及外部脚本文件:

f2940af480e1b4b65ede0eee02de2ab9.png

{

"aggs" : {

"genders" : {

"terms" : {

"script" : {

"file": "my_script",

"params": {

"field": "gender"

}

}

}

}

}

}

f2940af480e1b4b65ede0eee02de2ab9.png

filter

filter字段提供了过滤的功能,使用两种方式:include可以匹配出包含该值的文档,exclude则排除包含该值的文档。

例如:

{

"aggs" : {

"tags" : {

"terms" : {

"field" : "tags",

"include" : ".*sport.*",

"exclude" : "water_.*"

}

}

}

}

上面的例子中,最后的结果应该包含sport并且不包含water。

也支持数组的方式,定义包含与排除的信息:

{

"aggs" : {

"JapaneseCars" : {

"terms" : {

"field" : "make",

"include" : ["mazda", "honda"]

}

},

"ActiveCarManufacturers" : {

"terms" : {

"field" : "make",

"exclude" : ["rover", "jensen"]

}

}

}

}

多字段聚合

通常情况,terms聚合都是仅针对于一个字段的聚合。因为该聚合是需要把词条放入一个哈希表中,如果多个字段就会造成n^2的内存消耗。

不过,对于多字段,ES也提供了下面两种方式:

1 使用脚本合并字段

2 使用copy_to方法,合并两个字段,创建出一个新的字段,对新字段执行单个字段的聚合。

collect模式

对于子聚合的计算,有两种方式:

depth_first 直接进行子聚合的计算

breadth_first 先计算出当前聚合的结果,针对这个结果在对子聚合进行计算。

默认情况下ES会使用深度优先,不过可以手动设置成广度优先,比如:

{

"aggs" : {

"actors" : {

"terms" : {

"field" : "actors",

"size" : 10,

"collect_mode" : "breadth_first"

},

"aggs" : {

"costars" : {

"terms" : {

"field" : "actors",

"size" : 5

}

}

}

}

}

}

缺省值Missing value

缺省值指定了缺省的字段的处理方式:

{

"aggs" : {

"tags" : {

"terms" : {

"field" : "tags",

"missing": "N/A"

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值