阅读 59

SpringBoot2.x系列教程30--SpringBoot中整合ElasticSearch实现搜索效果

前言

在上一节中,壹哥 带大家学习了在Spring Boot中整合MongoDB数据库实现了缓存效果。我们在开发时还有一种很常见的功能,需要用到另一种非关系型数据库,那就是全文检索效果。全文检索效果对实时性要求很高,所以普通的关系型数据库是无法满足要求的,这里我给大家引入ElasticSearch数据库。

所以接下来,我会带大家讲解如何在SpringBoot中整合ElasticSearch实现全文检索的操作。

一. ElasticSearch分布式数据库

1. ElasticSearch简介

ElasticSearch是一个基于Lucene的开源的、分布式实时搜索和分析引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。

Spring Boot为Elasticsearch提供基本的自动配置,我们可以利用Spring Data Elasticsearch在Spring Boot中进行开发。

2. 搭建配置ElasticSearch环境

在利用Elastic Search开发之前,请先搭建好Elastic Search环境,我这里配置了ELK环境。关于ELK环境的搭建,感兴趣的朋友可以自行搜索配置。

3. Spring Boot与ElasticSearch的版本对应关系

在新版本的Spring boot2.x中,spring-boot-starter-data-elasticsearch支持的Elasticsearch版本是2.X,但Elasticsearch实际上已经发展到6.5.X版本了,为了更好的使用Elasticsearch的新特性,我们可以弃用spring-boot-starter-data-elasticsearch依赖,改为直接使用Spring-data-elasticsearch,以便启用对新版本支持,目前的版本对应关系如下:

二. Spring Boot整合Elastic Search

1. 开发环境要求

  • Spring Boot 2.2.5;

  • Elastic Search 5.6.8;

  • Kibana 5.6.8;

  • Maven

2. 创建Web项目

我们按照之前的经验,创建一个SpringBoot的Web程序,具体过程略。

3. 添加依赖

在pom.xml文件中添加ElasticSearch的依赖包。

<dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 复制代码

注意:

因为我的elastic search 并不是6.5.x以上的最新版本,而是5.6.8版本,所以我这里使用的还是spring-boot-starter-data-elasticsearch的依赖包。

4. 创建application.yml文件

创建application.yml文件,配置ElasticSearch数据库信息。

# Elasticsearch cluster name. spring:   data:     elasticsearch:       cluster-name: elasticsearch       # Comma-separated list of cluster node addresses.       cluster-nodes: localhost:9300       # Whether to enable Elasticsearch repositories.       repositories:         enabled: true 复制代码

5. 创建Book实体类

创建一个Book实体类,用于同步ElasticSearch数据库的索引信息。

package com.yyg.boot.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; /**  *Document:  * indexName = "book":索引名称,类似于mysql中的数据库;  * type = "doc":文档类型,类似于mysql中的表;  * shards = 5:分片数量  * replicas = 1:副本  */ @Data @NoArgsConstructor @AllArgsConstructor @Document(indexName = "book", type = "doc", shards = 5, replicas = 1) public class Book {     @Id     private String id;     /**      * 中文分词设置,前提是您的es已经安装了中文分词ik插件      * 中文分词有两种形式:      * ik_max_word:会将文本做最细粒度的拆分      * ik_smart:会将文本做最粗粒度的拆分      */     @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer ="ik_max_word")     private String title;     private String author;     private String postDate; } 复制代码

6. 创建Repository仓库类

创建一个ElasticsearchRepository接口子类,利用该类进行数据库操作。

