3、 Elasticsearch 集成
3.1 Elasticsearch 概述
3.1.1 Elasticsearch 的核心概念
Elasticsearch 是一个开源的分布式搜索引擎,主要用于实时数据检索和分析。它的核心功能包括全文检索、结构化查询和分析大规模数据。
- 分布式搜索引擎:
- Elasticsearch 将数据分布存储在多个节点上,支持水平扩展和高可用性。
- 支持实时数据获取和高性能的复杂查询。
- 倒排索引:
- 倒排索引是一种数据结构,用于快速定位满足特定查询条件的文档。
- 通过倒排索引,Elasticsearch 能够高效地支持全文检索和结构化查询。
- 核心概念:
- 索引(Index):类似于数据库中的数据库,是存储文档的地方。
- 文档(Document):以 JSON 格式存储的数据单元,每个文档都有唯一的 ID。
- 字段(Field):文档中的键值对,表示具体的数据内容。
- 映射(Mapping):定义字段的数据类型和索引方式,是索引的结构蓝图。
3.1.2 Elasticsearch 的安装与简单使用
-
安装 Elasticsearch:
-
下载:从 Elasticsearch 官方网站 下载适合的版本。
-
安装:
-
Windows:解压下载的压缩包,运行
bin\elasticsearch.bat
启动服务。 -
Linux:解压压缩包,运行
bin/elasticsearch
启动服务。 -
macOS:使用 Homebrew 安装:
brew install elasticsearch
-
-
验证安装:
- 打开浏览器,访问
http://localhost:9200
,应该显示 Elasticsearch 的集群信息。
- 打开浏览器,访问
-
-
安装 Kibana(可选):
-
下载并解压 Kibana。
-
启动 Kibana:
./bin/kibana
-
访问
http://localhost:5601
,即可通过 Kibana 进行可视化的数据管理和查询。
-
-
简单使用:
# 创建一个索引 curl -X PUT "http://localhost:9200/myindex" # 插入一条文档 curl -X POST "http://localhost:9200/myindex/_doc/1" -H "Content-Type: application/json" -d '{"name":"John","age":30}' # 查询文档 curl -X GET "http://localhost:9200/myindex/_doc/1"
3.2 Spring Boot 与 Elasticsearch 集成
3.2.1 项目结构与依赖配置
为了在 Spring Boot 项目中集成 Elasticsearch,需要在项目中添加相关依赖,并配置项目结构。
-
Maven 依赖:
在pom.xml
中添加以下依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </dependency>
-
Gradle 依赖:
在build.gradle
中添加:dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch' implementation 'org.elasticsearch:elasticsearch' }
-
项目结构:
src/main/java
:存放 Java 源文件。src/main/resources
:存放配置文件,如application.properties
。src/test
:存放测试文件。
3.2.2 使用 Spring Data Elasticsearch 实现 CRUD 和搜索功能
Spring Data Elasticsearch 提供了类似于 Spring Data JPA 的 Repository 接口,方便实现 CRUD 和搜索功能。
-
创建文档模型:
定义一个 Java 类,使用@Document
注解指定索引名称和文档类型。@Document(indexName = "users", type = "_doc") public class User { @Id private String id; @Field(type = FieldType.Text) private String name; @Field(type = FieldType.Integer) private int age; // Getter 和 Setter 方法 }
-
创建 Elasticsearch Repository 接口:
定义一个 Repository 接口,继承自ElasticsearchRepository
。public interface UserRepository extends ElasticsearchRepository<User, String> { }
-
实现 CRUD 操作:
使用@Service
注解定义一个服务类,实现 CRUD 功能。@Service public class UserService { @Autowired private UserRepository userRepository; public void create(User user) { userRepository.save(user); } public List<User> read() { return userRepository.findAll(); } public void update(User user) { userRepository.save(user); } public void delete(String id) { userRepository.deleteById(id); } }
-
实现搜索功能:
使用QueryBuilders
构建查询,实现搜索功能。public List<User> searchByName(String name) { QueryBuilder query = QueryBuilders.matchQuery(