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
相关推荐
蓝斯4976 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常6 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥7 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-7 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
前端工作日常7 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅7 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
犀利豆7 小时前
Claude Code Tools 研究系列(三)ExitPlanMode
人工智能·后端
星栈8 小时前
oh-my-pi工程级AI编码工使用体验
人工智能·后端·agent
xcLeigh8 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang
AI大模型-小华8 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro