Spring Boot整合Elasticsearch

摘要:本文手把手教你如何在Spring Boot项目中整合Elasticsearch(ES),并实现基本的CRUD与搜索操作。包含版本选择、配置、代码示例及常见问题解决。


一、环境准备

1.1 软件版本

  • Spring Boot: 3.x
  • Elasticsearch: 8.x(推荐8.9+)
  • JDK: 17+

二、配置Elasticsearch连接

2.1 配置文件

application.yml中添加:

yaml 复制代码
spring:
  elasticsearch:
    uris: http://localhost:9200 # ES地址
    username: elastic # 若开启安全认证
    password: your_password

2.2 解决版本兼容问题

Spring Boot 3.x默认支持ES 8.x,无需额外配置。

⚠️ 若版本不匹配,可添加依赖:

xml 复制代码
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>8.9.0</version>
</dependency>

三、核心代码实现

3.1 创建实体类

java 复制代码
@Data
@Document(indexName = "article")
public class Article {
    @Id
    private String id;
    
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title;
    
    @Field(type = FieldType.Keyword)
    private String author;
    
    @Field(type = FieldType.Integer)
    private Integer views;
}
  • @Document: 指定索引名称
  • @Field: 定义字段类型(Text支持分词,Keyword精确匹配)

3.2 创建Repository接口

java 复制代码
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
    
    // 自定义方法:根据标题搜索
    List<Article> findByTitle(String title);
    
    // 复杂查询示例
    @Query("{\"match\": {\"title\": \"?0\"}}")
    Page<Article> customSearch(String keyword, Pageable pageable);
}

四、基础操作示例

4.1 保存/更新数据

java 复制代码
@Autowired
private ArticleRepository repository;

public void saveArticle() {
    Article article = new Article();
    article.setTitle("SpringBoot整合ES指南");
    article.setAuthor("CSDN博主");
    article.setViews(1000);
    repository.save(article);
}

4.2 查询数据

java 复制代码
// 根据ID查询
Optional<Article> article = repository.findById("1");

// 自定义方法查询
List<Article> list = repository.findByTitle("指南");

// 分页查询
Page<Article> page = repository.customSearch("SpringBoot", PageRequest.of(0, 10));

4.3 删除数据

java 复制代码
repository.deleteById("1");
// 或删除全部
repository.deleteAll();

五、复杂查询实践

5.1 使用NativeQuery构建查询

java 复制代码
Query query = NativeQuery.builder()
        .withQuery(q -> q.match(m -> m.field("title").query("SpringBoot")))
        .withPageable(PageRequest.of(0, 5))
        .build();

SearchHits<Article> hits = elasticsearchOperations.search(query, Article.class);

5.2 组合查询(BoolQuery)

java 复制代码
Query boolQuery = NativeQuery.builder()
        .withQuery(q -> q
            .bool(b -> b
                .must(m -> m.match(m1 -> m1.field("title").query("指南")))
                .filter(f -> f.range(r -> r.field("views").gte(100)))
            )
        ).build();

六、常见问题解决

6.1 连接失败

  • 检查ES是否启动(http://localhost:9200
  • 确认spring.elasticsearch.uris配置正确

6.2 字段类型不匹配

  • 删除旧索引,让Spring Boot自动创建新映射
  • 或手动创建索引并指定mapping

6.3 中文分词失效

  1. 安装IK分词器到ES插件目录
  2. 实体类字段添加analyzer = "ik_max_word"

七、总结

本文实现了:

  • Spring Boot与ES 8.x的整合
  • 基础的CRUD操作
  • 自定义查询与分页
  • 中文分词配置

注意事项

  1. ES 8.x默认开启安全认证,测试时可暂时关闭(修改elasticsearch.yml
  2. 生产环境建议手动管理索引映射
  3. 复杂查询推荐使用ElasticsearchRestTemplate
相关推荐
Victor3562 小时前
MongoDB(112)如何使用MongoDB Charts进行数据可视化?
后端
Volunteer Technology2 小时前
Elasticsearch分布式原理
大数据·分布式·elasticsearch
小雅痞3 小时前
[Java][Leetcode middle] 167. 两数之和 II - 输入有序数组
java·算法·leetcode
CN-Dust3 小时前
【C++】输入cin例题专题
java·c++·算法
xin_nai4 小时前
LeetCode热题100(Java)(6)矩阵
java·leetcode·矩阵
代码AI弗森9 小时前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库
Java开发的小李9 小时前
SpringBoot + Redis 实现分布式 Session 共享(解决多实例登录状态丢失问题)
spring boot·redis·分布式
Old Uncle Tom10 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
小小小米粒10 小时前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
前端一小卒10 小时前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端