定军山-王霸之争(Easy-Es2.0王者归来)

接上回 (2.0bata),却说老汉自手刃嘴强上将道荣将军(邢道荣),生擒凤姐(潘凤)后,猶如凌空高臥,自诩风华绝代,实则寝食难安(内心慌得一批). 彼时三刀(刘三刀,凤姐拜把子肉兄弟)急召左右文武,欲倾巢而来,以雪大哥前耻,老汉深知汉之大限将至,早已布告天下,此间幸得一奇人相助,此人碧眼童颜,手执藜杖,唤汉至一洞中, 授汉为传世大弟子,予《太平要术》凡三卷 :” 汝得之,当代天宣化,普救世人;若萌异心,必获恶报。”汉拜问姓名。老人曰:“吾乃南华老仙也。”言讫,化阵清风而去。汉得此书,晓夜攻习,能呼风唤雨,号为“老汉道人”。

1

又说三刀这边,怒火中烧,拥百万雄师,星夜兼程,杀奔老汉大营,其麾下一毒士献计曰:”尔今凤姐尚在敌军营中,切不可轻举妄动,吾等可设伏军士,诈降贼寇,待贼寇不备,冲出围而歼之,一鼓作气,生擒老汉”,三刀闻之,言此计甚妙!于是另三军将士于汉军十里外山林埋伏,引火为号,不得妄动,另派一喽啰前往汉营送诈降书:

《定军山·三刀拍马屁歌》

老汉推*天下闻,英名早已震九州,  吾等插标卖首耳,皆非老汉之对手;  震怖如鼠抱头窜,辗转反侧不能眠,  率众百万前来降,望君不计过往嫌.  

老汉闻此马屁后大悦,得意忘形,迈悉以为三刀惧其妖术,便不多疑,命人重赏来使,并令三军将士设宴,亲自迎接三刀.

2

喽啰来报,三刀得知老汉已中其奸计,祭祖痛哭,“苍天有眼,殺父之仇可报也”! 命细作潜入汉营,与凤姐告知此事,引火为号,届时来个里应外合,让老汉腹背受敌,则大事可成.

次日,老汉全军设宴,大开城门,出门迎接三刀,三刀假意相迎,却以眉眼示左右引火,霎时间烟雾漫天,城内凤姐及细作与城外伏军里应外合,喊声震天,杀奔而来,老汉得知中计,急令众臣撤退,孰知城内守将早已被三刀收买,城门已关,老汉已无退路,前有三刀及其百万大军和,后有凤姐及城内叛贼,老汉知大势已去,唯有背水一战,置之死地而后生.

3

只见老汉拿出一灵符,手中摇一铜铃,口念咒语”阴阳八卦,狗壁的哈话x@##$莫装X,装X遭雷劈!”

不多时天空乌云密布,狂风大作,飞沙走石,老汉一记群攻大招”江山烽火啸,一啸为红颜”,引天雷无数,瞬间将三刀百万大军化为焦土,三刀与凤姐皆有掩体故躲过一劫,三刀见大事不妙,急唤城内凤姐及喽啰共同杀奔老汉而来,此间老汉大招正CD,只能以平A对之,奈何三刀武艺高强,一个闪现躲避,并从侧后方偷袭老汉要害,老汉中招落马,凤姐见状急来补刀,幸之老汉闪现尚在,急忙交出,并使出一记控制,尔后退却至草垛中隐蔽,正施法中又被三刀一记盲大(惊鸿幻剑-啾~ 啾啾啾啾!)击中,仅剩丝血,老汉慌乱之中使出太平要术第三卷之回血奇术,瞬间满血,并释放太平要术二卷之白鹤升天,浮于云端,坐等大招CD结束,而后一记大招偷袭,送兄弟二人归西。

