ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Elasticsearch 聚合查询(aggs),Java性能优化面试题集锦

2021-09-09 11:33:40  阅读:239  来源: 互联网

标签:面试题 集锦 img color price field Elasticsearch aggs size


{ “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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有