在本教程中,我们将通过实际操作和实用的方式,探索使用 Spring Boot 进行 Elasticsearch 的基础知识。我们将学习如何使用 Spring Data Elasticsearch 模块创建索引、进行 CRUD 操作、搜索和查询 Elasticsearch 文档。我们还将看看如何在我们的 Spring 应用程序中记录 Elasticsearch 的请求和响应数据。
1. 介绍
Elasticsearch 是一个强大且广泛使用的开源搜索和分析引擎,基于 Lucene。它设计用于快速和近实时地存储、搜索和分析大量数据。
以下是 Elasticsearch 的一些关键功能:
-
全文搜索: Elasticsearch 在全文搜索方面表现出色。它能够高效地索引和搜索大量非结构化或半结构化文本数据。
-
JSON 文档: Elasticsearch 中的数据以 JSON 文档的形式存储。每个文档存储在一个索引中,概念上类似于关系型数据库中的表。这使得 Elasticsearch 是无模式的,可以在没有预定义结构的情况下索引和搜索数据。
-
查询: Elasticsearch 提供了丰富而灵活的查询语言,使我们能够执行从简单到复杂的搜索。我们可以使用各种查询类型(如术语查询、匹配查询、范围查询等)来过滤、聚合和排序数据。
-
分析器和分词器: Elasticsearch 包含强大的文本分析功能,如分析器和分词器,可以将文本分解为令牌以实现高效的搜索和索引。它支持多种语言和自定义分析器。
2. Elasticsearch 环境搭建
3. 创建项目和配置elasticsearch
3.1. Maven
添加spring-boot-starter-data-elasticsearch
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
3.2. Elasticsearch ClientConfiguration
Spring Data Elasticsearch 依赖于一个 Elasticsearch 客户端(由 Elasticsearch 客户端库提供),该客户端可以连接到单个 Elasticsearch 节点或集群。
Elasticsearch 客户端配置.
@Configuration
public class ImperativeElasticsearchConfig extends ElasticsearchConfiguration {
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder()
.connectedTo("192.168.163.13:9200")
.withBasicAuth("elastic", "123456")
.build();
}
}
在上述配置之后,我们可以将以下 bean 注入到其他 Spring 组件中:
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import org.elasticsearch.client.RestClient;
@Autowired
ElasticsearchOperations operations;
@Autowired
ElasticsearchClient elasticsearchClient;
@Autowired
RestClient restClient;
注意: 我们应该使用 ElasticsearchOperations来与 Elasticsearch 集群交互。
当我们使用repositories时,底层使用的也是ElasticsearchOperations。
4. Document 相关的注解
Spring Data Elasticsearch 支持使用 Java 类作为可以映射到 Elasticsearch 文档的实体。这些类使用 @Document 注解,其字段使用 @Field 注解来映射到 Elasticsearch 字段。
在我们的演示中,我们将创建一个 Employee ,该doc具有诸如name和salary等属性,如下所示:
@Data
@Document(indexName = "employees", createIndex = true)
public class Employee {
@Id
private String employeeId;
@Field(type = FieldType.Text, name = "name")
private String name;
@Field(type = FieldType.Long, name = "salary")
private long salary;
// setters and getters
}
现在,解释这些注解:
-
@Document – 应用在类级别,表示这个类是索引的mapping。
- indexName – 存储此实体的索引名称。
- createIndex – 标志决定是否在仓库引导时创建索引。默认值为 true。
-
@Id – 应用在字段级别,标记字段作为主键。
-
@Field – 应用在字段级别,定义字段的属性,如名称、类型、格式等。
5. Spring Data Elasticsearch APIs 分类说明
Spring Data Elasticsearch 提供了方便的抽象和模板,用于与 Elasticsearch 进行交互。它提供了高级抽象和数据访问方法,使我们无需直接处理底层 API。
-
ElasticsearchOperations (推荐)
包含常见的辅助函数,其他方法已经被 移动到ElasticsearchOperations扩展的不同接口中。这些接口现在反映了 Elasticsearch 的 REST API 结构。
- DocumentOperations 包含与保存或删除相关的函数。
- SearchOperations 包含在 Elasticsearch 中进行搜索的函数。
- IndexOperations 定义了在索引上操作的函数,如索引创建或映射创建。
-
ElasticsearchRepository: 是一个扩展了标准 Spring Data CrudRepository 的仓库接口。我们可以通过定义自定义方法和查询来创建自定义仓库。
-
ElasticsearchTemplate: 是一个高级 API,提供了各种与 Elasticsearch 交互的方法。它允许我们执行索引、查询和文档操作。
在后续部分,我们将深入探讨如何使用这些 API 的详细内容。
6. 使用 ElasticsearchOperations
完成必要的客户端配置后,我们可以将 ElasticsearchOperations bean 自动装配到服务类中,并使用其方法执行 CRUD 操作。
@Autowired private ElasticsearchOperations elasticsearchOperations;
5.1. 对doc的增删改查
我们可以使用传统的 save()、get() 或 delete() 方法来执行针对 Elasticsearch 文档的操作。
- save() 操作具有 保存或更新语义。
- get() 方法从 Elasticsearch 索引中检索文档。要检索所需的文档,必须提供主键。
- delete() 方法允许从索引中删除文档。
Employee employee = new Employee(