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

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 前面介绍了Elasticsearch的特点和优势,接下来在Spring Boot项目中使用Elasticsearch一步一步地实现搜索引擎的功能。

前面介绍了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的方式,如下图所示:

image.png

我们看到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.boot</groupId>
<artifactId>spring-boot-starter-data-Elasticsearch</artifactId>
</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<Book> findByBookNameLike(String bookName);
}

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


5. 验证测试

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

@Test
public 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',运行单元测试方法,查看索引数据是否插入成功,运行结果如下图所示:

image.png

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


最后

以上,介绍了Spring Boot项目中使用Elasticsearch,一步一步地实现搜索引擎的功能。



相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
存储 JSON Java
960 0
|
12月前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
882 3
|
安全 Java Linux
Linux安装Elasticsearch详细教程
Linux安装Elasticsearch详细教程
2358 64
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
775 0
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
1058 0
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
718 0
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
1835 0
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
3625 45
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
3269 17
Spring Boot 两种部署到服务器的方式