背景
曾几何时,我也在幻想,开发者能不能不要浪费太多时间精力去学习各种产品不同的语法,毕竟人的精力和记忆都是有限的,浪费时间在这些差异上面,机会成本太高了,好不容易学会了,使用频率又不高,最后又忘了,一来一回何必呢?有这时间多陪陪家人不香吗?
后来梦成真了,Hibernate,JPA,Mybatis-plus等众多框架帮我们屏蔽了不同数据库语言的差异性,更提供了大量开箱即用的方法,帮开发者节省了大量时间,用下来体验非常好,受此启发,我开始着手开发一款类似的开源框架:Easy-Es,截止目前,市面上关于Es的开源框架少之又少,尚未有类似框架,究其原因主要是由于Es本身门槛较高,且在很多项目中未必会用到,所以很少有人愿意花精力去搞一款用户群体较少的框架吧,另外Es官方也提供了一款功能无比强大的脚手架:RestLowLevelClient和RestHighLevelClient,用上它之后,还有多少人愿意再去封装更好用的框架? 但笔者在使用过程中发现官方提供的框架虽然功能强大,但用起来体验却并不太友好,仍存在如下几个痛点亟需解决:
- 需要学会Es的语法才能使用
- 代码中的查询字段名称需要使用魔法值
- 即便是很简单的功能,调用和解析Response时仍需要大量代码,对开发者不太友好
- ...
这些痛点也引起了广大开发者的共鸣,为了解决如上困扰,Easy-ES应用而生,底层仍采用官方提供的RestHighLevelClient,保障其原生性能和拓展性,API层采用目前国内最受欢迎的Mybatis-Plus语法,保持和它一样的语法和功能,尽量减少开发者的额外学习成本,确保开发者可以光速上手.
简介
Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的低码开发框架,在 RestHighLevelClient 的基础上,,只做增强不做改变,为简化开发、提高效率而生,可以把它当做Mybatis-Plus的Es版.
优势
- 屏蔽语言差异:开发者只需要会MySQL语法即可使用Es,真正做到一通百通,无需学习枯燥易忘的Es语法,Es使用相对MySQL较低频,学了长期不用也会忘,没必要浪费这时间.开发就应该专注于业务,省下的时间去撸铁,去陪女朋友陪家人,不做资本家的韭菜
- 极少的代码量: 与直接使用RestHighLevelClient相比,相同的查询平均可以节省3-5倍左右的代码量
- 零魔法值:字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值,提高代码可读性,杜绝因字段名称修改而代码漏改带来的Bug
- 零额外学习成本:开发者只要会国内最受欢迎的Mybatis-Plus语法,即可无缝迁移至EE,EE采用和前者相同的语法,消除使用者额外学习成本,直接上手,爽
- 降低开发者门槛: Es通常需要中高级开发者才能驾驭,但通过接入EE,即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发,可以提高人员利用率,降低企业成本
对比
需求:查询出文档标题为 "中国功夫"且作者为"老汉"的所有文档
// 使用Easy-Es仅需3行代码即可完成查询
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支持功能的冰山一角
项目地址
需求:查询出文档标题为 "中国功夫"且作者为"老汉"的所有文档
// 使用Easy-Es仅需3行代码即可完成查询
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支持功能的冰山一角
文档
结语
尽管目前Easy-Es目前开源不久,但由于站在巨人的肩膀上(RestHighLevelClient和Mybatis-Plus),这是一款出道即巅峰的框架,这么说并不是说它写得有多好,而是它融合了两款目前非常优秀框架的优点,这决定了它起点的高度,截止目前项目已迭代6个版本,且首版已走完Mybatis-Plus耗时数年才走完的路,项目仍在高速发展中,已经被Gitee官方推荐,占据每日,每周热搜榜首,收到大量Star和好评,未来希望有更多人加入我们,一起完善 Easy-Es,如果您也觉得Easy-Es框架不错,不妨花几秒钟时间帮作者在Gitee或github上点亮小星星⭐,让更多人看到本框架,感谢大家!
彩蛋
- github网页打不开或者打开慢?
Windows系统打开 C:\Windows\System32\drivers\etc
Mac可以在/etc/ 目录下找到hosts文件
找到后编辑hosts文件,加入如下配置:
140.82.113.4 github.com
199.232.69.194 github.global.ssl.fastly.net
185.199.108.153 assets-cdn.github.com
185.199.110.153 assets-cdn.github.com
185.199.111.153 assets-cdn.github.com
- 需要健身计划?
截止目前我已健身8年,私教经验2年,曾获500Fit全国大学生健体比赛优秀奖,该系统是我在三年前开源的一款系统,将人群细分为108类,按照个人意愿准一对一定制的健身计划,包含饮食,作息,训练等全方位计划,助力您早日收获好身材.另外,如果大家有颈椎不适,也可以通过我在Gitee中留的联系方式,留言此篇文档,并注明来源CSDN,即可免费领取一份颈椎保护的PPT,早学早受益!