黑马学ElasticSearch(九)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

1数据聚合-聚合的分类

2数据聚合-DSL实现Bucket聚合

3 数据聚合-DSL实现Metrics聚合

4数据聚合-RestClient实现聚合

5数据聚合-多条件聚合

6数据聚合-带过滤条件的聚合


前面学习了ES的基本用法和数据搜索功能下面 继续深入ES的搜索功能看一看它更复杂的用法

数据聚合可以帮助我们可以对海量的数据做统计分析如果结合Kanban形成可视化的报表让用户一目了然形成数据结果更方便数据分析

自动补全可以根据用户输入的部分信息去自动补全和提示用户想要输入的内容 增加用户的体验

数据同步ES和MySQL数据库的双写的一致性问题对应的解决方案

1数据聚合-聚合的分类

在MySQL也有聚合功能聚合函数avg、max、min等等聚合函数需要结合group by分组去使用

ES具备MySQL类似的聚合功能并且还做了更丰富的聚合功能 

聚合先学习下面常见的详细可以查看官网

Aggregations | Elasticsearch Guide [8.6] | Elastic

 

 桶聚合类似Group by

2数据聚合-DSL实现Bucket聚合

 

aggsaggressions的缩写aggs里面可以定义好多的聚合的所以是一个数组里面可以定义多个 

定义几个brandAgg就会有多少个brandAgg 的结果

 size=0  是搜索中不包含文档所以hits是空的

关注的是aggregations

buckets是桶聚合是桶的聚合所以结果有很多桶这个桶是品牌的桶品牌一样的放在一个桶里面所以是一个数组会有很多桶

里面的size是显示10条

 

 

 doc_count:是文档数量桶里面有几条文档啊是倒叙排序统计出来越多的排名越靠前这是默认的排序规则排序可以更改

 

上面的聚合是对整个索引库的搜索如果有上亿条数据这个聚合对内存的消耗还是非常大的 我们能不能限定聚合搜索的范围呢

3 数据聚合-DSL实现Metrics聚合

 

 

 在按照平均评分做降序排列

 

 4数据聚合-RestClient实现聚合

 

添加一个单元测试方法

 

 

 

 

 

添加解析

 

 

 

 5数据聚合-多条件聚合

 

在IHotelService中定义新的接口

 

实现类IHotelServiceImpl中实现这个方法 

可以把聚合条件封装成一个方法Ctrl+Alt+M 

 

 

 

 

 

把解析方法中相同的部分也进行封装成一个方法Ctrl+Alt+M

解析封装的方法

 

封装的聚合方法 

 

最终代码

 

 在一个测试类中打印一下这个结果

成功的得到了三个字段的聚合结果 

 

 6数据聚合-带过滤条件的聚合

 

 

filter是查询聚合过滤项的请求 

 

发现这两个请求携带的参数是一样的为什么查过滤项的时候也要带条件呢过滤项查询要通过聚合来实现聚合一带上条件就来限定聚合的范围为何要限定范围呢直接对整个索引库做聚合不行呢

在搜索是没有加条件搜索的是索引库的所有数据对所有数据做聚合得到城市和品牌没有问题但是当输入内容虹桥得到的数据一定是跟上海虹桥有关的结果

上海虹桥有关的城市对应的一定是上海但是对索引库的所有数据做聚合得到的城市一定包含所有的城市所以用户一定就很奇怪拉命名搜索的是上海的还能出现北京的呢如果再点击北京在结合搜索条件虹桥能搜到任何东西吗肯定是不能的北京没有虹桥所以说不应该对索引库的所有字段做聚合用户条件是虹桥就应该对虹桥相关的酒店做聚合限定聚合的范围需要加查询条件查询时用什么条件聚合时也用什么条件这样就是在酒店的基础上做聚合这样查询结果就更精确了因此在查询过滤项时和查询时要用相同的条件

 

 

 

在HotelController中添加新的接口访问

 

 修改接口的方法加上一个参数上面已经写过这个方法只是没有参数

 实现类的方法加一个参数加一个查询条件

 聚合封装的方法buildAggregation

封装的聚合方法 

 query封装的过滤方法

 

 发现已经搜索出来了

 使用价格过滤城市变少了

 在添加搜索虹桥搜到的更少了城市直接就没了因为虹桥只有是上海没有必要在去选

 所以在聚合的时候需要添加一些过滤条件去限制聚合的范围。

 

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6