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不断!!!**

上一篇:【ElasticSearch】搜索语法


下一篇:[备忘]es查询之按天聚合