四、SpringBoot 整合 ElasticSearch
对于 SpringBoot 来说,ElasticSearch 其实只是一个中间件,用途在于提供高效的搜索服务,比较幸运的是 SpringBoot 也为我们提供了 ElasticSearch 依赖库,添加依赖包,通过 JPA 访问非常方便,整合过程如下!
4.1、创建一个SpringBoot项目
在pom.xml
中,添加依赖库 ElasticSearch 依赖包
<!--jpa 支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--elasticsearch--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
在application.properties
中添加配置,其中节点名称cluster-name
需要与上面的配置保持一致!
spring.data.elasticsearch.cluster-name=my-es spring.data.elasticsearch.cluster-nodes=197.168.24.207:9300
4.1、编写 CURD
我们先写一个的实体类Student
,借助这个实体类来完成基础的 CRUD 功能。
- 新增实体类
Student
,其中indexName
表示索引,type
表示索引类别
@Data @Accessors(chain = true) @Document(indexName = "student", type = "school") public class Student { private static final long serialVersionUID = 1l; @Id private String id; private String name; private String gender; private Integer age; }
注意id
字段是必须的,可以不写注解@Id
!
- 使用 JPA 作为数据持久层,接口继承自
ElasticsearchRepository
,同时新增两个自定义查询方法
public interface StudentRepository extends ElasticsearchRepository<Student, String> { /** * 通过姓名模拟查询学生信息 * @param keyword * @return */ List<Student> findByNameLike(String keyword); /** * 自定义查询,固定匹配查询学生信息 * @param keyword * @return */ @Query("{\"match_phrase\":{\"name\":\"?0\"}}") List<Student> findByNameCustom(String keyword); }
- 创建控制层,编写基础的 CRUD 功能
@RestController @RequestMapping("/student") public class StudentController { @Autowired private StudentRepository studentRepository; @Autowired private ElasticsearchTemplate elasticsearchTemplate; /** * 批量添加 * @param students * @return */ @PostMapping("/batchAdd") public void add(@RequestBody List<Student> students){ studentRepository.saveAll(students); } /** * 添加 * @param student * @return */ @PostMapping("/add") public void add(@RequestBody Student student){ studentRepository.save(student); } /** * 修改 * @param student * @return */ @PostMapping("/update") public void updateById(@RequestBody Student student){ studentRepository.save(student); } /** * 删除 * @param id * @return */ @PostMapping("/delete/{id}") public void deleteById(@PathVariable String id){ studentRepository.deleteById(id); } /** * 获取所有信息 * @return */ @GetMapping("/get") public Object getAll(){ Iterable<Student> iterable = studentRepository.findAll(); List<Student> list = new ArrayList<>(); iterable.forEach(list :: add); return list; } /** * 查询指定ID * @param id * @return */ @GetMapping("/get/{id}") public Object getById(@PathVariable String id){ if(StringUtils.isEmpty(id)){ return Result.error(); } Optional<Student> studentOptional = studentRepository.findById(id); if(studentOptional.isPresent()){ return studentOptional.get(); } return null; } /** * 普通搜索 * @param keyword * @return */ @GetMapping("/search/name") public Object searchName(String keyword){ List<Student> students = studentRepository.findByNameLike(keyword); return students; } /** * 自定义匹配 * 普通搜索 * @param keyword * @return */ @GetMapping("/search/name/custom") public Object searchTitleCustom(String keyword){ List<Student> students = studentRepository.findByNameCustom(keyword); return students; } /** * 高级搜索,可以自定义添加搜索字段 * @param keyword * @return */ @GetMapping("/top/search/name") public Object topSearchTitle(String keyword){ SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(queryStringQuery(keyword)) .build(); //使用searchQuery进行搜索 List<Student> students = elasticsearchTemplate.queryForList(searchQuery, Student.class); return students; } }
4.2、CRUD 测试
CRUD 编写完了,我们验证一下是否可以正常操作,启动 springboot 项目,使用 postman 进行测试。
- 批量新增、新增功能测试
执行之后,登录可视化界面查询界面,选择索引student
,可以很清晰的看到数据已经进去了
修改功能测试,修改时需要传入ID
将王小贱从26岁修改为30岁,登录可视化界面查询数据也已经修改成功!
删除功能测试,只需要传入ID
删除李四,登录可视化界面查询数据也已经删除成功!
查询功能测试,查询所有数据
查询功能测试,查询指定ID
信息
查询功能测试,普通模糊查询,ElasticSearch 会对关键词进行拆分,只要有包含关键字的都会查询出来,例如输入王张
,会将包含王
或者张
的姓名信息查询出来
查询功能测试,高级查询,这个是使用官方api提供的查询入口,可以在方法中进行自定义搜索
五、总结
elasticsearch 在海量数据查询方面,非常高效,本来想写在大量数据查询方面,数据库与 elasticsearch 的查询效率比对,由于篇幅较长会造成阅读体验降低,后在下篇文章中再次介绍这个部分。
对于想学习 elasticsearch 的新手,尤其是安装部分可能比较困难,因此花的编写时间比较多,后续的整合都比较简单,elasticsearch 真正的强大的地方在于高效信息搜索,本篇对 elasticsearch 的搜索只是做一个基础的介绍,具体的高级搜索方法大家可以参考官方文档 API,本篇可以看作为 elasticsearch 搜索服务入门的教程,可能也有遗漏的地方,欢迎网友点评、吐槽!