Spring Boot 集成 Elasticsearch入门教学

一、什么是 Elasticsearch (ES)?

Elasticsearch 是一个分布式搜索引擎,用来处理大规模数据的存储、搜索和分析。它是基于 Apache Lucene 构建的,具备高效的全文搜索功能。ES 可以在海量数据中快速找到匹配的内容,并且支持复杂的查询逻辑,非常适合用于日志分析、商品搜索、数据可视化等场景。

二、Elasticsearch 常用术语解释

  1. Index(索引):索引是 Elasticsearch 中数据存储的基本单位,相当于关系型数据库中的"表"。一个索引包含了多个 Document(文档),每个文档都有自己的字段和内容。

  2. Document(文档):文档是 ES 中存储的最小数据单元,相当于关系型数据库中的"行"。一个文档就是一条数据,通常以 JSON 格式存储。

  3. Field(字段):文档中的数据是以字段存储的。字段就像是数据库中的列,比如一个文档可能有 "title", "author", "content" 这样的字段。

  4. Mapping(映射):映射定义了索引中文档结构的模式。它类似于数据库中的表结构定义,规定了文档中的字段类型,如 string、integer、date 等。

  5. Cluster(集群):一个集群由一个或多个节点组成,提供高可用性和负载均衡的能力。集群有一个唯一的名字,每个节点加入集群时都必须使用相同的集群名字。

  6. Node(节点):每个运行的 Elasticsearch 实例称为一个节点。一个节点保存了数据,并且参与了索引和查询的处理过程。多个节点可以组成一个集群。

  7. Shards(分片):为了支持大规模的数据处理,ES 将数据分片存储,每个索引可以分成多个分片,并且分布在集群的多个节点上。这样,数据的读取和写入都可以并行处理。

  8. Replica(副本):每个分片都有其副本,副本提高了系统的容错能力和读取性能。当主分片不可用时,副本可以替代它提供服务。

  9. Analyzer(分析器):分析器是用于处理文本数据的组件,它包括分词器(tokenizer)和过滤器(filter)。分析器将文本分解为词条以便于索引和搜索。

三、Spring Boot 与 Elasticsearch 的集成

Spring Data Elasticsearch 是一个用于集成 Spring Boot 和 Elasticsearch 的模块,提供了一些简单的 CRUD 操作接口,以及对全文搜索和复杂查询的支持。

  1. 项目依赖
    首先,你需要在 Spring Boot 项目中添加对 Elasticsearch 的依赖。通过 Maven 可以这样添加依赖:
xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  1. 配置 Elasticsearch 连接
    Spring Boot 自动配置了 Elasticsearch 的基本配置,你可以通过 application.yml 文件来定义连接参数:
yaml 复制代码
spring:
  elasticsearch:
    uris: http://localhost:9200  # ES 服务的地址
    username: elastic             # 用户名(如有安全设置)
    password: elastic             # 密码(如有安全设置)
  1. 定义实体类
    在 Spring Data Elasticsearch 中,我们需要定义一个实体类来映射 Elasticsearch 中的文档:
java 复制代码
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

@Document(indexName = "blog")  // 指定索引名称
public class Blog {
    @Id  // 表示文档的唯一ID
    private String id;
    private String title;
    private String content;

    // 构造方法、getter、setter...
}
  1. 创建 Repository
    Spring Data 提供了 ElasticsearchRepository 接口,它提供了一些基础的增删查改方法。你可以创建一个 Repository 来管理 Blog 实体:
java 复制代码
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface BlogRepository extends ElasticsearchRepository<Blog, String> {
    // 你可以根据需要自定义一些查询方法,比如根据标题查找
    List<Blog> findByTitle(String title);
}
  1. Service 层的使用
    在 Service 层,我们可以通过注入 BlogRepository 来操作 Elasticsearch 数据库:
java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class BlogService {

    @Autowired
    private BlogRepository blogRepository;

    public void saveBlog(Blog blog) {
        blogRepository.save(blog);  // 保存数据
    }

    public List<Blog> searchByTitle(String title) {
        return blogRepository.findByTitle(title);  // 通过标题查询
    }
}
  1. 控制器层的简单实现
    在 Controller 中,可以通过 RESTful 接口来调用 Service 的方法,实现数据的存取:
java 复制代码
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/blogs")
public class BlogController {

    @Autowired
    private BlogService blogService;

    @PostMapping
    public String saveBlog(@RequestBody Blog blog) {
        blogService.saveBlog(blog);
        return "Blog saved!";
    }

    @GetMapping("/search")
    public List<Blog> searchBlogs(@RequestParam String title) {
        return blogService.searchByTitle(title);
    }
}

四、基本 CRUD 操作

创建文档:使用 blogRepository.save(blog) 来保存或更新文档;

查询文档:使用 blogRepository.findById(id) 来通过文档 ID 查询;

删除文档:使用 blogRepository.deleteById(id) 来删除指定文档;

全文搜索:使用 blogRepository.findByTitle(title) 来按字段查询文档。

五、进阶功能

分页查询:Spring Data Elasticsearch 还支持分页查询,使用 Pageable 对象进行分页。

复杂查询:可以使用 @Query 注解或自定义查询 DSL 来实现更复杂的搜索需求。

分词器和分析器:你可以自定义分词器以支持中文等复杂语言的全文检索。

六、注意事项

版本兼容性:Spring Data Elasticsearch 和 Elasticsearch 的版本需要兼容,不同版本之间的兼容性可能不同。

性能优化:分片与副本的合理设置、索引的优化、查询的缓存等可以提升 ES 的性能。

集群部署:在生产环境中,ES 一般会部署成集群,确保高可用和数据安全。

通过这个入门教程,你应该已经对 Spring Boot 与 Elasticsearch 的集成有了初步的了解。接下来,可以通过实际操作、扩展复杂查询、配置更多功能,深入学习 ES 的用法

相关推荐
Victor3561 小时前
Redis(25)Redis的RDB持久化的优点和缺点是什么?
后端
Victor3561 小时前
Redis(24)如何配置Redis的持久化?
后端
ningqw8 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
你的人类朋友8 小时前
vi编辑器命令常用操作整理(持续更新)
后端
胡gh8 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
一只叫煤球的猫9 小时前
看到同事设计的表结构我人麻了!聊聊怎么更好去设计数据库表
后端·mysql·面试
uzong9 小时前
技术人如何对客做好沟通(上篇)
后端
颜如玉10 小时前
Redis scan高位进位加法机制浅析
redis·后端·开源
Moment10 小时前
毕业一年了,分享一下我的四个开源项目!😊😊😊
前端·后端·开源
why技术11 小时前
在我眼里,这就是天才般的算法!
后端·面试