vlambda博客
学习文章列表

【新晋开源项目】Easy-Es,Mybatis-Plus版的ES来啦,搜索引擎可以如此Easy!

作者介绍:

dromara开源组织成员,dromara/easy-es作者

八年健身经验,私教两年,文末有福利

https://github.com/dromara/easy-es

https://gitee.com/dromara/easy-es


                      【新晋开源项目】Easy-Es,Mybatis-Plus版的ES来啦,搜索引擎可以如此Easy!

近年来,ES在搜索领域独领风骚,一家独大,不否认其功能确实足够强大,但其提供的API却十分反人类,对开发者而言使用起来非常不友好,人人愿得而诛之. 对比优雅的Mybatis-Plus,不禁使人潸然泪下.于是余有诗叹焉:


《韭菜》---老汉

键盘敲得肌无力, 秃头枸杞曾太拼.

编码未捷身先死, 长使老汉泪满襟.


然哭并没什么卵用,通过总结,我们不难发现ES在使用中存在如下痛点亟需解决:

  • 语法难懂,需要学习

  • 官方提供的RestHigh/LowLevelClient十分难用

  • 编码量巨大,即便是非常简单的功能也需要大量代码才能实现

  • 查询字段名魔法值满天飞,一旦字段名发生改变,容易因漏改而产生bug

  • 使用门槛较高,通常需要中高级开发者才能驾驭

  • 针对复杂查询,代码难以维护

  • ...


为了解决如上诸多痛点,老汉我日以继夜,孤军奋战了一年,Easy-Es(后面简称EE)终于面世了,一举解决了如上所有问题,并将其开源献给给全球开发者,彻底解放开发生产力.


接入Easy-Es可以为开发者带来什么?

  • 简单易用高效不用我多说了吧,MyBatis-Plus用户懂的都懂! 大把的时间节省出来,做...爱做的事情,真香!

  • 使用门槛降低,就算是刚不懂Es的小白,也可以用EE开发各种功能

  • 大幅减少代码量,实现相同功能平均可节省3-5倍代码量

  • 降低重复代码量,杜绝魔法值,提升代码质量和可读性,便于维护

  • 社区活跃,并配有专业答疑团队免费答疑,无忧售后

  • 不玩虚的,所有功能永久全面开源,终生免费使用


项目架构(0.9.6及以下)

【新晋开源项目】Easy-Es,Mybatis-Plus版的ES来啦,搜索引擎可以如此Easy!

未来即将发布的0.9.7版本将引入插件模块,后续随着项目发展,会继续引入更多模块...


使用EE与RestHighLevelClient编码实际对比

需求:查询出文档标题为 "中国功夫"且作者为"老汉"的所有文档

    // 使用Easy-Es仅需3行代码即可完成查询,若不考虑换行,最少仅需1行代码
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.eq(Document::getTitle, "传统功夫").eq(Document::getCreator, "码保国");
List<Document> documents = documentMapper.selectList(wrapper);
// 传统方式, 直接用RestHighLevelClient进行查询 需要11行代码,还不包含解析JSON代码
String indexName = "document";
SearchRequest searchRequest = new SearchRequest(indexName);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
TermQueryBuilder titleTerm = QueryBuilders.termQuery("title", "传统功夫");
TermsQueryBuilder creatorTerm = QueryBuilders.termsQuery("creator", "码保国");
boolQueryBuilder.must(titleTerm);
boolQueryBuilder.must(creatorTerm);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
try {
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 然后从searchResponse中通过各种方式解析出DocumentList 省略这些代码...
} catch (IOException e) {
e.printStackTrace();
}
  • 以上只是简单查询演示,实际使用场景越复杂,效果就越好,平均可节省3-5倍代码量

  • 传统功夫,点到为止! 上述功能仅供演示,仅为Easy-Es支持功能的冰山一角


接入顾虑粉碎

在正式将EE接入至生产环境之前,您肯定有不少顾虑,比如性能,安全,拓展性等,毕竟本框架没有阿里等大厂背书,也不是什么饶有名气的开发者出品,开发者凭什么相信?既然有信心发布,那我自然也是有备而来.

【新晋开源项目】Easy-Es,Mybatis-Plus版的ES来啦,搜索引擎可以如此Easy!

  • 性能:实测与直接使用RestHighLevelClient相比,EE在查询类接口,首次查询性能平均损耗10ms左右,后续查询如果是在同一索引上进行,由于本地缓存生效,性能损耗低于10ms.其余增删改与直接使用原生无差异. 牺牲10毫秒,对用户而言是无感知的,但对开发而言,可以节省大量代码和时间,我认为这是值得的,基本上没有哪款ORM框架是不会损耗性能的,权衡利弊,主公们心理应该都会有答案.

  • 安全:所用套件均来自ES官方和Spring官方,无其它多余依赖,足够轻量,核心原理只是转换,相当于一个翻译或者中介,并无其它涉及安全类的操作,所以有理由认为使用EE是相对安全的.

  • 拓展性:EE底层用的就是Es官方提供的RestHighLevelClient,我们只是对RestHighLevelClient做了增强,并没有改变减少或是削弱它原有的功能,并且提供了原生查询,半原生查询,混合查询等多种模式,可覆盖几乎全部MySQL支持的功能和100%的ES支持功能,所以您无需担心其拓展性.

  • 社区: 本项目已捐赠予国内饶有影响力的Dromara社区,并拥有非常多优秀且活跃的开发者长期维护.

以上测试数据及更详细介绍可参见Easy-ES官网


尽管目前Easy-Es还处于新生儿状态,但由于站在巨人的肩膀上(RestHighLevelClient和Mybatis-Plus),这是一款出道即巅峰的框架,这么说并不是说它写得有多好,而是它融合了两款目前非常优秀框架的优点,这决定了它起点的高度,

未来我们将会根据用户使用反馈不断优化现有功能,并持续引入尚未集成的ES功能,努力覆盖100%ES功能,而非通借助原生/混合查询能力,如此便可最大程度减少用户工作量,彻底把简单,易用,方便留给用户,把复杂留给框架.

我们致力于成为全球最受欢迎的ElasticSearch搜索引擎开发框架,让天下没有难用的ES.



最后小编发福利啦:


欢迎给猛男大佬的项目点赞!!

https://github.com/dromara/easy-es

https://gitee.com/dromara/easy-es