实战:查询 ES 数据
PassJava (佳必过) 项目全套学习教程连载中,关注公众号悟空聊架构第一时间获取。
文档在线地址: www.passjava.cn
我们已经将数据同步到了 ES 中,现在就是前端怎么去查询 ES 数据中,这里我们还是使用 Postman 来模拟前端查询请求。
1 定义请求参数
请求参数我定义了三个:
- keyword:用来匹配问题或者答案。
- id:用来匹配题目 id。
- pageNum:用来分页查询数据。
这里我将这三个参数定义为一个类:
@Data
public class SearchParam {
private String keyword; // 全文匹配的关键字
private String id; // 题目 id
private Integer pageNum; // 查询第几页数据
}
2 定义返回参数
返回的 response 我也定义了四个字段:
- questionList:查询到的题目列表。
- pageNum:第几页数据。
- total:查询到的总条数。
- totalPages:总页数。
定义的类如下所示:
@Data
public class SearchQuestionResponse {
private List<QuestionEsModel> questionList; // 题目列表
private Integer pageNum; // 查询第几页数据
private Long total; // 总条数
private Integer totalPages; // 总页数
}
3 组装 ES 查询参数
调用 ES 的查询 API 时,需要构建查询参数。
组装查询参数的核心代码如下所示:

-
第一步:创建检索请求。
-
第二步:设置哪些字段需要模糊匹配。这里有三个字段:title,answer,typeName。
-
第三步:设置如何分页。这里分页大小是 5 个。
-
第四步:调用查询 api。
4 格式化 ES 返回结果
ES 返回的数据是 ES 定义的格式,真正的数据被嵌套在 ES 的 response 中,所以需要格式化返回的数据。
核心代码如下图所示:

- 第一步:获取查到的数据。
- 第二步:获取真正命中的结果。
- 第三步:格式化返回的数据。
- 第四步:组装分页参数。
5 测试 ES 查询
5.1 实验一:测试 title 匹配
我们现在想要验证 title 字段是否能匹配到,传的请求参数 keyword = 111,匹配到了 title = 111 的数据,且只有一条。页码 pageNum 我传的 1,表示返回第一页数据。如下图所示:

5.2 实验二:测试 answer 匹配
我们现在想要验证 answer 字段是否能匹配到,传的请求参数 keyword = 测试答案,匹配到了 title = 测试答案的数据,且只有一条,说明查询成功。如下图所示:

5.2 实验三:测试 id 匹配
我们现在想要匹配题目 id 的话,需要传请求参数 id,而且 id 是精确匹配。另外 id 和 keyword 是取并集,所以不能传 keyword 字段。
请求参数 id = 5,返回结果也是 id =5 的数据,说明查询成功。如下图所示:

总结
本文通过我的开源项目 passjava 来讲解 ES 的整合,ES 的 API 使用以及测试。非常详细地讲解了每一步该如何做,相信通过阅读本篇后,再加上自己的实践,一定能掌握前后端该如何使用 ES 来达到高效搜索的目的。
当然,ES API 还有很多功能未在本文实践,有兴趣的同学可以到 ES 官网进行查阅和学习。
再次强调:本文的代码都是辛苦调试出来的,请不要忘记点赞和转发哦~
















