Elasticsearch 聚合查询(aggs),Java性能优化面试题集锦
作者:互联网
{ “price” : 25000, “color” : “blue”, “make” : “ford”, “sold” : “2014-02-12” }
[](
)聚合为桶
-----------------------------------------------------------------
首先,我们按照 汽车的颜色`color`来划分`桶`
GET /cars/_search
{
"size" : 0,
"aggs" : {
"popular_colors" : {
"terms" : {
"field" : "color"
}
}
}
}
* size: 查询条数,这里设置为0,因为我们不关心搜索到的数据,只关心聚合结果,提高效率
* aggs:声明这是一个聚合查询,是aggregations的缩写
* popular\_colors:给这次聚合起一个名字,任意。
* terms:划分桶的方式,这里是根据词条划分
* field:划分桶的字段
结果:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210314103126936.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0x6eTQxMDk5Mg==,size_16,color_FFFFFF,t_70)
[](
)桶内度量
-----------------------------------------------------------------
前面的例子告诉我们每个桶里面的文档数量,但是我们需要更复杂的文档度量,我们需要告诉Elasticsearch`使用哪个字段`,`使用何种度量方式`进行运算,这些信息要嵌套在`桶`内,`度量`的运算会基于`桶`内的文档进行
现在,为刚刚的聚合结果添加 **求价格平均值的度量**:
GET /cars/_search
{
"size" : 0,
"aggs" : {
"popular_colors" : {
"terms" : {
"field" : "color"
},
"aggs":{
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
* aggs:我们在上一个aggs(popular\_colors)中添加新的aggs。可见`度量`也是一个聚合
* avg\_price:聚合的名称
* avg:度量的类型,这里是求平均值
* field:度量运算的字段
结果:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=2021031410431889.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0x6eTQxMDk5Mg==,size_16,color_FFFFFF,t_70)
[](
)桶内嵌套桶
------------------------------------------------------------------
刚刚的案例中,我们在桶内嵌套度量运算。事实上桶不仅可以嵌套运算, 还可以再嵌套其它桶。也就是说在每个分组中,再分更多组。
比如:我们想统计每种颜色的汽车中,分别属于哪个制造商,按照`make`字段再进行分桶
GET /cars/_search
{
"size" : 0,
"aggs" : {
"popular_colors" : {
"terms" : {
"field" : "color"
},
"aggs":{
"avg_price": {
"avg": {
"field": "price"
}
},
"maker":{
"terms":{
"field":"make"
}
}
}
}
}
}
* maker:在嵌套的aggs下新添一个桶,叫做maker
* terms:桶的划分类型依然是词条
* filed:这里根据make字段进行划分
部分结果:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210314105158488.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0x6eTQxMDk5Mg==,size_16,color_FFFFFF,t_70)
[](
)划分桶的其它方式
---------------------------------------------------------------------
* `Date Histogram Aggregation`:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
* `Histogram Aggregation`:根据数值阶梯分组,与日期类似
* `Range Aggregation`:数值和日期的范围分组,指定开始和结束,然后按段分组
刚刚的案例中,我们采用的是`Terms Aggregation`,即根据词条划分桶。接下来,我们再学习几个比较实用的:
**阶梯分桶Histogram Aggregation:**
histogram是把数值类型的字段,按照一定的阶梯大小进行分组。你需要指定一个阶梯值(interval)来划分阶梯大小。
计算公式如下:`bucket_key = Math.floor((value - offset) / interval) * interval + offset`
以一件价格450的商品为例,`value:当前数据的值450,offset:起始偏移量,默认为0,interval:阶梯间隔,比如200,`因此你得到的:key = Math.floor((450 - 0) / 200) \* 200 + 0 = 400
案例:对汽车的价格进行分组,指定间隔interval为5000:
GET /cars/_search
{
“size”:0,
“aggs”:{
"price":{
"histogram": {
"field": "price",
"interval": 5000
}
}
}
}
结果:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210314110135957.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0x6eTQxMDk5Mg==,size_16,color_FFFFFF,t_70)
示例:增加一个参数min\_doc\_count为1,过滤文档数量为0的桶
GET /cars/_search
{
“size”:0,
“aggs”:{
"price":{
"histogram": {
"field": "price",
"interval": 5000,
"min_doc_count": 1
}
}
}
}
结果:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210314110250911.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0x6eTQxMDk5Mg==,size_16,color_FFFFFF,t_70)
### 最后
这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。
![image](https://www.icode9.com/i/ll/?i=img_convert/7805d83c42241b9dd545c57087fd4fbb.png)
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](
)**
**整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**
**你的支持,我的动力;祝各位前程似锦,offer不断!!!**
g==,size_16,color_FFFFFF,t_70)
### 最后
这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。
[外链图片转存中...(img-YvK4ZSeh-1631157940303)]
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](
)**
**整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**
**你的支持,我的动力;祝各位前程似锦,offer不断!!!**
标签:面试题,集锦,img,color,price,field,Elasticsearch,aggs,size 来源: https://blog.csdn.net/m0_60666452/article/details/120197798