Elasticsearch集成实战:Spring Data Elasticsearch从入门到精通,彻底简化开发
- 前言
- 一、Spring Data Elasticsearch 是什么?
- 1.1 核心定义
- 1.2 集成架构流程图
- 1.3 核心优势
- 二、版本对应关系(重中之重)
- 三、快速集成:三步搭建环境
- 3.1 引入 Maven 依赖
- 3.2 配置 application.yml
- 3.3 启动类开启注解
- 四、核心注解:实体类映射 ES 索引
- 4.1 常用注解一览
- 4.2 实体类编写(商品示例)
- 五、核心功能:Repository 接口开发
- 5.1 基础 Repository 接口
- 5.2 基础 CRUD 实战
- 六、高级查询:方法名 DSL(零代码查询)
- 6.1 语法规则
- 6.2 常用查询示例
- 七、复杂查询:NativeSearchQuery 构建
- 7.1 高亮查询实战
- 八、完整开发流程图
- 九、最佳实践与避坑指南
- 十、总结
🌺The Begin🌺点点关注,收藏不迷路🌺 |
前言
在 SpringBoot 项目中直接使用RestHighLevelClient操作 Elasticsearch,需要手动构建请求、解析响应、封装结果,代码冗余且开发效率极低。
Spring Data Elasticsearch(简称 SDE)是 Spring 官方提供的 ES 集成框架,屏蔽了底层客户端细节,只需编写简单接口,就能实现 ES 的增删改查、分页、排序、聚合、高亮等所有操作,开发效率提升 10 倍以上。
本文将从环境搭建 → 核心注解 → 接口编写 → 高级查询 → 实战案例全流程讲解,带你用最简单的方式完成 SpringBoot 与 ES 集成。
一、Spring Data Elasticsearch 是什么?
1.1 核心定义
- Spring Data 家族的子模块,专门用于简化 Elasticsearch 开发
- 基于RestHighLevelClient封装,底层自动管理连接池
- 提供Repository模式,无需编写实现类,只需定义接口
1.2 集成架构流程图
1.3 核心优势
- 零底层代码:无需操作原生客户端
- ORM 映射:实体类直接映射 ES 索引
- Repository 模式:继承接口即可拥有 CRUD
- 支持 DSL 方法名:按规则写方法名自动生成查询
- 无缝整合 SpringBoot:自动配置、开箱即用
二、版本对应关系(重中之重)
Spring Data Elasticsearch必须严格与 ES 版本对应,否则启动报错!
| Spring Data ES | Spring Boot | Elasticsearch |
|---|---|---|
| 4.4.x | 2.7.x | 7.17.0 |
| 4.3.x | 2.6.x | 7.15.0 |
| 4.1.x | 2.4.x | 7.9.0 |
| 4.0.x | 2.3.x | 7.6.0 |
本文环境:
- Spring Boot:2.7.0
- Spring Data Elasticsearch:4.4.0
- Elasticsearch:7.17.0
三、快速集成:三步搭建环境
3.1 引入 Maven 依赖
<!-- Spring Data Elasticsearch 核心依赖 --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>4.4.0</version></dependency>3.2 配置 application.yml
spring:elasticsearch:rest:uris:http://127.0.0.1:9200# ES地址username:elastic# 无密码可删除password:123456connection-timeout:3sread-timeout:10s3.3 启动类开启注解
@SpringBootApplication// 开启 Elasticsearch 仓库支持@EnableElasticsearchRepositories(basePackages="com.es.repository")publicclassEsApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EsApplication.class,args);}}四、核心注解:实体类映射 ES 索引
4.1 常用注解一览
| 注解 | 作用 |
|---|---|
@Document | 标记为 ES 文档,指定索引名 |
@Id | 标记文档 ID |
@Field | 标记字段,指定类型、分词器 |
@MultiField | 多类型字段 |
4.2 实体类编写(商品示例)
importorg.springframework.data.annotation.Id;importorg.springframework.data.elasticsearch.annotations.*;importjava.math.BigDecimal;// indexName = 索引名(必须小写)@Document(indexName="product_index",createIndex=true)publicclassProduct{@Id// 文档唯一IDprivateLongid;// 标题:text类型,ik分词,支持keyword精准查询@Field(type=FieldType.Text,analyzer="ik_max_word",searchAnalyzer="ik_smart")privateStringtitle;// 分类:keyword,不分词@Field(type=FieldType.Keyword)privateStringcategory;// 价格:浮点类型@Field(type=FieldType.Double)privateBigDecimalprice;// 库存:整数@Field(type=FieldType.Integer)privateIntegerstock;}五、核心功能:Repository 接口开发
5.1 基础 Repository 接口
只需继承,无需编写实现类,自动拥有 CRUD 功能:
importorg.springframework.data.elasticsearch.repository.ElasticsearchRepository;importorg.springframework.stereotype.Repository;@RepositorypublicinterfaceProductRepositoryextendsElasticsearchRepository<Product,Long>{// 自动拥有:增删改查、分页、排序、count 等方法}5.2 基础 CRUD 实战
@ServicepublicclassProductService{@AutowiredprivateProductRepositoryrepository;// 1. 新增/修改文档publicProductsave(Productproduct){returnrepository.save(product);}// 2. 根据ID查询publicProductgetById(Longid){returnrepository.findById(id).orElse(null);}// 3. 查询全部publicIterable<Product>findAll(){returnrepository.findAll();}// 4. 分页查询publicPage<Product>findByPage(Pageablepage){returnrepository.findAll(page);}// 5. 删除文档publicvoiddelete(Longid){repository.deleteById(id);}}六、高级查询:方法名 DSL(零代码查询)
6.1 语法规则
Repository 中按规则写方法名,自动生成 ES 查询:
findBy + 字段名 + 条件(And/Or/Between/Like 等)6.2 常用查询示例
@RepositorypublicinterfaceProductRepositoryextendsElasticsearchRepository<Product,Long>{// 1. 根据标题分词查询List<Product>findByTitle(Stringtitle);// 2. 标题包含 + 分类精准匹配List<Product>findByTitleAndCategory(Stringtitle,Stringcategory);// 3. 价格区间查询List<Product>findByPriceBetween(BigDecimalmin,BigDecimalmax);// 4. 库存大于List<Product>findByStockGreaterThan(Integerstock);// 5. 分页 + 排序Page<Product>findByCategory(Stringcategory,Pageablepage);}七、复杂查询:NativeSearchQuery 构建
复杂场景(高亮、聚合、bool 查询)使用NativeSearchQuery:
7.1 高亮查询实战
@AutowiredprivateElasticsearchRestTemplatetemplate;publicList<Product>searchHighLight(Stringkeyword){// 构建查询NativeSearchQueryquery=newNativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("title",keyword))// 高亮配置.withHighlightFields(newHighlightBuilder.Field("title").preTags("<span style='color:red'>").postTags("</span>")).build();// 执行查询并处理高亮SearchHits<Product>hits=template.search(query,Product.class);List<Product>result=newArrayList<>();for(SearchHit<Product>hit:hits){Productproduct=hit.getContent();// 设置高亮标题product.setTitle(hit.getHighlightFields().get("title").get(0));result.add(product);}returnresult;}八、完整开发流程图
九、最佳实践与避坑指南
- 版本必须严格对应,否则启动失败
- 索引名必须全小写
- 文本分词用
ik_max_word,精准查询用keyword - 大数据量必须使用分页查询
- 复杂查询优先使用
ElasticsearchRestTemplate - 禁止频繁创建索引,
createIndex上线设为 false
十、总结
Spring Data Elasticsearch 是 SpringBoot 集成 ES最简单、最优雅、企业级首选方案:
- 简化 90% 代码:无需操作 RestHighLevelClient
- ORM 映射:实体类 = ES 索引结构
- Repository 模式:继承即拥有全部 CRUD
- 方法名 DSL:零代码实现复杂查询
- 模板增强:支持高亮、聚合、bool 等高级功能
按照本文步骤,你可以在5 分钟内完成 ES 集成,快速实现搜索业务。
🌺The End🌺点点关注,收藏不迷路🌺 |