聚合查询

在使用关系型数据库的时候,常常会用到group by等操作进行分组求和、求平均的操作。而Elasticsearch同样提供了分组计算的能力。

关系型数据库中使用Group by进行分组计算在Elasticsearch中成为桶聚合。

数据准备

使用聚合查询之前几篇的数据可能不太适合,现在重新模拟一些数据。

新建索引

新建映射

新建数据

聚合查询

求平均值

现在模拟求所属分组age字段的平均值。可以使用下面的命令。聚合查询中这些常用的计算和SQL中是类似的avg是求平均sum求和max求最大、min求最小。这里我只贴出了avg的代码

请求

参数

Elasticsearch对于数据的聚合分析,都是使用aggs来完成每个桶内的数据的分组其中aggQuery是每次计算的一个别名,用来取出计算结果的时候使用。

响应结果

java代码

Elasticsearch对于数据的分组,都是使用

求总

value_count的操作可以获取在该字段上非空的数据的条目数。

请求

参数

响应结果

java代码

去重

其用法类似SQL中的 distinct 或者unique 值的数目。是有种获取数据去重后的结果的方法。

下面的内容尝试求出现在模拟求所属分组age字段后去重的内容,aggQuery是每次计算的一个别名,用来取出计算结果的时候使用。下面的内容在忽略query条件后可能类似这个样子:

请求

参数

响应结果

hits中可以看到其命中的文档数量是25.但是在aggregationsaggQuery去重后只有2个数据。

java代码

stats 多个聚合结果

上面介绍了Es提供了求大小值、平均值以及总和的方法,另外ES提供了stats方法可以一次把上面的内容全部查询出来。

请求

参数

响应结果

可以看到在aggQuery中返回了五个结果分别对应常用的聚合计算方法。

java代码

占比百分位查询

除了类似SQL提供了常用的分组计算方法,es还提供了ppercentiles百分比计算的方法。此方法的作用是计算在某个字段中,处于一定top值内的数据。

请求

参数

响应结果

使用默认的参数可以求出上面分段的值。当然可以在参数中添加percents的参数值,来查询自己需要的内容。

java代码

桶聚合查询

上面的内容,只是简单的使用了常用的分组计算或者聚合计算的内容。而Es在数据分析中用的最多的是,桶聚合查询的内容。这也是类似SQL中group by的操作

分组聚合

我们尝试求出不同age分组内数据量的结果,可以使用下面的命令。

请求

参数

这里可以注意size的设置。最外层的size控制了要展示命中的文档内容,但是我们只是希望知道文档的数量而不是内容,所以设置了0。而内层的size显示的是我们分组计算后展示的结果条目数,这里的size可以根据业务进行设置。一般进行桶聚合的时候桶的数量最好不能过大(超过10000)。过多的桶会极大的消耗系统资源。甚至造成内存溢出。

响应结果

java代码

分组聚合排序(使用聚合关键词排序)

ES分组API中提供了排序的设置,_key指的是根据分组的字段进行排序。

请求

参数

响应结果

java代码

分组聚合排序(使用匹配结果排序)

当然除了对数据中的字段进行排序,ES还支持针对分组的结果作为排序的一句。使用_count,将命中的文档数量作为排序依据进行排序。

请求

参数

响应结果

java代码

分组聚合中使用筛选功能

ES在进行桶聚合的时候,除了排序内容,也允许设置一些例外操作。

使用include可以设置哪些内容可以接收分组,当然也可以设置exclude参数将一些内容排除出分组操作之外。

请求

参数

响应结果

java代码

范围分组聚合

ES提供ranges方法来方便进行范围查询。其类似SQL中的between and的操作,但是ES提供了两个不同的API来实现范围查询ranges是进行数字类型的范围查询。date_range进行时间范围的查询。

请求

参数

可以在每个查询范围中设置key字段作为一个别名,方便我们在获取数据后使用此别名用来获取内容。

响应结果

java代码

时间范围分组聚合

之前在介绍Elasticsearch字段的时候,说过Elasticsearch中的Date格式其实是根据dateFormat的样式进行格式化成日期的字符串类型。所以进行时间范围查询的时候,需要一个format参数来对字段内的数据进行格式化,然后完成分组操作。

请求

参数

响应结果

java代码

时间柱状图聚合

使用上面的date_range的分组,我们可以实现将一个长的时间段分成多个小的时间段然后实现分时段的数据分析。当然实际业务中很多时候我们可能只需要展示一年每个月的数据分析、或者一个月每天的数据分析。这个时候可以使用date_histogram的方法。其interval参数接收monthday的参数,它可以将数据根据每月或者每天的区间自动完成数据的分组。

请求

参数

响应结果

java代码

使用lucene查询语法

最开始我们介绍Elasticsearch的时候有一段对Elasticsearch的描述

ElasticSearch是一个基于Lucene的搜索服务器

所以其提供了使用原生的lucene查询语法。在某些业务场景可能Elasticsearch提供的API无法满足我们的使用场景,我们使用使用query_string的API,其接收原生的lucene查询语法,这样可以使用原生的lucene语法实现一些目前API无法实现的业务。

请求

参数

响应结果

java代码

先根据某个字段进行去重,然后进行排序分页

java 代码


个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容。假如我的这篇内容对你有任何帮助的话,麻烦给我点一个赞。你的点赞就是我前进的动力。




HTTPX 基础教程-新乡seo|网站优化,网站建设_微信公众号:zeropython—昊天博客