news 2026/2/9 20:58:44

SpringBoot 整合 Easy-Es 实战操作详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot 整合 Easy-Es 实战操作详解

Spring Boot 整合 Easy-ES 实战操作详解

Easy-ES 是一个基于 Elasticsearch 的 ORM 框架,类似于 MyBatis-Plus,但专注于简化 ES 操作。它提供了 MySQL-like 的语法,支持 Lambda 风格查询、自动映射、分页、聚合等功能,极大降低了直接使用 RestHighLevelClient 的复杂度。Easy-ES 适合需要全文搜索、复杂查询的 Spring Boot 项目,如电商搜索、日志分析等。

本教程基于 Easy-ES 最新版本(假设 2.x,实际以 GitHub 最新为准),从零搭建一个简单书籍管理系统,演示 CRUD 操作。假设你有基本的 Spring Boot 和 Elasticsearch 知识。

前提条件
  • JDK 8+(推荐 17+)
  • Spring Boot 2.7+ 或 3.x
  • Elasticsearch 7.x 或 8.x(本地或云端安装,启动后访问 http://localhost:9200 确认运行)
  • Maven 或 Gradle 作为构建工具
  • IDE 如 IntelliJ IDEA
步骤 1: 创建 Spring Boot 项目

使用 Spring Initializr 创建项目:

  • Group: com.example
  • Artifact: easy-es-demo
  • Dependencies: Spring Web, Spring Boot DevTools(后续添加 Easy-ES)

下载后导入 IDE。

步骤 2: 添加 Easy-ES 依赖

pom.xml中添加 Easy-ES Boot Starter 依赖(从官方 GitHub 获取最新版本):

<dependencies><!-- Easy-ES Boot Starter --><dependency><groupId>org.dromara</groupId><artifactId>easy-es-boot-starter</artifactId><version>2.7.1</version><!-- 替换为最新版本,从 Maven Central 或 GitHub 检查 --></dependency><!-- Lombok 可选,简化实体类 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>

更新 Maven 依赖。

步骤 3: 配置 Elasticsearch 连接

application.ymlapplication.properties中配置 ES 连接。Easy-ES 会自动配置,无需额外 Bean。

# application.ymleasy-es:address:127.0.0.1:9200# ES 地址,多个用逗号分隔username:elastic# 如果有认证password:your_passwordschema:http# 或 httpsconnect-timeout:1000# 连接超时(ms)socket-timeout:30000# 套接字超时(ms)request-timeout:30000# 请求超时(ms)connect-request-timeout:1000# 其他可选配置:enable-content-log: false(关闭内容日志)、enable-global-select: true 等# Spring Boot 日志级别(可选,调试用)logging:level:org.dromara.easyes:debug

最佳实践

  • 生产环境使用 HTTPS 和认证。
  • 如果 ES 集群,配置多个 address。
  • 监控日志级别,调试时设为 debug,便于查看生成的 ES DSL 查询。
步骤 4: 创建实体类(Document)

实体类对应 ES 中的文档。使用@EsId标记 ID,使用@EsIndexName指定索引名(可选)。

importlombok.Data;importorg.dromara.easyes.annotation.IndexField;importorg.dromara.easyes.annotation.IndexId;importorg.dromara.easyes.annotation.IndexName;importorg.dromara.easyes.common.constants.EsConstants;importorg.dromara.easyes.common.enums.IdType;@Data@IndexName("book_index")// 指定 ES 索引名publicclassBook{@IndexId(type=IdType.CUSTOMIZE)// ID 类型,自定义或 PRIMARY_KEYprivateStringid;// ES 文档 ID@IndexField(fieldType=EsConstants.TEXT)// 指定字段类型privateStringtitle;// 书名@IndexField(fieldType=EsConstants.KEYWORD)privateStringauthor;// 作者@IndexField(fieldType=EsConstants.DOUBLE)privateDoubleprice;// 价格@IndexField(fieldType=EsConstants.DATE)privateStringpublishDate;// 出版日期 (格式: yyyy-MM-dd)}

最佳实践

  • 使用@IndexField指定类型,避免默认映射错误(e.g., text 用于全文搜索,keyword 用于精确匹配)。
  • ID 类型:CUSTOMIZE 为自定义字符串 ID,PRIMARY_KEY 为自增。
  • 如果索引不存在,Easy-ES 会自动创建。
步骤 5: 创建 Mapper 接口

Mapper 继承BaseEsMapper<T>,无需实现方法,即可使用 CRUD。

importorg.dromara.easyes.core.base.BaseEsMapper;publicinterfaceBookMapperextendsBaseEsMapper<Book>{// 可自定义方法,但基础 CRUD 已内置}

最佳实践

  • 继承后即可调用insertselectByIdupdateByIddeleteById等。
  • 对于复杂查询,使用 LambdaEsQueryWrapper 构建。
步骤 6: 创建 Service 层

Service 使用 Mapper 进行业务操作。

importlombok.RequiredArgsConstructor;importorg.dromara.easyes.core.conditions.LambdaEsQueryWrapper;importorg.dromara.easyes.core.conditions.LambdaEsUpdateWrapper;importorg.springframework.stereotype.Service;importjava.util.List;@Service@RequiredArgsConstructorpublicclassBookService{privatefinalBookMapperbookMapper;// 新增书籍publicvoidaddBook(Bookbook){bookMapper.insert(book);}// 查询所有书籍publicList<Book>getAllBooks(){LambdaEsQueryWrapper<Book>wrapper=newLambdaEsQueryWrapper<>();returnbookMapper.selectList(wrapper);}// 根据标题模糊搜索publicList<Book>searchByTitle(Stringtitle){LambdaEsQueryWrapper<Book>wrapper=newLambdaEsQueryWrapper<>();wrapper.like(Book::getTitle,title);// 模糊匹配returnbookMapper.selectList(wrapper);}// 更新价格publicvoidupdatePrice(Stringid,DoublenewPrice){LambdaEsUpdateWrapper<Book>wrapper=newLambdaEsUpdateWrapper<>();wrapper.eq(Book::getId,id).set(Book::getPrice,newPrice);bookMapper.update(null,wrapper);}// 删除书籍publicvoiddeleteBook(Stringid){bookMapper.deleteById(id);}}

最佳实践

  • 使用 LambdaEsQueryWrapper 构建查询,像 MyBatis-Plus 一样链式调用(eq、like、gt、in 等)。
  • 支持分页:wrapper.limit(10, 1);(size, page)。
  • 聚合查询:wrapper.groupBy(Book::getAuthor).agg(AggType.COUNT);
  • 避免直接写 ES DSL,充分利用 Easy-ES 的 SQL-like 语法,提高可读性。
步骤 7: 创建 Controller 层

暴露 REST API。

importlombok.RequiredArgsConstructor;importorg.springframework.web.bind.annotation.*;importjava.util.List;@RestController@RequestMapping("/books")@RequiredArgsConstructorpublicclassBookController{privatefinalBookServicebookService;// 新增@PostMappingpublicStringadd(@RequestBodyBookbook){bookService.addBook(book);return"Added successfully";}// 查询所有@GetMappingpublicList<Book>getAll(){returnbookService.getAllBooks();}// 搜索@GetMapping("/search")publicList<Book>search(@RequestParamStringtitle){returnbookService.searchByTitle(title);}// 更新@PutMapping("/{id}")publicStringupdate(@PathVariableStringid,@RequestParamDoubleprice){bookService.updatePrice(id,price);return"Updated successfully";}// 删除@DeleteMapping("/{id}")publicStringdelete(@PathVariableStringid){bookService.deleteBook(id);return"Deleted successfully";}}
步骤 8: 启动与测试
  • 启动 Spring Boot 应用(main方法)。
  • ES 会自动创建索引book_index
  • 使用 Postman 测试:
    • POST /books:{“title”:“Spring Boot Guide”,“author”:“Author”,“price”:29.99,“publishDate”:“2026-01-01”}
    • GET /books/search?title=Spring → 返回匹配书籍
  • 检查日志,查看生成的 ES DSL 查询。
常见问题与最佳实践
  • 索引管理:Easy-ES 支持自动建索引,但生产中建议手动优化映射(analyzer、分词器)。
  • 性能优化:使用分页、避免全表扫描。复杂查询用 aggregation。
  • 错误处理:捕获EsException,日志记录 ES DSL。
  • 多数据源:配置easy-es.datasource支持多 ES 集群。
  • 版本兼容:确保 ES 版本与 Easy-ES 匹配(官网检查)。
  • 测试:使用@EsTest注解单元测试 Mapper。
  • 安全:生产中启用 ES 认证,配置用户名/密码。
  • 扩展:支持自定义插件、拦截器(e.g., 审计日志)。

参考来源:(Easy-ES GitHub 官方仓库)。

这个实战覆盖了基本整合,如果你有特定场景(如聚合查询、分页),可以进一步扩展!

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

54 Redis限流实现

Redis限流实现 本文深入剖析Redis限流的核心算法与实现方案,详解令牌桶、漏桶、滑动窗口三大算法原理,掌握Redisson RRateLimiter的使用技巧,构建生产级分布式限流系统。 1 为什么需要限流? 1.1 限流的业务价值 在高并发场景下,系统面临的主要风险: 常见问题: 流量突刺:秒杀…

作者头像 李华
网站建设 2026/2/8 9:07:20

58 Redis发布订阅

Redis发布订阅 本文深入剖析Redis发布订阅机制,从传统Pub/Sub模式到现代Stream方案,结合实际业务场景讲解消息队列的实现与优化,掌握分布式系统中的异步通信核心技术。 1 什么是Redis发布订阅 为什么需要消息队列? 在企业级分布式系统中,经常遇到以下场景需要异步通信: 常见…

作者头像 李华
网站建设 2026/2/9 9:09:52

Clawdbot 完整安装教程:打造你的 24/7 私人 AI 助手

Clawdbot 完整安装教程&#xff1a;打造你的 24/7 私人 AI 助手 &#x1f4d6; 目录 什么是 Clawdbot核心特性系统要求安装前准备安装步骤 Windows 安装macOS 安装Linux 安装Docker 安装 初始化配置连接聊天平台MCP 工具集成常见问题解决最佳实践总结 什么是 Clawdbot Clawd…

作者头像 李华
网站建设 2026/2/9 16:32:23

基于Matlab实现CNN卷积神经网络回归预测算法

CNN 卷积神经网络回归预测算法&#xff08;基于Matlab实现&#xff09; 特殊要求&#xff1a;Matlab版本应高于2018b MATLAB代码&#xff0c;多输入单输出&#xff0c;结果如图换数据直接用&#xff0c;附样本供实验。 代码运行无误&#xff0c;直接更换Excel数据即可实现。 不…

作者头像 李华
网站建设 2026/2/9 16:46:11

使用高版本SpringBoot导致Junit5的NoSuchMethodError的错误

关于作者&#xff1a; 一个深耕自己&#xff0c;不内耗的长期主义者。一个对技术充满激情&#xff0c;对工作对生活充满热情的热血青年。坚信&#xff0c;真正能让大家看懂的技术文章才是好文章&#xff0c;坚持用通俗易懂的大白话写技术文章&#xff0c;并会持续更新。 一、问…

作者头像 李华
网站建设 2026/2/10 1:03:48

深入理解 Java 虚拟机内存模型

深入理解 Java 虚拟机内存模型&#xff08;JMM&#xff09;—— 从底层原理到多线程实战&#xff08;2026 年视角&#xff09; Java 内存模型&#xff08;Java Memory Model&#xff0c;简称 JMM&#xff09;是 JVM 规范中定义的抽象模型&#xff0c;它屏蔽了底层硬件&#xf…

作者头像 李华