news 2026/4/29 4:43:30

Elasticsearch集成实战:Spring Data Elasticsearch从入门到精通,彻底简化开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Elasticsearch集成实战:Spring Data Elasticsearch从入门到精通,彻底简化开发

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 集成架构流程图

业务代码

自定义Repository接口

Spring Data Elasticsearch 自动实现

RestHighLevelClient 底层调用

Elasticsearch 集群

结果自动封装返回

1.3 核心优势

  1. 零底层代码:无需操作原生客户端
  2. ORM 映射:实体类直接映射 ES 索引
  3. Repository 模式:继承接口即可拥有 CRUD
  4. 支持 DSL 方法名:按规则写方法名自动生成查询
  5. 无缝整合 SpringBoot:自动配置、开箱即用

二、版本对应关系(重中之重)

Spring Data Elasticsearch必须严格与 ES 版本对应,否则启动报错!

Spring Data ESSpring BootElasticsearch
4.4.x2.7.x7.17.0
4.3.x2.6.x7.15.0
4.1.x2.4.x7.9.0
4.0.x2.3.x7.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:10s

3.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;}

八、完整开发流程图

渲染错误:Mermaid 渲染失败: Parse error on line 3: ...--> B[配置ES连接]B --> C[编写实体类+@Document注解] ----------------------^ Expecting 'AMP', 'COLON', 'PIPE', 'TESTSTR', 'DOWN', 'DEFAULT', 'NUM', 'COMMA', 'NODE_STRING', 'BRKT', 'MINUS', 'MULT', 'UNICODE_TEXT', got 'LINK_ID'

九、最佳实践与避坑指南

  1. 版本必须严格对应,否则启动失败
  2. 索引名必须全小写
  3. 文本分词用ik_max_word,精准查询用keyword
  4. 大数据量必须使用分页查询
  5. 复杂查询优先使用ElasticsearchRestTemplate
  6. 禁止频繁创建索引,createIndex上线设为 false

十、总结

Spring Data Elasticsearch 是 SpringBoot 集成 ES最简单、最优雅、企业级首选方案

  1. 简化 90% 代码:无需操作 RestHighLevelClient
  2. ORM 映射:实体类 = ES 索引结构
  3. Repository 模式:继承即拥有全部 CRUD
  4. 方法名 DSL:零代码实现复杂查询
  5. 模板增强:支持高亮、聚合、bool 等高级功能

按照本文步骤,你可以在5 分钟内完成 ES 集成,快速实现搜索业务。



🌺The End🌺点点关注,收藏不迷路🌺
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 4:43:28

RevokeMsgPatcher源码架构深度解析:C桌面应用的模块化设计实践

RevokeMsgPatcher源码架构深度解析&#xff1a;C#桌面应用的模块化设计实践 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://g…

作者头像 李华
网站建设 2026/4/29 4:38:26

机器学习ROADM光网络故障定位策略【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;查看文章底部二维码&#xff08;1&#xff09;级联神经网络与回溯修正模块的故障定位算法&#x…

作者头像 李华
网站建设 2026/4/29 4:30:20

uTLS Roller自动轮换:实现持续有效的指纹抵抗

uTLS Roller自动轮换&#xff1a;实现持续有效的指纹抵抗 【免费下载链接】utls Fork of the Go standard TLS library, providing low-level access to the ClientHello for mimicry purposes. 项目地址: https://gitcode.com/gh_mirrors/ut/utls uTLS是Go标准TLS库的…

作者头像 李华
网站建设 2026/4/29 4:29:22

测试Leader成长记:从技术骨干到团队管理者的蜕变

在软件质量保障的领域里&#xff0c;一位卓越的测试工程师与一位优秀的测试团队领导者&#xff0c;看似身处同一维度&#xff0c;实则面临着截然不同的挑战与责任体系。对于众多从技术岗位脱颖而出的测试骨干而言&#xff0c;这场“从精于事到善于人”的蜕变&#xff0c;不仅是…

作者头像 李华
网站建设 2026/4/29 4:27:53

CSS如何改变单个网格项目的对齐方式

不能。grid-column和grid-row仅控制项目占据的网格位置&#xff0c;对齐需用justify-self&#xff08;行内轴&#xff09;、align-self&#xff08;行外轴&#xff09;或简写place-self&#xff0c;且依赖父容器为grid上下文及尺寸关系。grid-column / grid-row 能不能直接控制…

作者头像 李华