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
相关推荐
chenyuhao20246 小时前
MySQL索引特性
开发语言·数据库·c++·后端·mysql
oouy6 小时前
《Java泛型:给你的代码装上“快递分拣系统”,再也不会拆出一双鞋!》
后端
Python私教6 小时前
别再瞎折腾 LangChain 了:从 0 到 1 搭建 RAG 知识库的架构决策实录
后端
微学AI6 小时前
openGauss在AI时代的向量数据库应用实践与技术演进深度解析
后端
踏浪无痕6 小时前
手写Spring事务框架:200行代码揭开@Transactional的神秘面纱( 附完整源代码)
spring boot·spring·spring cloud
R***62316 小时前
Spring Boot 整合 log4j2 日志配置教程
spring boot·单元测试·log4j
雨中飘荡的记忆6 小时前
财务对账系统设计与实现
java
随风飘的云6 小时前
redis的qps从100飙升到10000的全流程解决方案
后端
0***h9426 小时前
使用 java -jar 命令启动 Spring Boot 应用时,指定特定的配置文件的几种实现方式
java·spring boot·jar
用户345848285056 小时前
java除了AtomicInteger,还有哪些常用的原子类?
后端