企业网站开发有哪些,微信小程序开发工具手机版,四川建设网网站,如何优化网络文章目录 数据聚合聚合的种类RestAPI实现聚合 数据聚合
什么是聚合#xff1f; 聚合可以让我们极其方便的实现对数据的统计、分析、运算。例如#xff1a;
什么品牌的手机最受欢迎#xff1f;这些手机的平均价格、最高价格、最低价格#xff1f;这些手机每月的销售情况如… 文章目录 数据聚合聚合的种类RestAPI实现聚合 数据聚合
什么是聚合 聚合可以让我们极其方便的实现对数据的统计、分析、运算。例如
什么品牌的手机最受欢迎这些手机的平均价格、最高价格、最低价格这些手机每月的销售情况如何
实现这些统计功能的比数据库的sql要方便的多而且查询速度非常快可以实现近实时搜索效果。
聚合的种类
桶Bucket聚合用来对文档做分组 TermAggregation按照文档字段值分组例如按照品牌值分组、按照国家分组Date Histogram按照日期阶梯分组例如一周为一组或者一月为一组 度量Metric聚合用以计算一些值比如最大值、最小值、平均值等 Avg求平均值Max求最大值Min求最小值Stats同时求max、min、avg、sum等 管道pipeline聚合其它聚合的结果为基础做聚合
DSL实现聚合 现在我们要统计所有数据中的酒店品牌有几种其实就是按照品牌对数据分组。此时可以根据酒店品牌的名称做聚合也就是Bucket聚合。
聚合结果排序
默认情况下Bucket聚合会统计Bucket内的文档数量记为_count并且按照_count降序排序。
我们可以指定order属性自定义聚合的排序方式
限定聚合的范围
默认情况下Bucket聚合是对索引库的所有文档做聚合但真实场景下用户会输入搜索条件因此聚合必须是对搜索结果聚合。那么聚合必须添加限定条件。
我们可以限定要聚合的文档范围只要添加query条件即可 Metric聚合语法
我们对酒店按照品牌分组形成了一个个桶。现在我们需要对桶内的酒店做运算获取每个品牌的用户评分的min、max、avg等值。
这就要用到Metric聚合了例如stat聚合就可以获取min、max、avg等结果。 这次的score_stats聚合是在brandAgg的聚合内部嵌套的子聚合。因为我们需要在每个桶分别计算。
小结 aggs代表聚合与query同级此时query的作用是
限定聚合的的文档范围
聚合必须的三要素
聚合名称聚合类型聚合字段
聚合可配置属性有
size指定聚合结果数量order指定聚合结果排序方式field指定聚合字段
RestAPI实现聚合 案例
业务需求搜索页面的品牌、城市等信息不应该是在页面写死而是通过聚合索引库中的酒店数据得来的
分析
目前页面的城市列表、星级列表、品牌列表都是写死的并不会随着搜索结果的变化而变化。但是用户搜索条件改变时搜索结果会跟着变化。
例如用户搜索“东方明珠”那搜索的酒店肯定是在上海东方明珠附近因此城市只能是上海此时城市列表中就不应该显示北京、深圳、杭州这些信息了。
也就是说搜索结果中包含哪些城市页面就应该列出哪些城市搜索结果中包含哪些品牌页面就应该列出哪些品牌。
如何得知搜索结果中包含哪些品牌如何得知搜索结果中包含哪些城市
使用聚合功能利用Bucket聚合对搜索结果中的文档基于品牌分组、基于城市分组就能得知包含哪些品牌、哪些城市了。
因为是对搜索结果聚合因此聚合是限定范围的聚合也就是说聚合的限定条件跟搜索文档的条件一致。 业务实现 在cn.itcast.hotel.web包的HotelController中添加一个方法遵循下面的要求
请求方式POST请求路径/hotel/filters请求参数RequestParams与搜索文档的参数一致返回值类型MapString, ListString 这里调用了IHotelService中的getFilters方法尚未实现。
在cn.itcast.hotel.service.IHotelService中定义新方法 在cn.itcast.hotel.service.impl.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;
}