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
相关推荐
陌殇殇1 小时前
SpringBoot整合SpringCache缓存
spring boot·redis·缓存
GISer_Jing3 小时前
Git协作开发:feature分支、拉取最新并合并
大数据·git·elasticsearch
小林学习编程4 小时前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
ladymorgana4 小时前
【Spring boot】tomcat Jetty Undertow对比,以及应用场景
spring boot·tomcat·jetty
IT_10244 小时前
Spring Boot项目开发实战销售管理系统——系统设计!
大数据·spring boot·后端
Fireworkitte5 小时前
Apache POI 详解 - Java 操作 Excel/Word/PPT
java·apache·excel
weixin-a153003083165 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
DCTANT5 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
ai小鬼头5 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
Touper.6 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端