package com.yyg.boot.repository; import com.yyg.boot.entity.Book; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.annotations.Query; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface BookRepository extends ElasticsearchRepository<Book, String> {     //Optional<Book> findById(String id);     Page<Book> findByAuthor(String author, Pageable pageable);      } 复制代码

7. 定义Service及其实现类

在service层封装实现几个数据库的增删改查方法。

7.1 BookService接口

定义BookService接口,封装对索引的CRUD方法。

package com.yyg.boot.service; import com.yyg.boot.entity.Book; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import java.util.List; import java.util.Optional; public interface BookService {     Optional<Book> findById(String id);     Book save(Book blog);     void delete(Book blog);     Optional<Book> findOne(String id);     List<Book> findAll();     Page<Book> findByAuthor(String author, PageRequest pageRequest); } 复制代码

7.2 BookServiceImpl实现类

实现上面封装的方法,对索引库进行操作。

package com.yyg.boot.service.impl; import com.yyg.boot.entity.Book; import com.yyg.boot.repository.BookRepository; import com.yyg.boot.service.BookService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; @Slf4j @Service public class BookServiceImpl implements BookService {     @Autowired     private BookRepository bookRepository;     @Override     public Optional<Book> findById(String id) {         return bookRepository.findById(id);     }     @Override     public Book save(Book blog) {         return bookRepository.save(blog);     }     @Override     public void delete(Book blog) {         bookRepository.delete(blog);     }     @Override     public Optional<Book> findOne(String id) {         return bookRepository.findById(id);     }     @Override     public List<Book> findAll() {         return (List<Book>) bookRepository.findAll();     }     @Override     public Page<Book> findByAuthor(String author, PageRequest pageRequest) {         return bookRepository.findByAuthor(author, pageRequest);     } } 复制代码

8. 创建BookController接口

创建Controller,定义几个URL接口用于测试调用。

package com.yyg.boot.web; import com.yyg.boot.entity.Book; import com.yyg.boot.service.BookService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.web.bind.annotation.*; import java.util.Optional; @Slf4j @RestController @RequestMapping("/book") public class ElasticController {     @Autowired     private BookService bookService;     @Autowired     private ElasticsearchTemplate elasticsearchTemplate;     /**      * 创建索引      */     @PostMapping("/create")     public void createIndex() {         elasticsearchTemplate.createIndex(Book.class);     }     @PostMapping("/save")     public void Save() {         Book book = new Book("100", "ElasticSearch第2种实现方式", "一一哥", "2020-04-13");         log.warn(book.toString());         bookService.save(book);     }     @GetMapping("/id/{id}")     public Book getBookById(@PathVariable String id) {         Optional<Book> opt = bookService.findById(id);         Book book = opt.get();         log.warn(book.toString());         return book;     } } 复制代码

9. 创建Application入口类

最后我们创建一个入口类,用于启动项目。

package com.yyg.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ElasticSearchApplication {     public static void main(String[] args) {         SpringApplication.run(ElasticSearchApplication.class, args);     } } 复制代码

10. 项目代码结构

最后来看看项目的完整代码结构,各位可以参考创建本项目。

三. ElasticSearch基本使用

1. 启动elastic search和kibana环境

我们在进行ElasticSearch操作之前,请先启动相关软件,这里要先启动ElasticSearch数据库,因为我还要在管理台查看索引的操作结果,所以还启动了Kibana。

2. 启动kibana

Kibana启动后,我们可以在浏览器中登录进去,正常情况下可以看到Kibana的管理界面。

四. 启动项目进行测试

接下来我们对上面创建的各接口进行测试。

1. 测试创建索引功能

我们在Postman中执行创建索引的接口,可以看到成功的执行了。

然后我们在kibana中把索引同步进来。

然后此时发现索引库中还没有任何数据内容。

2. 添加内容

所以接下来我们先在Postman中执行添加索引内容的操作。

3. 查询索引库

此时发现kibana中已经有了索引数据,说明我们之前添加的索引操作是成功的。

4. 按照id查询索引数据

接下来我们再根据id进行索引的查询。

结语

至此,壹哥 就带各位实现了在Spring Boot中整合Elastic Search索引库,当然关于ElasticSearch的用法还有很多,在此我就不再一一介绍了。

今日小作业:

利用ElasticSearch数据库,实现学生信息管理系统的全文搜索效果。


作者:一一哥Sun
链接:https://juejin.cn/post/7169346432489488398


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