极简教程 | Spring Boot整合Elasticsearch实现数据搜索引擎

架构师精进

共 4238字,需浏览 9分钟

 ·

2021-11-15 15:16

前面介绍了Elasticsearch的特点和优势,接下来在Spring Boot项目中使用Elasticsearch一步一步地实现搜索引擎的功能。


一、Spring Boot对Elasticsearch的支持

在没有Spring Boot之前使用Elasticsearch非常痛苦,需要对Elasticsearch客户端进行一系列的封装等操作,使用复杂,配置烦琐。所幸,Spring Boot提供了对Spring Data Elasticsearch的封装组件
spring-boot-starter-data-elasticsearch,它让Spring Boot项目可以非常方便地去操作Elasticsearch中的数据。

值得注意的是,Elasticsearch的5.x、6.x、7.x版本之间的差别还是很大的。Spring Data Elasticsearch、Spring Boot与Elasticsearch之间有版本对应关系,不同的版本之间不兼容,Spring Boot 2.1对应的是Spring Data Elasticsearch 3.1.2版本。对应关系如表13-1所示。

表13-1 Spring Data Elasticsearch、Spring Boot与Elasticsearch的对应关系

Spring Data Elasticsearch

Spring Boot

Elasticsearch

3.2.x

2.2.x

6.8.4

3.1.x

2.1.x

6.2.2

3.0.x

2.0.x

5.5.0

2.1.x

1.5.x

2.4.0

这是官方提供的版本对应关系,建议按照官方的版本对应关系进行选择,以避免不必要的麻烦。

二、Spring Boot操作Elasticsearch的方式

由于Elasticsearch和Spring之间存在版本兼容的问题,导致在Spring Boot项目中操作Elasticsearch的方式有很多种,如Repositories、JestClient、Rest API等。因此有必要梳理一下主流的Spring Boot操作Elasticsearch的方式。目前,Spring推荐使用Elasticsearch的方式,如下图所示:


我们看到Spring Boot提供了ElasticSearchRepository和ElasticsearchRestTemplate实现索引数据的增删改查。

  • ElasticSearchRepository:继承自Spring Data中的Repository接口,所以支持以数据库的方式对数据进行增删改查的操作,而且支持已命名查询等数据查询。

  • ElasticsearchRestTemplate:spring-data-Elasticsearch项目中的一个类,和其他Spring项目中的Template类似。ElasticsearchRestTemplate是Spring对ES的Rest API进行的封装,提供了大量相关的类来完成复杂的查询功能。

三、在Spring Boot项目中集成Elasticsearch

Spring Boot提供的spring-boot-starter-data-Elasticsearch组件为我们提供了非常便捷的数据检索功能。下面就来演示Spring Boot项目如何集成Elasticsearch。

1. 添加Elasticsearch依赖

首先在pom.xml中添加
spring-boot-starter-data-Elasticsearch组件依赖,代码如下:

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-ElasticsearchartifactId>
dependency>


2. 配置Elasticsearch

在application.properties项目配置文件中添加Elasticsearch服务器的地址,代码如下:

spring.Elasticsearch.rest.uris=http://10.2.1.231:9200

主要用来配置Elasticsearch服务地址,多个地址用逗号分隔。需要注意的是,Spring Data Elasticsearch各版本的配置属性可能不一样。本示例中使用的是7.6.2版本。


3. 创建文档对象

创建实体对象类Book,然后使用@Document注解定义文档对象,示例代码如下:

@Document( indexName = "book" , replicas = 0)public class Book {  @Id  private Long id;    @Field(analyzer = "ik_max_word",type = FieldType.Text)  private String bookName;    @Field(type = FieldType.Keyword)  private String author;    private float price;    private int page;    @Field(type = FieldType.Keyword, fielddata = true)  private String category;    // 省略get、set方法    public Book(){    }    public Book(Long id,String bookName, String author,float price,int page,String category) {      this.id = id;    this.bookName = bookName;    this.author = author;    this.price = price;    this.page = page;    this.category = category;  }    @Override  public String toString() {      final StringBuilder sb = new StringBuilder( "{\"Book\":{" );      sb.append( "\"id\":" ).append( id );      sb.append( ",\"bookName\":\"" ).append( bookName ).append( '\"' );      sb.append( ",\"page\":\"" ).append( page ).append( '\"' );      sb.append( ",\"price\":\"" ).append( price ).append( '\"' );      sb.append( ",\"category\":\"" ).append( category ).append( '\"' );      sb.append( ",\"author\":\"" ).append( author ).append( '\"' );      sb.append( "}}" );          return sb.toString();    }
}

如上面的示例所示,通过@Document注解将数据实体对象与Elasticsearch中的文档和属性一一对应。

(1)@Document注解会对实体中的所有属性建立索引:

  • indexName = "customer":表示创建一个名为customer的索引。

  • type="customer":表示在索引中创建一个名为customer的类别,而在Elasticsearch 7.x版本中取消了类别的概念。

  • shards = 1:表示只使用一个分片,默认为5。

  • replicas = 0:表示副本数量,默认为1,0表示不使用副本。

  • refreshInterval = "-1":表示禁止索引刷新。

(2)@Id作用在成员变量,标记一个字段作为id主键。

(3)@Field作用在成员变量,标记为文档的字段,并指定字段映射属性:

  • type:字段类型,取值是枚举:FieldType。

  • index:是否索引,布尔类型,默认是true。

  • store:是否存储,布尔类型,默认是false。

  • analyzer:分词器名称是ik_max_word。


4. 创建操作的Repository

创建CustomerRepository接口并继承ElasticsearchRepository,新增两个简单的自定义查询方法。示例代码如下:

public interface BookRepository extends ElasticsearchRepository<Book, Integer>{    List findByBookNameLike(String bookName);}

通过上面的示例代码,我们发现其使用方式和JPA的语法是一样的。


5. 验证测试

首先创建BookRepositoryTest单元测试类,在类中注入BookRepository,最后添加一个数据插入测试方法。

@Testpublic void testSave() {  Book book = new Book();  book.setId(1);  book.setBookName("西游记");  book.setAuthor("吴承恩");  repository.save(book);  Book newbook=repository.findById(1).orElse(null);  System.out.println(newbook);}

单击Run Test或在方法上右击,选择Run 'testSave',运行单元测试方法,查看索引数据是否插入成功,运行结果如下图所示:

输出结果表明:索引数据保存成功,并且通过id能查询到保存的索引数据信息,说明在Spring Boot中成功集成Elasticsearch。



浏览 48
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报