从市场情报到自主执行:SuperFlow提出AI Agent金融基础设施路线
2026/8/2 17:48:00
Easy-ES 是一个基于 Elasticsearch 的 ORM 框架,类似于 MyBatis-Plus,但专注于简化 ES 操作。它提供了 MySQL-like 的语法,支持 Lambda 风格查询、自动映射、分页、聚合等功能,极大降低了直接使用 RestHighLevelClient 的复杂度。Easy-ES 适合需要全文搜索、复杂查询的 Spring Boot 项目,如电商搜索、日志分析等。
本教程基于 Easy-ES 最新版本(假设 2.x,实际以 GitHub 最新为准),从零搭建一个简单书籍管理系统,演示 CRUD 操作。假设你有基本的 Spring Boot 和 Elasticsearch 知识。
使用 Spring Initializr 创建项目:
下载后导入 IDE。
在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 依赖。
在application.yml或application.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最佳实践:
实体类对应 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 用于精确匹配)。Mapper 继承BaseEsMapper<T>,无需实现方法,即可使用 CRUD。
importorg.dromara.easyes.core.base.BaseEsMapper;publicinterfaceBookMapperextendsBaseEsMapper<Book>{// 可自定义方法,但基础 CRUD 已内置}最佳实践:
insert、selectById、updateById、deleteById等。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);}}最佳实践:
wrapper.limit(10, 1);(size, page)。wrapper.groupBy(Book::getAuthor).agg(AggType.COUNT);暴露 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";}}main方法)。book_index。EsException,日志记录 ES DSL。easy-es.datasource支持多 ES 集群。@EsTest注解单元测试 Mapper。参考来源:(Easy-ES GitHub 官方仓库)。
这个实战覆盖了基本整合,如果你有特定场景(如聚合查询、分页),可以进一步扩展!