自此天下太平,老汉也因伤及无辜无数,遭获恶报,头顶化为不毛之地,后人为感恩戴德,皆不辞辛苦,纷纷前往汉庙(https://gitee.com/dromara/easy-es | https://github.com/dromara/easy-es) 为其献上watch,star,Fork三连! 三连功德无量,不毛之地最终化作中分!

3

老汉又起舞了,这次是在山上,我有些看不清老汉的脸了,那落日余晖,也或许是老汉离得有些远了,但终归是能认清是老汉的,常年穿着这袭黑衣,也或许是老汉愈加沉稳的身影与动作,还依稀记得最早些时候,还会于室内摇曳,不知是看官多了,他人言语多了,便少于在室内起舞,厌烦了再与他人讲道理,有些道理说了,听与不听不说,听了又是真听进去了吗,这世道大抵是愈发不如从前了,前人更愿意讲道理,更愿意多想想,而今人却只顾一时之快,道理是不讲的,想得更多的也是自己的好坏得失去,您似乎舞的更慢了,是累了乏了还是想告诉我们不妨如你一般慢下来,还是一如既往不爱言辞,大抵心里也是有难以放下之物,悠扬乐曲中,老汉且慢舞.

4

有一份热,发一份光,就令萤火一般,也可以在黑暗里发一点光,不必等候炬火。从今如竟没有炬火,我便是唯一的光。

时至今日,黑子们再也无需忍受Elasticsearch这一迄今为止最让Java码农望而生畏的数据库,只需要引入老汉精耕多年打造的Easy-Es,便可轻松成为ikun(ES专家).

老汉花了近2年时间长期探索和持续输出,终于发布了2.0,引入了百余项改进,进一步简化了所有使用场景,与1.0相比有脱胎换骨的差别,再也不用担心搞不定es了,绝大多数功能都可以通过开箱即用的API完成,仅有少数场景通过不同粒度的混合查询也能轻松化解,就算你是ES小白,也可以像ES专家一样轻松拿捏ES

请把牛*扣在公屏上!下面老汉就带各位主公领略一下2.0究竟带来了哪些重磅特性:

  • 引入四种嵌套查询,并且支持无级嵌套, 无论查询条件多么复杂,层级多么深,都可以轻松拿捏.
      // MySQL语法        where business_type = 1              and (state = 9 or (state = 8 and bidding_sign = 1))              or (business_type = 2 and state in (2,3));      // Easy-Es及Mybatis-Plus语法       wrapper.eq("business_type", 1)                   .and(a -> a.eq("state", 9).or(b -> b.eq("state", 8).eq("bidding_sign", 1)))                   .or(i -> i.eq("business_type", 2).in("state", 2, 3));              // ES原生的RestHighLevel语法      List<Integer> values = Arrays.asList(2, 3);      BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();      boolQueryBuilder.must(QueryBuilders.termQuery("business_type", 1));      boolQueryBuilder.must(QueryBuilders.boolQuery()                  .must(QueryBuilders.termQuery("state", 9))                                    .should(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("state", 8))                                    .must(QueryBuilders.termQuery("bidding_sign", 1))));      boolQueryBuilder.should(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("business_type", 2))                                  .must(QueryBuilders.termsQuery("state", values)));
  • 对嵌套类型(相当于传统SQL中的连表查询)的高亮,索引自动化创建及全部查询等功能支持:
    @Test    public void testNestedMatch() {        // 嵌套查询 查询年龄等于18或8,且密码等于123的数据        LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();        wrapper.nested(FieldUtils.val(Document::getUsers), w ->                w.in(FieldUtils.val(User::getAge), 18, 8)                        .eq(FieldUtils.val(User::getPassword), "123"));        List<Document> documents = documentMapper.selectList(wrapper);        System.out.println(documents);    }
  • 对一父多子多孙等复杂场景的父子类型索引自动化创建及全部查询等功能支持:
@Testpublic void testJoin() {        LambdaEsQueryWrapper<Contact> contactWrapper1 = new LambdaEsQueryWrapper<>();        contactWrapper1.hasParent(w -> w.eq(FieldUtils.val(Author::getAuthorName), "cat"));        List<Contact> contacts1 = contactMapper.selectList(contactWrapper1);        System.out.println(contacts1);    // 省略hasChild,parentId等其它类型查询,具体可参考官网文档}
  • 根据上下文自动拼接.keyword后缀,框架根据查询类型和索引类型上下文自动推断拼接.keyword后缀,减少ES小白不了解ES特性踩坑的可能.
  • 提供全新自定义注解@Settings,支持便捷预设与灵活自定义功能,可支持ES索引中所有Settings的便捷处理
  • 提供多梯度的混合查询,尤其是wrapper.mix(QueryBuilder builder)查询,可极大提升框架拓展性,并且可以显著减少原生查询带来的代码量.
  • 新增@MultiIndexField注解及@InnerIndexField注解,可用于单字段指定多种分词器等场景
  • 新增@EsDS注解,增加对多数据源的支持
  • 所有CRUD方法支持方法粒度的自定义路由功能
  • 提供https连接ES方式,可免SSL验证
  • @IndexField新增dense_vector和dims指定,并兼容各种索引模式自动创建,以此支撑向量类型数据检索
  • 提供Ikun小黑子模式,提升编码趣味性,我们在文档,源码等每一个细节都在想方设法让编码这件事变得简单有趣

太多了根本列不完,各位主公感兴趣可自行前往官网查看,其中对四大嵌套查询,嵌套类型和父子类型的支持,其难度和复杂度是超乎想象的,只有用过ES原生语法的人才能深刻体会.Lambda条件构造器和DSL是树,对象结构是树,缓存和查询结果都是树,差点把老汉吊死在树上

你是否体会过树的每个节点中嵌着另一堆树的快感?任何简单的操作都会涉及到多级递归或多级深度/广度优先遍历,其中还掺杂着其它复杂的规则或逻辑,就算知道该怎么做,把代码写出来也是难上加难,往事不堪回首,近两年心血付诸,只为博各位官人一笑!

至此,99%开发中会用到的功能在2.0版本中都作了开箱即用的支持,剩余那些极小概率会用到的功能,可通过不同梯度的混合查询或原生查询来过渡解决,并且2.0并不是我们的最终版本,我们还会持续迭代推进,为全球开发者造福,开源万岁! 最后,感谢每一位读者及EE的支持者,感谢转发分享及三连,鸡你太美!

免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表一休教程网的观点和立场。