微服务——es数据聚合+RestClient实现聚合

数据聚合

聚合的种类

DSL实现Bucket聚合

如图所示,设置了10个桶,那么就显示了数量最多的前10个桶,品牌含有7天酒店的有30家,

品牌含有如家的也有30家。

修改排序规则

限定聚合范围

DSL实现Metrics聚合

如下案例要求对不同的品牌进行统计,所以要进行分组。

如图所示,要对桶的平均评分做排序,要使用不同桶的平均评分

RestClient实现聚合

请求组装

java 复制代码
    @Test
    void testAggregation() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSl
        //2.1设置size
        request.source().size(0);
        //2.2聚合
        request.source().aggregation(AggregationBuilders
                .terms("brandAgg")
                .field("brand")
                .size(10)
        );
        //3.发出请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析结果
        System.out.println(response);
    }

结果解析

java 复制代码
    @Test
    void testAggregation() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSl
        //2.1设置size
        request.source().size(0);
        //2.2聚合
        request.source().aggregation(AggregationBuilders
                .terms("brandAgg")
                .field("brand")
                .size(10)
        );
        //3.发出请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析结果
        Aggregations aggregations = response.getAggregations();
        //4.1根据聚合名称获取聚合结果
        Terms brandTerms = aggregations.get("brandAgg");
        //4.2获取buckets
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        //4.3遍历
        for (Terms.Bucket bucket : buckets) {
            //4.4获取key
            String key = bucket.getKeyAsString();
            System.out.println(key);
        }
    }

多条件聚合

在Service中

将公共代码抽取出来,提高复用性

java 复制代码
    @Override
    public Map<String, List<String>> filters() {
        try {
              //1.准备Request
              SearchRequest request = new SearchRequest("hotel");
              //2.准备DSl
              //2.1设置size
              request.source().size(0);
              //2.2聚合
              buildAggregation(request);
              //3.发出请求
              SearchResponse response = client.search(request, RequestOptions.DEFAULT);
              //4.解析结果
              Map<String, List<String>>result=new HashMap<>();
              Aggregations aggregations = response.getAggregations();
              //5.1根据品牌名称获取品牌结果
              List<String> brandList = getAggByName(aggregations,"brandAgg");
              result.put("品牌",brandList);
              //5.2根据品牌名称获取品牌结果
              List<String> cityList = getAggByName(aggregations,"cityAgg");
              result.put("城市",cityList);
              //5.3根据品牌名称获取品牌结果
              List<String> starList = getAggByName(aggregations,"starAgg");
              result.put("星级",starList);
              return result;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    private static List<String> getAggByName(Aggregations aggregations,String aggName) {
        //4.1根据聚合名称获取聚合结果
        Terms brandTerms = aggregations.get(aggName);
        //4.2获取buckets
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        //4.3遍历
        List<String>brandList=new ArrayList<>();
        for (Terms.Bucket bucket : buckets) {
            //4.4获取key
            String key = bucket.getKeyAsString();
            brandList.add(key);
        }
        return brandList;
    }

在一个测试类中

java 复制代码
@SpringBootTest
class HotelDemoApplicationTests {

    @Autowired
    private IHotelService hotelService;

    @Test
    void contextLoads() {
        Map<String, List<String>> filters = hotelService.filters();
        System.out.println(filters);
    }

}

运行得到

带过滤条件的聚合

在查询的时候要在查询结果上做聚合,不应该直接将所有数据的聚合结果返回。

所以就是加上query参数。

Controller中

传递的参数和正常参数一模一样

java 复制代码
    @PostMapping("filters")
    public Map<String, List<String>> getFilters(@RequestBody RequestParams Params)
    {
        return hotelService.filters(Params);
    }

Service中

添加传递参数,并且新设置了2.3query,使用搜索时同款的query设置方法

java 复制代码
 @Override
    public Map<String, List<String>> filters(RequestParams Params) {
        try {
              //1.准备Request
              SearchRequest request = new SearchRequest("hotel");
              //2.准备DSl
              //2.1设置size
              request.source().size(0);
              //2.2聚合
              buildAggregation(request);
              //2.3query
            buildBasicQuery(Params, request);
            //3.发出请求
              SearchResponse response = client.search(request, RequestOptions.DEFAULT);
              //4.解析结果
              Map<String, List<String>>result=new HashMap<>();
              Aggregations aggregations = response.getAggregations();
              //5.1根据品牌名称获取品牌结果
              List<String> brandList = getAggByName(aggregations,"brandAgg");
              result.put("品牌",brandList);
              //5.2根据品牌名称获取品牌结果
              List<String> cityList = getAggByName(aggregations,"cityAgg");
              result.put("城市",cityList);
              //5.3根据品牌名称获取品牌结果
              List<String> starList = getAggByName(aggregations,"starAgg");
              result.put("星级",starList);
              return result;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

结果测试

根据搜索框和过滤条件成功过滤

相关推荐
光算科技5 分钟前
如何用WordPress和Shopify提升SEO表现?
搜索引擎
SafePloy安策35 分钟前
ES信息防泄漏:策略与实践
大数据·elasticsearch·开源
学术搬运工41 分钟前
【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
大数据·图像处理·人工智能·科技·机器学习·自然语言处理
涔溪41 分钟前
Ecmascript(ES)标准
前端·elasticsearch·ecmascript
Matrix702 小时前
HBase理论_背景特点及数据单元及与Hive对比
大数据·数据库·hbase
B站计算机毕业设计超人3 小时前
计算机毕业设计Python+大模型农产品价格预测 ARIMA自回归模型 农产品可视化 农产品爬虫 机器学习 深度学习 大数据毕业设计 Django Flask
大数据·爬虫·python·深度学习·机器学习·课程设计·数据可视化
Carl_奕然4 小时前
【大数据算法】MapReduce算法概述之:MapReduce基础模型
大数据·算法·mapreduce
csdn5659738504 小时前
Elasticsearch 重建索引 数据迁移
elasticsearch·数据迁移·重建索引
天幕繁星4 小时前
docker desktop es windows解决vm.max_map_count [65530] is too low 问题
windows·elasticsearch·docker·docker desktop
Elastic 中国社区官方博客4 小时前
Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索