网站建立连接不安全怎么处理,html网页模板下载html模板,网页游戏开服表就上囧游村,企业网站建设实训小结文章目录 ⛄引言一、数据聚合⛅简介⚡聚合的分类 二、DSL实现数据聚合⏰Bucket聚合⚡Metric聚合 三、RestAPI实现数据聚合⌚业务需求⏰业务代码实现 ✅效果图⛵小结 ⛄引言
本文参考黑马 分布式Elastic search
Elasticsearch是一款非常强大的开源搜索引擎#xff0c;具备非常… 文章目录 ⛄引言一、数据聚合⛅简介⚡聚合的分类 二、DSL实现数据聚合⏰Bucket聚合⚡Metric聚合 三、RestAPI实现数据聚合⌚业务需求⏰业务代码实现 ✅效果图⛵小结 ⛄引言
本文参考黑马 分布式Elastic search
Elasticsearch是一款非常强大的开源搜索引擎具备非常多强大功能可以帮助我们从海量数据中快速找到需要的内容
本篇文章将讲解 Elastic Search 如何实现数据聚合以及 在项目实战中如何通过数据聚合实现业务需求并完成功能。
一、数据聚合
⛅简介
以下为官方 解释
聚合可以进行各种组合以构建复杂的数据汇总。
可以看作是在一组文档上建立分析信息的工作单元统计一些文档集。聚合可以将一些独立的功能单元可以被混合在一起来满足你的需求是一种单独的语法。 kibana的可视化看板就是非常经典的聚合功能的体现。
简单的来说
聚合 可以让我们极其方便的实现对数据的统计、分析、运算。例如
什么品牌的手机最受欢迎这些手机的平均价格、最高价格、最低价格这些手机每月的销售情况如何
实现这些统计功能的比数据库的sql要方便的多而且查询速度非常快可以实现实时搜索效果。
聚合就是类似于垃圾分类干湿分离每个桶中装不同的数据。
⚡聚合的分类
聚合主要分为三大类
桶Bucket 聚合用来对文档做分组 TermAggregation按照文档字段值分组例如按照品牌值分组、按照国家分组Date Histogram按照日期阶梯分组例如一周为一组或者一月为一组 度量Metric 聚合用以计算一些值比如最大值、最小值、平均值等 Avg求平均值Max求最大值Min求最小值Stats同时求max、min、avg、sum等 管道pipeline 聚合其它聚合的结果为基础做聚合 注意 参加聚合的字段必须是keyword、日期、数值、布尔类型 二、DSL实现数据聚合
例如要统计所有数据中的酒店品牌有几种其实就是按照品牌对数据分组。此时可以根据酒店品牌的名称做聚合也就是Bucket聚合。
⏰Bucket聚合
语法如下
GET /hotel/_search
{size: 0, // 设置size为0结果中不包含文档只包含聚合结果aggs: { // 定义聚合brandAgg: { //给聚合起个名字terms: { // 聚合的类型按照品牌值聚合所以选择termfield: brand, // 参与聚合的字段size: 20 // 希望获取的聚合结果数量}}}
}结果如图 聚合结果进行数据排序
默认情况下Bucket聚合会统计Bucket内的文档数量记为 count并且按照 _count降序排序。
我们可以指定 order属性自定义聚合的排序方式
GET /hotel/_search
{size: 0, aggs: {brandAgg: {terms: {field: brand,order: {_count: asc // 按照_count升序排列},size: 20}}}
}限定聚合范围
默认情况下Bucket聚合是对索引库的所有文档做聚合但真实场景下用户会输入搜索条件因此聚合必须是对搜索结果聚合。那么聚合必须添加限定条件。
我们可以限定要聚合的文档范围只要添加query条件即可
GET /hotel/_search
{query: {range: {price: {lte: 200 // 只对200元以下的文档聚合}}}, size: 0, aggs: {brandAgg: {terms: {field: brand,size: 20}}}
}⚡Metric聚合
我们对酒店按照品牌分组形成了一个个桶。现在我们需要对桶内的酒店做运算获取每个品牌的用户评分的min、max、avg等值。
这就要用到Metric聚合了例如stat聚合就可以获取min、max、avg等结果。
语法如下
GET /hotel/_search
{size: 0, aggs: {brandAgg: { terms: { field: brand, size: 20},aggs: { // 是brands聚合的子聚合也就是分组后对每组分别计算score_stats: { // 聚合名称stats: { // 聚合类型这里stats可以计算min、max、avg等field: score // 聚合字段这里是score}}}}}
}这次的score_stats聚合是在 brandAgg 的聚合内部嵌套的子聚合。因为我们需要在每个桶分别计算。
另外我们还可以给聚合结果做个排序例如按照每个桶的酒店平均分做排序 聚合小结
aggs代表聚合与query同级此时query的作用是
限定聚合的的文档范围
聚合必须的三要素
聚合名称聚合类型聚合字段
聚合可配置属性有
size指定聚合结果数量order指定聚合结果排序方式field指定聚合字段
三、RestAPI实现数据聚合
API语法
聚合条件与query条件同级别因此需要使用request.source()来指定聚合条件。
聚合条件的语法 聚合的结果也与查询结果不同API也比较特殊。不过同样是JSON逐层解析 ⌚业务需求
需求在搜索页面的品牌、城市等信息不应该是在页面写死而是通过聚合索引库中的酒店数据得来的 需求分析
目前页面的城市列表、星级列表、品牌列表都是写死的并不会随着搜索结果的变化而变化。但是用户搜索条件改变时搜索结果会跟着变化。
例如用户搜索“天安门”那搜索的酒店肯定是在虹桥附近因此城市只能是上海此时城市列表中就不应该显示其他城市信息了。
也就是说搜索结果中包含哪些城市页面就应该列出哪些城市搜索结果中包含哪些品牌页面就应该列出哪些品牌。
如何得知搜索结果中包含哪些品牌如何得知搜索结果中包含哪些城市
使用聚合功能利用Bucket聚合对搜索结果中的文档基于品牌分组、基于城市分组就能得知包含哪些品牌、哪些城市了。
因为是对搜索结果聚合因此聚合是限定范围的聚合也就是说聚合的限定条件跟搜索文档的条件一致。
查看浏览器可以发现前端其实已经发出了这样的一个请求 因此返回的类型应该是以下 结果是一个Map结构
key是字符串城市、星级、品牌、价格value是集合例如多个城市的名称
⏰业务代码实现
在HotelController中添加一个方法遵循下面的要求
请求方式POST请求路径/hotel/filters请求参数RequestParams与搜索文档的参数一致返回值类型MapString, ListString
代码 PostMapping(filters)public MapString, ListString getFilters(RequestBody RequestParams params){return hotelService.getFilters(params);}这里调用了IHotelService中的getFilters方法尚未实现。
在IHotelService中定义新方法
MapString, ListString filters(RequestParams params);在HotelService中实现该方法
Override
public MapString, ListString filters(RequestParams params) {try {// 1.准备RequestSearchRequest request new SearchRequest(hotel);// 2.准备DSL// 2.1.querybuildBasicQuery(params, request);// 2.2.设置sizerequest.source().size(0);// 2.3.聚合buildAggregation(request);// 3.发出请求SearchResponse response client.search(request, RequestOptions.DEFAULT);// 4.解析结果MapString, ListString result new HashMap();Aggregations aggregations response.getAggregations();// 4.1.根据品牌名称获取品牌结果ListString brandList getAggByName(aggregations, brandAgg);result.put(品牌, brandList);// 4.2.根据品牌名称获取品牌结果ListString cityList getAggByName(aggregations, cityAgg);result.put(城市, cityList);// 4.3.根据品牌名称获取品牌结果ListString starList getAggByName(aggregations, starAgg);result.put(星级, starList);return result;} catch (IOException e) {throw new RuntimeException(e);}
}private void buildAggregation(SearchRequest request) {request.source().aggregation(AggregationBuilders.terms(brandAgg).field(brand).size(100));request.source().aggregation(AggregationBuilders.terms(cityAgg).field(city).size(100));request.source().aggregation(AggregationBuilders.terms(starAgg).field(starName).size(100));
}private ListString getAggByName(Aggregations aggregations, String aggName) {// 4.1.根据聚合名称获取聚合结果Terms brandTerms aggregations.get(aggName);// 4.2.获取bucketsList? extends Terms.Bucket buckets brandTerms.getBuckets();// 4.3.遍历ListString brandList new ArrayList();for (Terms.Bucket bucket : buckets) {// 4.4.获取keyString key bucket.getKeyAsString();brandList.add(key);}return brandList;
}✅效果图 ⛵小结
以上就是【Bug 终结者】对 Spring Boot 整合 分布式搜索引擎 Elastic Search 实现 搜索、分页与结果过滤 的简单介绍ES搜索引擎无疑是最优秀的分布式搜索引擎使用它可大大提高项目的灵活、高效性 技术改变世界 如果这篇【文章】有帮助到你希望可以给【Bug 终结者】点个赞创作不易如果有对【后端技术】、【前端领域】感兴趣的小可爱也欢迎关注❤️❤️❤️ 【Bug 终结者】❤️❤️❤️我将会给你带来巨大的【收获与惊喜】