全国免费咨询:

13245491521

VR图标白色 VR图标黑色
X

中高端软件定制开发服务商

与我们取得联系

13245491521     13245491521

2023-10-30_Easy-Es:像mybatis-plus一样,轻松操作ES

您的位置:首页 >> 新闻 >> 行业资讯

Easy-Es:像mybatis-plus一样,轻松操作ES 点击小卡片参与粉丝专属福利 0. 引言es的java客户端不太友好的语法一直饱受诟病,书写一个查询语句可能需要书写一大串的代码,如果能像mybatis--plus一样,支持比较灵活方便的语句生成器那就好了。 于是为elasticsearch而生的ORM框架Easy-Es诞生了,使用及其方便快捷,今天我们就一起来学习easy-es,对比看看原生java-client方便之处在哪儿。 1. Easy-Es简介Easy-Es是以elasticsearch官方提供的RestHighLevelClient为基础,而开发的一款针对es的ORM框架,类似于es版的mybatis-plus,可以让开发者无需掌握es复杂的DSL语句,只要会mysql语法即可使用es,快速实现es客户端语法 官方文档:https://www.easy-es.cn/ 2. Easy-Es使用1、引入依赖 !--引入easy-es最新版本的依赖-- dependency groupIdorg.dromara.easy-es/groupId artifactIdeasy-es-boot-starter/artifactId version2.0.0-beta3/version /dependency !--排除springboot中内置的es依赖,以防和easy-es中的依赖冲突-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions exclusion groupIdorg.elasticsearch.client/groupId artifactIdelasticsearch-rest-high-level-client/artifactId /exclusion exclusion groupIdorg.elasticsearch/groupId artifactIdelasticsearch/artifactId /exclusion /exclusions /dependency dependency groupIdorg.elasticsearch.client/groupId artifactIdelasticsearch-rest-high-level-client/artifactId version7.14.0/version /dependency dependency groupIdorg.elasticsearch/groupId artifactIdelasticsearch/artifactId version7.14.0/version /dependency 2、添加配置项,这里只配置了几个基本的配置项,更多配置可参考官网文档:easy-es 配置介绍 easy-es: #es地址、账号密码 address:192.168.244.11:9200 username:elastic password:elastic 3、在启动类中添加es mapper文件的扫描路径 @EsMapperScan("com.example.easyesdemo.mapper") 在这里插入图片描述4、创建实体类,通过@IndexName注解申明索引名称及分片数,@IndexField注解申明字段名、数据类型、分词器等,更多介绍参考官方文档:essy-es 注解介绍 @IndexName(value="user_easy_es") @Data publicclassUserEasyEs{ @IndexId(type=IdType.CUSTOMIZE) privateLong privateStringname; privateInteger privateInteger @IndexField(fieldType=FieldType.TEXT,analyzer=Analyzer.IK_SMART,searchAnalyzer=Analyzer.IK_SMART) privateStringaddress; @IndexField(fieldType=FieldType.DATE,dateFormat="yyyy-MM-ddHH:mm:ss||yyyy-MM-dd||epoch_millis") privateDatecreateTime; privateStringcreateUser; } 5、创建mapper类,继承BaseEsMapper类,注意这里的mapper一定要创建到第3步中设置的mapper扫描路径下com.example.easyesdemo.mapper publicinterfaceUserEsMapperextendsBaseEsMapperUserEasyEs{ } 6、创建controller,书写创建索引、新增、修改、查询的接口 @RestController @RequestMapping("es") @AllArgsConstructor publicclassUserEsController{ privatefinalUserEsMapperuserEsMapper; /** *创建索引 *@return */ @GetMapping("create") publicBooleancreateIndex(){ returnuserEsMapper.createIndex(); } @GetMapping("save") publicIntegersave(Longid){ UserEasyEsuser=newUserEasyEs(); user.setId(id); user.setName("用户"+id); user.setAddress("江苏省无锡市滨湖区"); user.setAge(30); user.setSex(1); user.setCreateUser("admin"); user.setCreateTime(newDate()); Longcount=userEsMapper.selectCount(EsWrappers.lambdaQuery(UserEasyEs.class).eq(UserEasyEs::getId,id)); if(count0){ returnuserEsMapper.updateById(user); }else{ returnuserEsMapper.insert(user); } } @GetMapping("search") publicListUserEasyEssearch(Stringname,Stringaddress){ ListUserEasyEsuserEasyEs=userEsMapper.selectList( EsWrappers.lambdaQuery(UserEasyEs.class) .eq(UserEasyEs::getName,name) .match(UserEasyEs::getAddress,address) ); returnuserEasyEs; } } 7、分别调用几个接口 创建索引kibana中查询索引,发现创建成功 新增接口 这里新增了4笔数据新增成功 数据查询 如上便是针对easy-es的简单使用,这里的用法都与mp类似,上手相当简单,不用再写那些复杂的DSL语句了 3. 拓展介绍条件构造器上述演示,我们构造查询条件时,使用了EsWrappers来构造条件,用法与mp及其类型,大家根据提示就可以推导出方法如何书写,更详细的使用说明可以查看官方文档:easy-es 条件构造器介绍 索引托管如果想要自动根据创建的es实体类来创建对应的索引,那么只需要调整索引的托管模式为非手动模式即可,因为这里我不需要自动同步数据,所以选择非平滑模式 easy-es: global-config: process_index_mode:not_smoothly 其中三种模式的区别为:平滑模式:smoothly,索引的创建、数据更新迁移等都由easy-es自动完成 非平滑模式:not_smoothly,索引自动创建,但不会自动迁移数据 手动模式:manual,全部操作由用户手动完成,默认模式 数据同步如果数据源是来自mysql, 那么建议使用canal来进行同步,canal的使用可在我主页搜索。其次还有DataX, Logstash等同步工具,当然你也可以使用easy-es提供的CRUD接口,来手动同步数据 日志打印通过开启日志,可以在控制台打印执行的DSL语句,更加方便我们在开发阶段进行问题排查 logging: level: tracer:trace#开启trace级别日志,在开发时可以开启此配置,则控制台可以打印es全部请求信息及DSL语句,为了避免重复,开启此项配置后,可以将EE的print-dsl设置为false. 聚合查询 easy-es实现的聚合查询,只要是针对group by这类聚合,也就是es中的Terms aggregation,以及最大值、最小值、平均值、求和,而对于其他类型的聚合,还在不断更新中,但这里大家也需要了解,es的聚合和mysql的聚合完全是不一样的维度和复杂度,es支持非常多的聚合查询,所以其他类型的实现还需要借助RestHighLevelClient来实现我们利用easy-es来实现下之前书写的聚合案例 @RestController @AllArgsConstructor @RequestMapping("order") publicclassOrderEsController{ privatefinalOrderTestEsMapperorderEsMapper; @GetMapping("search") publicStringsearch(){ SearchResponsesearch=orderEsMapper.search(EsWrappers.lambdaQuery(OrderTest.class).groupBy(OrderTest::getStatus)); //包装查询结果 Aggregationsaggregations=search.getAggregations(); Termsterms=(Terms)aggregations.asList().get(0); List?extendsTerms.Bucketbuckets=terms.getBuckets(); HashMapString,LongstatusRes=newHashMap(); buckets.forEach(bucket-{ statusRes.put(bucket.getKeyAsString(),bucket.getDocCount()); System.out.println("---聚合结果---"); System.out.println(statusRes); returnstatusRes.toString(); } } 可以看到实际上的查询语句就一行,而其他的都是对返回结果的封装,因为es本身返回的数据是封装到嵌套的对象中的,所以我们需要对其进行包装 对比原始的查询语句,其易用性上的提升还是很明显的 4. 总结至此对easy-es的介绍就结束了,可以看到如果是针对es实现CRUD上,easy-es表现出非常好的便捷性,而在复杂的聚合查询中,仍然还有进步空间,目前还需要借助RestHighLevelClient,但easy-es的出现,为未来提供更好用的ES ORM框架,提供了希望和方向 文中演示代码见:https://gitee.com/wuhanxue/wu_study/tree/master/demo/easy-es-demo 如果文章对你有帮助的话欢迎「关注+点赞+收藏」 阅读原文

上一篇:2023-07-29_揭秘Transformer基于上下文学习的能力:看它如何学到正确的线性模型? 下一篇:2022-12-09_CVPR 2022|达摩院开源低成本大规模分类框架FFC

TAG标签:

19
网站开发网络凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设网站改版域名注册主机空间手机网站建设网站备案等方面的需求...
请立即点击咨询我们或拨打咨询热线:13245491521 13245491521 ,我们会详细为你一一解答你心中的疑难。
项目经理在线

相关阅读 更多>>

猜您喜欢更多>>

我们已经准备好了,你呢?
2022我们与您携手共赢,为您的企业营销保驾护航!

不达标就退款

高性价比建站

免费网站代备案

1对1原创设计服务

7×24小时售后支持

 

全国免费咨询:

13245491521

业务咨询:13245491521 / 13245491521

节假值班:13245491521()

联系地址:

Copyright © 2019-2025      ICP备案:沪ICP备19027192号-6 法律顾问:律师XXX支持

在线
客服

技术在线服务时间:9:00-20:00

在网站开发,您对接的直接是技术员,而非客服传话!

电话
咨询

13245491521
7*24小时客服热线

13245491521
项目经理手机

微信
咨询

加微信获取报价