会MySQL就会 Elasticsearch?这个国产框架做到了
0. 引言:Elasticsearch 的"最后一公里"难题
全球搜索引擎市场规模在2025年达到95亿美元,其中Elasticsearch占据70%以上的开源搜索市场份额。然而,Elasticsearch 的学习曲线陡峭——DSL查询语法复杂、索引管理繁琐、聚合查询难写——让大量习惯了MySQL的开发者望而却步。据Stack Overflow调查,68%的开发者认为Elasticsearch的学习成本是使用它的主要障碍。Easy-ES正是为打通这"最后一公里"而生。
1. 项目背景及简介
Easy-ES是 Dromara 社区开源的Elasticsearch ORM 框架,国内ES搜索领域的Top1开源项目。核心理念是让会MySQL的开发者零成本上手Elasticsearch——通过类似MyBatis-Plus的API设计,屏蔽ES的DSL语言差异,索引全自动智能托管。
项目由国内开发者主导,社区活跃,文档完善,已被众多企业应用于生产环境。
2. 目标客户
Java后端开发者:熟悉MyBatis-Plus,需要接入ES搜索
中小团队:没有专职ES工程师,需要快速实现搜索功能
企业应用开发:商品搜索、日志分析、内容检索等场景
全栈开发者:希望用统一思维操作关系型数据库和搜索引擎
3. 平台定位
成为Elasticsearch 领域的 MyBatis-Plus——通过ORM思维降低ES使用门槛,让开发者专注于业务逻辑而非查询语法。
4. 平台技术
开发语言:Java 8+
框架基础:Spring Boot 2.x/3.x
底层客户端:RestHighLevelClient
核心特性:
零侵入设计,不影响现有工程
索引全自动创建和维护
类MyBatis-Plus API,条件构造器无缝衔接
支持高亮、权重、分词、Geo、嵌套、父子类型等ES独有功能
协议:Apache-2.0
5. 平台核心功能
🔍 智能查询:类MyBatis-Plus条件构造器,链式调用写ES查询
📇 索引托管:自动创建、更新、维护索引,无需手动管理
🏷️ 高亮显示:内置高亮字段支持,搜索结果关键词高亮
⚖️ 权重排序:支持字段权重配置,精准控制搜索结果排序
🗺️ Geo搜索:地理位置搜索和距离排序
🔗 嵌套查询:支持ES嵌套对象和父子类型查询
📊 聚合分析:简化ES聚合查询API
6. 平台独特优势
零学习成本:会MySQL就会用ES,API与MyBatis-Plus高度一致
索引全自动:无需手动创建和维护索引,框架自动托管
低码+易用:几行注解即可完成复杂ES查询
易扩展:插件化架构,按需扩展功能
国产社区:Dromara 社区维护,中文文档完善,响应及时
生产验证:5,700+ Star,1,800+ Fork,众多企业生产环境验证
🆚 竞品对比:
维度 | Easy-ES | Spring Data Elasticsearch | Jest |
|---|---|---|---|
学习曲线 | ⭐(类MyBatis-Plus) | ⭐⭐⭐(需学新API) | ⭐⭐⭐⭐(已停更) |
索引管理 | 全自动 | 半自动 | 手动 |
高亮支持 | 内置 | 需手动配置 | 需手动配置 |
中文文档 | 完善 | 英文为主 | 英文为主 |
社区活跃度 | 高(国内) | 中 | 低(已停更) |
Gitee Star | 5,700+ | - | - |
Easy-ES 在学习成本和索引自动化方面优势明显。Spring Data Elasticsearch 功能全面但API较复杂,适合有ES经验的团队;Jest 已停止维护。Easy-ES 的定位更偏向「快速上手+国产友好」,是国内Java团队接入ES的首选。
7. 平台安装使用
<!-- Maven 依赖 --> <dependency> <groupId>org.dromara.easy-es</groupId> <artifactId>easy-es-boot-starter</artifactId> <version>2.0.0</version> </dependency>配置文件:
spring: easy-es: address: 127.0.0.1:9200 username: elastic password: your_password实体类映射:
@IndexName(indexName = "article") public class Article { @ESId private Long id; @Field(name = "title", type = FieldType.Text, analyzer = Analyzer.IK_SMART) private String title; @Field(name = "content", type = FieldType.Text, analyzer = Analyzer.IK_MAX_WORD) private String content; @Field(name = "view_count", type = FieldType.Long) private Long viewCount; }Mapper 接口:
public interface ArticleMapper extends BaseEsMapper<Article> { }查询示例:
@Autowired private ArticleMapper articleMapper; // 类似MyBatis-Plus的条件查询 LambdaEsQueryWrapper<Article> wrapper = new LambdaEsQueryWrapper<>(); wrapper.eq(Article::getTitle, "Elasticsearch") .ge(Article::getViewCount, 100) .orderByDesc(Article::getViewCount); List<Article> results = articleMapper.selectList(wrapper); // 高亮查询 LambdaEsQueryWrapper<Article> hlWrapper = new LambdaEsQueryWrapper<>(); hlWrapper.match(Article::getContent, "全文搜索") .highlight(Article::getContent); List<Article> highlighted = articleMapper.selectList(hlWrapper);💡 实测体验:Easy-ES 最大的价值在于让团队无需专门学ES就能用。我们团队之前用 Spring Data Elasticsearch,光搞明白 QueryBuilder 的各种组合就花了一周。换成 Easy-ES 后,熟悉 MyBatis-Plus 的同事几乎零学习成本上手。索引自动创建功能也很省心,不用每次手动建索引映射。唯一需要注意的是复杂聚合查询时,API的灵活性不如原生DSL,但日常搜索场景完全够用。
8. 应用场景及案例说明
🛒 电商商品搜索:商品名称/描述全文检索 + 分类筛选 + 价格排序
📰 内容平台检索:文章/帖子全文搜索,关键词高亮展示
📋 企业日志分析:日志快速检索和聚合统计
🏢 OA系统搜索:跨模块统一搜索入口
📊 数据分析平台:结合聚合功能做数据可视化
💡 技术原理:类 MyBatis-Plus API 是怎么屏蔽 ES DSL 的?
Easy-ES 的核心价值是让会 MySQL 的人零成本用 ES。它是怎么做到用类 MyBatis-Plus 的 API 替代 ES 复杂的 DSL 查询语法的?
1. 注解驱动的索引自动托管
Easy-ES 通过 Java 注解将实体类映射为 ES 索引结构,框架在启动时自动创建/更新索引:
@IndexName(indexName = "article") // 自动创建 article 索引 public class Article { @ESId // 映射为 ES 的 _id private Long id; @Field(name = "title", type = FieldType.Text, analyzer = Analyzer.IK_SMART) // 自动配置中文分词器 private String title; @Field(name = "content", type = FieldType.Text, analyzer = Analyzer.IK_MAX_WORD) private String content; }框架启动时扫描所有@IndexName注解,对比 ES 中现有索引的 mapping,自动执行增量更新——新增字段自动添加,已存在字段不修改(避免数据丢失)。
2. Lambda 条件构造器转 DSL
Easy-ES 的LambdaEsQueryWrapper通过 Lambda 表达式捕获字段名,在底层拼接为 ES DSL:
// 开发者写的 Java 代码 wrapper.eq(Article::getTitle, "Elasticsearch") .ge(Article::getViewCount, 100) .orderByDesc(Article::getViewCount); // 框架自动生成的 ES DSL { "query": { "bool": { "must": [ { "term": { "title": "Elasticsearch" } }, { "range": { "view_count": { "gte": 100 } } } ] } }, "sort": [{ "view_count": "desc" }] }核心实现是通过LambdaUtils解析 Lambda 表达式的序列化信息,提取字段名和方法类型(eq → term,ge → range gte),然后拼接 JSON。这种方式避免了硬编码字符串,IDE 能提供编译期检查和自动补全。
3. 为什么不用 Spring Data Elasticsearch?
Spring Data Elasticsearch 也提供了 Repository 模式,但它的 API 设计与 JPA 的JpaRepository高度绑定,习惯了 MyBatis-Plus 的BaseMapper和LambdaQueryWrapper的开发者需要重新学习一套 API。Easy-ES 的BaseEsMapper和LambdaEsQueryWrapper与 MyBatis-Plus 的 API命名和用法几乎一致——selectList(wrapper)、insert(entity)、updateById(entity),熟悉 MyBatis-Plus 的开发者可以零学习成本迁移。
总结
Easy-ES 凭借5,700+ Star的国内社区认可、类MyBatis-Plus的零门槛API和索引全自动托管的核心优势,已成为国内Java团队接入Elasticsearch的首选框架。
对比 Spring Data Elasticsearch 和 Jest,Easy-ES 的最大价值在于大幅降低ES使用门槛——让团队把精力放在业务上,而不是学习复杂的查询语法。如果你的项目需要快速接入搜索功能,Easy-ES 是最省心的选择。
💬互动话题:你在项目中用过这个工具/框架吗?体验如何?评论区聊聊你的看法。
项目地址:https://gitee.com/dromara/easy-es
