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
相关推荐
葫芦和十三3 小时前
图解 MongoDB 05|文档模型设计:内嵌 vs 引用,反范式不是免费午餐
后端·mongodb·agent
不能放弃治疗7 小时前
单 Agent 实现模式
后端
IT_陈寒9 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
小bo波9 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
fliter9 小时前
最后一块拼图:用 bitvec 构造 IPv4 包,真正做出自己的 Ping
后端
用户35218024547510 小时前
🎆从 Prompt 到 Skill:让 Spring AI Agent 学会"装新技能"
人工智能·spring boot·ai编程
fliter11 小时前
用 Rust 解析并生成 ICMP 包:checksum、nom 与 cookie-factory
后端
蝎子莱莱爱打怪11 小时前
XZLL-IM干货系列 03|消息 ID 设计:一个 UUID 搞不定的事,我用两个 ID 解决了
后端·面试·开源
fliter11 小时前
从 panic 到 Result:用 Rust 重新整理一个 ping 项目的错误处理
后端
森蓝情丶11 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端