【电商项目】商品搜索开发复盘(3):搜索与封装实现逻辑思考与编写

目录

一、构造ES搜索条件

二、搜索

三、将查询结果封装为Mybatis-plus的Page对象

四、封装结果对象

五、代码整体展示


在(2)我们实现了构造ES搜索条件的代码,然后我们继续按照之前的思路往下编写👇

java 复制代码
/*
     * 构造搜索条件
     * @param goodsSearchParam 查询条件对象
     * @return 搜索条件对象
     */
public NativeQuery buildQuery(GoodsSearchParam goodsSearchParam) {
    ...
}

一、构造ES搜索条件

直接调用我们之前已经写好的方法👇:

java 复制代码
public GoodsSearchResult search(GoodsSearchParam goodsSearchParam) {
        // 1.构造ES搜索条件
        NativeQuery query = buildQuery(goodsSearchParam);
}

二、搜索

利用搜索条件完成搜索的方法,是 Elasticsearch 的 ElasticsearchTemplate 这个工具类提供的,所以我们要提前在类里面引入一下 ElasticsearchTemplate elasticsearchTemplate 这个工具类。然后调用其 search 方法。

search 需要传入两个方法,一个是搜索条件对象,一个是查询结果封装的类型。

java 复制代码
// 2.搜索
SearchHits<GoodsES> search = elasticsearchTemplate.search(query, GoodsES.class);

三、将查询结果封装为Mybatis-plus的Page对象

这里需要纠正之前的一个错误。之前我们备注写的是"将查询结果封装为Page对象",但封装为 page 对象只是泛泛说法,可以是任意分页对象。而我们的操作是特指把 ES 查询出来的数据 ,所以应该说**"封装为 MyBatis‑Plus 的 Page 对象** ",并手动构建**com.baomidou.mybatisplus.extension.plugins.pagination.Page** 这个类。

这里实现我们要做两层转换:

  1. 将SearchHits转为List
  2. 将List转为MP的Page对象
java 复制代码
// 3.将查询结果封装为Mybatis-plus的Page对象
// 3.1 将SearchHits转为List
List<GoodsES> list = new ArrayList<>();
for (SearchHit<GoodsES> goodsESSearchHit : search) {
    GoodsES content = goodsESSearchHit.getContent();
    list.add(content);
  }
// 3.2 将List转为MP的Page对象
Page<GoodsES> page = new Page<>();
page.setCurrent(goodsSearchParam.getPage())  //当前页
        .setSize(goodsSearchParam.getSize()) //每页条数
        .setTotal(search.getTotalHits())     //总条数
        .setRecords(list);  //结果集

Q1:为什么要做两层转换:

A: search 是 ES 返回的结果对象(SearchHits);Page是 MyBatis‑Plus 的分页对象。

两者完全来自不同框架,结构互不认识,不能直接拿来返回。

SearchHit<GoodsES>外层是 ES 包装壳,要循环利用.getContent()剥离外壳拿到实体,变成List<GoodsES>

Q2:封装为 MyBatis‑Plus 的 Page 对象的目的:

**A:**方便前端人员处理,前端人员处理的所有分页查询,都是 MyBatis‑Plus 的 Page 对象。

四、封装结果对象

先把封装对象创建出来,然后明确需要封装的内容:查询结果,查询参数,查询面板。

根据实体参数内容,把传过来的参数直接封装。

java 复制代码
// 4.封装结果对象
// 4.1 查询结果
GoodsSearchResult result = new GoodsSearchResult();
// 当前页的商品数据 + 分页信息
result.setGoodsPage(page);
// 4.2 查询参数
result.setGoodsSearchParam(goodsSearchParam);
// 4.3 查询面板
buildSearchPanel(goodsSearchParam, result);

查询面板的封装是比较复杂的,需要我们把方法拎出来写然后调用,下一篇(4)我们将会写封装查询面板功能。

五、代码整体展示

java 复制代码
/*
     * 搜索商品
     * @param goodsSearchParam 搜索条件
     * @return
     */
    @Override
    public GoodsSearchResult search(GoodsSearchParam goodsSearchParam) {
        // 1.构造ES搜索条件
        NativeQuery query = buildQuery(goodsSearchParam);
        // 2.搜索
        SearchHits<GoodsES> search = elasticsearchTemplate.search(query, GoodsES.class);
        // 3.将查询结果封装为Mybatis-plus的Page对象
        // 3.1 将SearchHits转为List
        List<GoodsES> list = new ArrayList<>();
        for (SearchHit<GoodsES> goodsESSearchHit : search) {
            GoodsES content = goodsESSearchHit.getContent();
            list.add(content);
        }
        // 3.2 将List转为MP的Page对象
        Page<GoodsES> page = new Page<>();
        page.setCurrent(goodsSearchParam.getPage())  //当前页
                .setSize(goodsSearchParam.getSize()) //每页条数
                .setTotal(search.getTotalHits())     //总条数
                .setRecords(list);  //结果集
        // 4.封装结果对象
        // 4.1 查询结果
        GoodsSearchResult result = new GoodsSearchResult();
        // 当前页的商品数据 + 分页信息
        result.setGoodsPage(page);
        // 4.2 查询参数
        result.setGoodsSearchParam(goodsSearchParam);
        // 4.3 查询面板
        buildSearchPanel(goodsSearchParam, result);

        return result;
    }
相关推荐
AI人工智能+电脑小能手1 小时前
大白话说Java设计模式-37-中介者模式(源码剖析篇)
java·设计模式·线程池·中介者模式·源码分析·executor·applicationeventmulticaster
焦虑的说说1 小时前
虚拟线程浅析
java
摇滚侠2 小时前
《SpringBoot 3:入门与应用实战》第 7 章 AOP 思想与实现 阅读笔记 13
java·spring boot·笔记
Mr. zhihao2 小时前
线上卡顿排查决策手册:场景 × 命令 × 现象 × 调整方案
java·开发语言·jvm
FYKJ_20102 小时前
springboot网上购书商城---附源码15749
java·spring boot·后端·python·spark·django·php
LayZhangStrive2 小时前
Java IDEA - 各种快捷键设置汇总(提高工具使用效率)
java·idea·设置·快捷键
snow@li2 小时前
Java:事务管理全景梳理/解决业务系统数据一致性问题
java
额额额对了2 小时前
Linux 进程管理详解:从概念到实战
java·服务器·前端