目录
在(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** 这个类。
这里实现我们要做两层转换:
- 将SearchHits转为List
- 将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;
}