前言
欢迎阅读本文,本文将介绍如何在Spring Boot应用程序中整合Elasticsearch。随着信息量的不断增加,对数据的高效管理和检索变得尤为重要。Elasticsearch作为一个强大的开源搜索和分析引擎,为我们提供了一个灵活且高效的解决方案。
在本文中,我们将深入探讨如何在Spring Boot项目中集成Elasticsearch,包括配置Elasticsearch连接、索引的创建和搜索功能的实现。无论您是正在寻找一种新的数据存储和检索解决方案,还是想要了解如何将Elasticsearch与您的Spring Boot应用程序集成,本文都将为您提供宝贵的知识和技巧。
一、为什么要使用SpringBoot整合Elasticsearch?
使用Spring Boot整合Elasticsearch有以下几个重要原因:
-
强大的搜索和分析功能:Elasticsearch是一个强大的开源搜索和分析引擎,具有快速、可扩展和高效的搜索功能。它支持全文搜索、模糊搜索、聚合和过滤等多种查询操作,可以帮助我们轻松实现复杂的搜索需求。此外,Elasticsearch还提供了丰富的分析功能,可以对数据进行聚合、统计和可视化,帮助我们深入理解数据。
-
高性能和可伸缩性:Elasticsearch是基于分布式架构的,可以轻松地水平扩展以处理大规模数据和高并发请求。它使用倒排索引和分片技术来优化搜索性能,并通过自动化和智能的负载均衡来提高系统的可伸缩性。这使得Elasticsearch成为处理大量数据和高并发场景下的首选解决方案。
-
简化的开发和集成:Spring Boot是一个快速构建Java应用程序的框架,它提供了许多开箱即用的功能和约定,使得开发更加简单和高效。通过使用Spring Boot整合Elasticsearch,我们可以利用Spring Data Elasticsearch模块提供的简单而强大的API,以及自动化的配置和集成,快速地构建出具有搜索和分析能力的应用程序。
-
生态系统支持:Spring Boot和Elasticsearch都是非常流行和广泛采用的技术,在开发过程中可以获得丰富的社区支持和资源。无论是官方文档、教程、示例代码还是第三方库,都可以帮助我们更好地理解和使用这些技术。
综上所述,使用Spring Boot整合Elasticsearch可以让我们轻松地利用强大的搜索和分析功能,提高性能和可伸缩性,并享受简化的开发和集成过程。这使得它成为构建现代应用程序的理想选择。
二、前期准备
1、新建项目,结构如下
2、导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>edu.nf.ch09.Ch09Application</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
这是一个基本的Maven配置文件示例,用于使用Spring Boot整合Elasticsearch。
在
<dependencies>
中,你需要添加以下依赖项:
spring-boot-starter-data-elasticsearch
:这是Spring Boot提供的用于集成Elasticsearch的starter依赖。lombok
:这是一个用于简化Java代码的工具库,在使用实体类时可以减少冗余代码。spring-boot-starter-test
:这是Spring Boot提供的用于单元测试的starter依赖。在
<dependencyManagement>
中,你需要添加spring-boot-dependencies
的依赖项,它用于管理Spring Boot相关的依赖版本。在
<build>
中,你需要配置Maven插件来编译和打包项目。其中包括:
maven-compiler-plugin
:这个插件用于配置Java编译器的版本、编码方式等。spring-boot-maven-plugin
:这个插件用于将项目打包为可执行的JAR文件,并指定主类。<skip>true</skip>
意味着在执行mvn package
命令时跳过运行Spring Boot应用程序。请注意,
${spring-boot.version}
是一个变量,你需要在<dependencies>
和<plugins>
中定义它的值。
三、配置yml
spring:
elasticsearch:
# 指定连接的主机地址接口
uris: http://127.0.0.1:9200
# 连接超时时间
connection-timeout: 2s
# 账号密码
# username: xxx
# password: xxx
Spring Boot的配置文件中配置了Elasticsearch的连接信息
四、新建一个Elasticsearch实体类
@Document(indexName = "users",createIndex = false)
@Mapping
@Data
public class User {
@Id
private String id;
@Field(type = FieldType.Keyword)
private String name;
@Field(type = FieldType.Integer)
private Integer age;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String birthplace;
}
@Document
注解指定了与该类映射的Elasticsearch索引的名称为users
,createIndex
属性设置为false
表示在初始化时不创建该索引。@Mapping
注解用于指示Spring Data Elasticsearch在映射该实体类到Elasticsearch索引时要应用的自定义映射规则,这里没有具体指定。@Data
注解是Lombok库提供的,用于自动生成Java Bean的常规方法(如getter
、setter
、toString
等)。另外,还使用了一些字段注解来对实体类的各个属性进行描述:
@Id
注解标记了id
字段作为Elasticsearch文档的唯一标识符。@Field
注解用于指定该属性在Elasticsearch索引中的字段类型和其他属性。例如,name
字段被标记为FieldType.Keyword
类型,age
字段被标记为FieldType.Integer
类型,birthplace
字段被标记为FieldType.Text
类型,并且使用ik_max_word
分词器进行分词。
五、 测试
1、创建 index
@Autowired
private ElasticsearchRestTemplate template;
/**
* 创建索引
*/
@Test
void testCreateIndex() {
// 如果不存在则创建索引
if (!template.indexOps(User.class).exists()){
template.indexOps(User.class).create();
log.info("成功");
}else {
log.info("失败");
}
}
是一个使用 Spring Data Elasticsearch 操作 Elasticsearch 的示例代码。@Autowired 注解用于注入一个 ElasticsearchRestTemplate 的实例,它是 Spring Data Elasticsearch 提供的 Elasticsearch 模板类,可以用于执行 Elasticsearch 操作。
在这个示例代码中,testCreateIndex() 方法用于创建一个索引。如果 User 类所对应的索引不存在,则使用 ElasticsearchRestTemplate 创建一个新的索引;否则输出“失败”并不执行任何操作。其中,template.indexOps(User.class) 用于获取 User 类所对应的 IndexOperations 对象,它提供了创建、删除、查询索引等操作的方法。
1)运行结果:
2)使用 Postman 查看索引
2、删除index
/**
* 删除索引
*/
@Test
void testCreateDelete() {
// 如果存在则删除索引
if (template.indexOps(User.class).exists()){
template.indexOps(User.class).delete();
log.info("成功");
}else{
log.info("失败");
}
}
该方法通过template.indexOps(User.class)
获取到与User
类映射的Elasticsearch索引操作对象,然后调用exists()
方法检查该索引是否存在。如果该索引存在,则调用delete()
方法删除该索引,并打印日志信息“成功”;否则打印日志信息“失败”。
1)运行结果
2)使用 Postman 查看索引
当删除索引后就不能够查到这个索引了,证明我们的代码是没有写错的。
3、为 index 创建 mapping
/**
* 创建Mapping
*/
@Test
void testCreateMapping(){
Document mapping = template.indexOps(User.class).createMapping();
template.indexOps(User.class).putMapping(mapping);
}
该方法通过
template.indexOps(User.class)
获取到与User
类映射的Elasticsearch索引操作对象,然后调用createMapping()
方法创建该类的Mapping,并将结果保存在mapping
变量中。接着,调用putMapping(mapping)
方法将Mapping应用到索引中。Mapping是Elasticsearch中描述文档结构的定义,包括字段类型、分词器等信息。通过创建Mapping,可以明确指定每个字段的数据类型、分析器等属性,以便更好地支持搜索和分析操作。
1)运行结果
2)使用 Postman 查看mapping
4、创建文档
/**
* 创建文档
*/
@Test
void testCreateDoc(){
User user = new User();
user.setId("1");
user.setName("qiu");
user.setAge(22);
user.setBirthplace("珠海市香洲区北园新村二期");
IndexCoordinates indexCoordinates = IndexCoordinates.of("users");
template.save(user,indexCoordinates);
}
该方法首先创建了一个
User
对象,并设置了对象的各个属性值。然后,通过IndexCoordinates.of("users")
创建了一个表示索引的IndexCoordinates
对象,指定了要保存文档的索引名称为"users"。最后,调用template.save(user, indexCoordinates)
方法将该User
对象保存到指定的索引中。这样就成功地创建了一个名为"users"的索引,并在该索引中保存了一个名为"1"的文档,该文档包含了用户的各个属性信息。
1)运行结果
2)使用 Postman 查看文档
5、 根据 id 查询文档信息
/**
* 根据 id 搜索
*/
@Test
void testSearchUserById(){
User user = template.get("1", User.class);
log.info(user.toString());
}
该方法通过
template.get("1", User.class)
根据文档的ID来搜索Elasticsearch中的文档,并将结果保存在user
对象中。随后,通过日志输出打印了用户信息。这样就成功地根据ID在Elasticsearch中进行了文档的搜索,并获取到了相应的文档数据。
1)运行结果
2)使用 Postman 根据 ID 查看文档
六、使用 SpringBoot 整合 Elasticsearch 的好多?
Spring Boot提供了很好的支持来简化与Elasticsearch的整合。它提供了Spring Data Elasticsearch模块,使得与Elasticsearch的交互更加方便和高效。下面是一些使用Spring Boot整合Elasticsearch的好处:
-
简化配置:Spring Boot通过自动配置大大简化了与Elasticsearch的连接和设置过程。只需在配置文件中指定相关属性,Spring Boot会自动为你创建Elasticsearch客户端。
-
提供注解驱动的开发:Spring Data Elasticsearch模块通过注解驱动的方式,让你可以使用类似于JPA的注解来标记实体类,无需编写复杂的查询语句,就可以进行CRUD操作。
-
集成查询DSL:Spring Data Elasticsearch提供了强大的查询DSL(Domain Specific Language),可以轻松地构建复杂的查询语句,支持全文搜索、范围查询、聚合查询等功能。
-
支持事务管理:Spring Boot整合了Spring的事务管理机制,可以确保在与Elasticsearch的交互中保持数据的一致性和完整性。
-
提供监控和健康检查:Spring Boot集成了Actuator模块,可以方便地对Elasticsearch进行监控和健康检查,包括对索引、节点、查询性能等方面的监控。
总之,Spring Boot提供了一套简化、高效的方式来整合Elasticsearch,使得与Elasticsearch的交互变得更加便捷和灵活。这使得开发人员能够更专注于业务逻辑而不必花费过多精力在与Elasticsearch的集成上。