diff --git a/dist/404.html b/dist/404.html index 25300830..51d6d154 100644 --- a/dist/404.html +++ b/dist/404.html @@ -62,11 +62,11 @@ - +
404
这是一个Four-Oh-Four.
返回首页
- + diff --git a/dist/archives/index.html b/dist/archives/index.html index 7e523b93..e8ce8957 100644 --- a/dist/archives/index.html +++ b/dist/archives/index.html @@ -62,7 +62,7 @@ - + @@ -86,7 +86,7 @@ 简体中文 (opens new window)

+ (opens new window)

归档

- + diff --git a/dist/assets/js/10.4662883c.js b/dist/assets/js/10.4662883c.js new file mode 100644 index 00000000..ef3bd978 --- /dev/null +++ b/dist/assets/js/10.4662883c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{325:function(t,s,e){"use strict";e.r(s);var a=e(6),n=Object(a.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("提示")]),t._v(" "),e("p",[t._v('古语有云"工欲善其事,必先利器","磨刀不误砍柴工"...')])]),t._v(" "),e("p",[t._v("为了让每位用户(尤其是小白)尽量避免踩坑,节省更多时间,特此总结一篇避坑指南,在正式使用EE之前,不妨花三五分钟学习一下,可以帮各位在使用中避免踩坑,从而节省大量时间.")]),t._v(" "),e("h2",{attrs:{id:"_1-es版本及springboot版本"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_1-es版本及springboot版本"}},[t._v("#")]),t._v(" 1.ES版本及SpringBoot版本")]),t._v(" "),e("p",[t._v("由于我们底层用了ES官方的RestHighLevelClient,所以对ES版本有要求,底层用的RestHighLevelClient版本为7.10,所以对7.10的es兼容性最好,目前实测下来ES版本为7.x 都可以完美兼容."),e("br"),t._v("底层使用的Springboot版本为2.5.4,所以我们推荐用户springboot版本也用2.5.4,由于我们对Springboot的依赖模块比较少,目前实测下来2.3.x-2.6.x的Springboot都可以完美兼容,更低或者更高的版本没有实测,用户可自行测试,我们也不清楚springboot2.5.4具体能向下和向上兼容到什么版本,总之还是推荐尽量和框架内置版本保持一致.")]),t._v(" "),e("h2",{attrs:{id:"_2-es索引的keyword类型和text类型"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_2-es索引的keyword类型和text类型"}},[t._v("#")]),t._v(" 2.ES索引的keyword类型和text类型")]),t._v(" "),e("blockquote",[e("p",[t._v("对ES索引类型已经了解的可直接跳过此段介绍.")])]),t._v(" "),e("p",[t._v("ES中的keyword类型,和MySQL中的字段基本上差不多,当我们需要对查询字段进行精确匹配,左模糊,右模糊,全模糊,排序聚合等操作时,需要该字段的索引类型为keyword类型,否则你会发现查询没有查出想要的结果,甚至报错. 比如EE中常用的API eq(),like(),distinct()等都需要字段类型为keyword类型.")]),t._v(" "),e("p",[t._v("当我们需要对字段进行分词查询时,需要该字段的类型为text类型,并且指定分词器(不指定就用ES默认分词器,效果通常不理想). 比如EE中常用的API match()等都需要字段类型为text类型. 当使用match查询时未查询到预期结果时,可以先检查索引类型,然后再检查分词器,因为如果一个词没被分词器分出来,那结果也是查询不出来的.")]),t._v(" "),e("p",[t._v('当同一个字段,我们既需要把它当keyword类型使用,又需要把它当text类型使用时,此时我们的索引类型为keyword_text类型,EE中可以对字段添加注解@TableField(fieldType = FieldType.KEYWORD_TEXT),如此该字段就会被创建为keyword+text双类型如下图所示,值得注意的是,当我们把该字段当做keyword类型查询时,ES要求传入的字段名称为"字段名.keyword",当把该字段当text类型查询时,直接使用原字段名即可.')]),t._v(" "),e("p",[e("img",{attrs:{src:"https://iknow.hs.net/72818af6-7cc3-4833-b7a7-dbff845ce73e.png",alt:"image2"}})]),t._v(" "),e("p",[t._v("另一种做法是,可以冗余一个字段,值用相同的,一个注解标记为keyword类型,另一个标记为text类型,查询时按规则选择对应字段进行查询.")]),t._v(" "),e("p",[t._v("还需要注意的是,如果一个字段的索引类型被创建为仅为keyword类型(如下图所示)查询时,则不需要在其名称后面追加.keyword,直接查询就行.")]),t._v(" "),e("p",[e("img",{attrs:{src:"https://iknow.hs.net/87335e55-1fe3-44ed-920b-61354383e85a.png",alt:"image3"}})]),t._v(" "),e("h2",{attrs:{id:"_3-字段id"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-字段id"}},[t._v("#")]),t._v(" 3.字段id")]),t._v(" "),e("p",[t._v("由于框架很多功能都是借助id实现的,比如selectById,update,deleteById...,而且ES中也必须有一列作为数据id,因此我们强制要求用户封装的实体类中包含字段id列,否则框架不少功能无法正常使用.")]),t._v(" "),e("div",{staticClass:"language-java line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * es中的唯一id,如果你想自定义es中的id为你提供的id,比如MySQL中的id,请将注解中的type指定为customize或直接在全局配置文件中指定,如此id便支持任意数据类型)\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@TableId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("type "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IdType")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CUSTOMIZE"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" id"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br")])]),e("p",[t._v("如果不添加@TableId注解或者添加了注解但未指定type,则id默认为es自动生成的id.")]),t._v(" "),e("p",[t._v("在调用insert方法时,如果该id数据在es中不存在,则新增该数据,如果已有该id数据,则即便你调用的是insert方法,实际上的效果也是更新该id对应的数据,这点需要区别于MP和MySQL.")]),t._v(" "),e("h2",{attrs:{id:"_4-项目中同时使用mybatis-plus和easy-es"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-项目中同时使用mybatis-plus和easy-es"}},[t._v("#")]),t._v(" 4.项目中同时使用Mybatis-Plus和Easy-Es")]),t._v(" "),e("p",[t._v("在此场景下,您需要将MP的mapper和EE的mapper分别放在不同的目录下,并在配置扫描路径时各自配各自的扫描路径,如此便可共存使用了,否则两者在SpringBoot启动时都去扫描同一路径,并尝试注册为自己的bean,由于底层实现依赖的类完全不一样,所以会导致其中之一注册失败,整个项目无法正常启动.可参考下图:")]),t._v(" "),e("p",[e("img",{attrs:{src:"https://iknow.hs.net/30f08bc4-cb07-4ac6-8a52-59e062105238.png",alt:"image4"}})]),t._v(" "),e("p",[e("img",{attrs:{src:"https://iknow.hs.net/f018fd5b-a932-445f-8ce0-b76d58caf931.png",alt:"image5"}})]),t._v(" "),e("h2",{attrs:{id:"_5-and和or的使用"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_5-and和or的使用"}},[t._v("#")]),t._v(" 5.and和or的使用")]),t._v(" "),e("p",[t._v("需要区别于MySQL和MP,因为ES的查询参数是树形数据结构,和MySQL平铺的不一样,具体可参考"),e("RouterLink",{attrs:{to:"/pages/1cebb8/"}},[t._v("条件构造器-and&or")]),t._v("章节,有详细节省")],1),t._v(" "),e("p",[t._v("关于避坑暂时先讲这么多,后续如果有补充再追加,祝各位主公使用愉快,使用过程中有任何疑问及建议,可添加我微信252645816反馈,我们也有专门的答疑群为各位主公们免费服务.")])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/11.86786ad3.js b/dist/assets/js/11.86786ad3.js new file mode 100644 index 00000000..2263274f --- /dev/null +++ b/dist/assets/js/11.86786ad3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{326:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("p",[s._v("如果您用过Mybatis-Plus的话,您基本上可以无需多看此文档即可直接上手使用\nEasy-Es是Mybatis-Plus在Elastic Search的平替版.")])]),s._v(" "),a("p",[s._v("我们将通过一个简单的 Demo 来阐述 Easy-Es 的强大功能,在此之前,我们假设您已经:")]),s._v(" "),a("ul",[a("li",[s._v("拥有 Java 开发环境以及相应 IDE")]),s._v(" "),a("li",[s._v("熟悉MySQL")]),s._v(" "),a("li",[s._v("熟悉 Spring Boot (推荐版本2.5.x +)")]),s._v(" "),a("li",[s._v("熟悉 Maven")]),s._v(" "),a("li",[s._v("了解Es基本概念或已读"),a("RouterLink",{attrs:{to:"/v1.0.0/010.快速入门/avoid-pit.html"}},[s._v("避坑指南")]),s._v(" (强烈推荐)")],1),s._v(" "),a("li",[s._v("已安装Es "),a("strong",[s._v("推荐7.x+版本")]),s._v("(没有安装的可自行百度教程,建议再装一个es-head插件,便于可视化验证),低版本可能存在API不兼容或其它未知情况,因为底层采用RestHighLevelClient而非RestLowLevelClient,本Demo采用Es版本为7.10.0")])]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("推荐")]),s._v(" "),a("p",[s._v("推荐您参考这篇"),a("RouterLink",{attrs:{to:"/pages/12283a/"}},[s._v("Springboo集成demo")]),s._v(",可帮助您节省您更多时间.")],1)]),s._v(" "),a("h2",{attrs:{id:"初始化工程"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#初始化工程"}},[s._v("#")]),s._v(" 初始化工程")]),s._v(" "),a("p",[s._v("创建一个空的 Spring Boot 工程")]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("p",[s._v("可以使用 "),a("a",{attrs:{href:"https://start.spring.io/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Spring Initializer"),a("OutboundLink")],1),s._v("快速初始化一个 Spring Boot 工程")])]),s._v(" "),a("h2",{attrs:{id:"添加依赖"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#添加依赖"}},[s._v("#")]),s._v(" 添加依赖")]),s._v(" "),a("p",[a("strong",[s._v("Maven:")])]),s._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("cn.easy-es"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("easy-es-boot-starter"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("Latest Version"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[a("strong",[s._v("Gradle:")])]),s._v(" "),a("div",{staticClass:"language-groovy line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-groovy"}},[a("code",[s._v("compile group"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'cn.easy-es'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'easy-es-boot-starter'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" version"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'Latest Version'")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("p",[s._v("Latest Version: "),a("a",{attrs:{href:"https://img.shields.io/github/v/release/xpc1024/easy-es?include_prereleases&logo=xpc&style=plastic",target:"_blank",rel:"noopener noreferrer"}},[s._v("点此获取"),a("OutboundLink")],1)])]),s._v(" "),a("h2",{attrs:{id:"配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置"}},[s._v("#")]),s._v(" 配置")]),s._v(" "),a("p",[s._v("在 application.yml 配置文件中添加EasyEs必须的相关配置:")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("easy-es")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#默认为true,若为false则认为不启用本框架")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("address")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9200")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# es的连接地址,必须含端口 若为集群,则可以用逗号隔开 例如:127.0.0.1:9200,127.0.0.2:9200")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" elastic "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#若无 则可省略此行配置")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" WG7WVmuNMtM4GwNYkyWH "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#若无 则可省略此行配置")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("其它配置暂可省略,后面有章节详细介绍EasyEs的配置")]),s._v(" "),a("p",[s._v("在 Spring Boot 启动类中添加 @EsMapperScan 注解,扫描 Mapper 文件夹:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@SpringBootApplication")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@EsMapperScan")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"com.xpc.easyes.sample.mapper"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Application")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SpringApplication")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Application")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("h2",{attrs:{id:"背景"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#背景"}},[s._v("#")]),s._v(" 背景")]),s._v(" "),a("p",[s._v("现有一张Document文档表,随着数据量膨胀,其查询效率已经无法满足产品需求,其表结构如下,我们打算将此表内容迁移至Es搜索引擎,提高查询效率")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("id")]),s._v(" "),a("th",[s._v("title")]),s._v(" "),a("th",[s._v("content")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[s._v("主键")]),s._v(" "),a("td",[s._v("标题")]),s._v(" "),a("td",[s._v("内容")])])])]),s._v(" "),a("h2",{attrs:{id:"编码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编码"}},[s._v("#")]),s._v(" 编码")]),s._v(" "),a("p",[s._v("编写实体类Document.java(此处使用了 "),a("a",{attrs:{href:"https://www.projectlombok.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Lombok"),a("OutboundLink")],1),s._v("简化代码)")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Data")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * es中的唯一id\n */")]),s._v("\t\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 文档标题\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 文档内容\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("ul",[a("li",[s._v("上面字段名称以及下划线转自动驼峰,字段在ES中的存储类型,分词器等均可配置,在后续章节会有介绍.")]),s._v(" "),a("li",[s._v("String类型默认会被EE创建为keyword类型,keyword类型支持精确查询等")]),s._v(" "),a("li",[s._v("如需分词查询,可像上面content一样,在字段上加上@TableField注解并指明字段类型为text,并指定分词器.")])])]),s._v(" "),a("p",[s._v("编写Mapper类 DocumentMapper.java")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DocumentMapper")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("extends")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("BaseEsMapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("##前置操作")]),s._v(" "),a("p",[s._v("启动项目,由Easy-Es自动帮您创建索引(相当于MySQL等数据库中的表),有了索引才能进行后续CRUD操作.索引托管成功后,您可在控制台看到:===> Congratulations auto process index by Easy-Es is done !")]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("ul",[a("li",[s._v("后续如若索引有更新,索引重建,更新,数据迁移等工作默认都由EE自动帮您完成,当然您也可以通过配置关闭索引自动托管,可通过EE提供的API手动维护或es-head等插件维护.")]),s._v(" "),a("li",[s._v("自动托管模式(0.9.9+版本支持),相关配置及详细介绍可在后面章节中看到,此处您只管将这些烦人的步骤交给EE去自动处理即可.")]),s._v(" "),a("li",[s._v("若您EE版本低于该版本,可通过EE提供的API手动维护索引")])])]),s._v(" "),a("h2",{attrs:{id:"开始使用-crud"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#开始使用-crud"}},[s._v("#")]),s._v(" 开始使用(CRUD)")]),s._v(" "),a("p",[s._v("添加测试类,进行功能测试:")]),s._v(" "),a("blockquote",[a("p",[s._v("测试新增: 新增一条数据(相当于MySQL中的Insert操作)")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testInsert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 测试插入数据")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" document "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"推*技术过硬"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("insert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("blockquote",[a("p",[s._v("测试查询:根据条件查询指定数据(相当于MySQL中的Select操作)")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testSelect")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 测试查询")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" title "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" document "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectOne")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Assert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("assertEquals")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("blockquote",[a("p",[s._v("测试更新:更新数据(相当于MySQL中的Update操作)")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testUpdate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 测试更新 更新有两种情况 分别演示如下:")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// case1: 已知id, 根据id更新 (为了演示方便,此id是从上一步查询中复制过来的,实际业务可以自行查询)")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" id "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"krkvN30BUP1SGucenZQ9"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" title1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"隔壁老王"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" document1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("title1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("document1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// case2: id未知, 根据条件更新")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsUpdateWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsUpdateWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("title1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" document2 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"隔壁老李"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"推*技术过软"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("update")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("document2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 关于case2 还有另一种省略实体的简单写法,这里不演示,后面章节有介绍,语法与MP一致")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br")])]),a("p",[s._v("经过一顿猛如虎的更新操作 我们来看看标题最终变成了什么?")]),s._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/bdb9bbeb-70e2-46ac-9229-3a36f1001987.png",alt:"image.png"}})]),s._v(" "),a("p",[s._v('查询结果证实了我们更新没有问题,这里无意冒犯"老李",仅供演示,如有得罪,请海涵.')]),s._v(" "),a("blockquote",[a("p",[s._v("测试删除:删除数据(相当于MySQL中的Delete操作)")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testDelete")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 测试删除数据 删除有两种情况:根据id删或根据条件删")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 鉴于根据id删过于简单,这里仅演示根据条件删,以老李的名义删,让老李心理平衡些")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" title "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"隔壁老李"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" successCount "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("delete")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("successCount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("p",[s._v("上面完整的代码示例请移步:"),a("a",{attrs:{href:"https://gitee.com/easy-es/easy-es/tree/master/easy-es-sample/src/test/java/com/xpc/easyes/sample/test",target:"_blank",rel:"noopener noreferrer"}},[s._v("Easy-Es-Sample"),a("OutboundLink")],1)])]),s._v(" "),a("h2",{attrs:{id:"小结"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#小结"}},[s._v("#")]),s._v(" 小结")]),s._v(" "),a("p",[s._v("通过以上几个简单的步骤,我们就实现了 Document的索引创建及CRUD 功能,最终也帮老李洗白了.\n从以上步骤中,我们可以看到集成Easy-Es非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。\n但Easy-Es 的强大远不止这些功能,想要详细了解 Easy-Es 的强大功能?那就继续往下看吧!")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/12.59244a9b.js b/dist/assets/js/12.59244a9b.js new file mode 100644 index 00000000..126c3197 --- /dev/null +++ b/dist/assets/js/12.59244a9b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{328:function(t,s,a){"use strict";a.r(s);var n=a(6),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("强烈推荐")]),t._v(" "),a("p",[t._v("本Demo演示Easy-Es与Springboot项目无缝集成,强烈建议先下载,直接在您本地运行,避免自己集成时因springboot等版本兼容问题踩坑.")]),t._v(" "),a("p",[t._v("Demo下载地址: ✔"),a("a",{attrs:{href:"https://gitee.com/easy-es/easy-es-springboot-demo",target:"_blank",rel:"noopener noreferrer"}},[t._v("Gitee"),a("OutboundLink")],1),t._v(" | ✔ "),a("a",{attrs:{href:"https://github.com/xpc1024/easy-es-springboot-demo",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github"),a("OutboundLink")],1)])]),t._v(" "),a("h1",{attrs:{id:"demo介绍"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#demo介绍"}},[t._v("#")]),t._v(" Demo介绍")]),t._v(" "),a("h2",{attrs:{id:"_1-项目结构"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-项目结构"}},[t._v("#")]),t._v(" 1.项目结构")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/e562a309-8526-4964-9250-b87ad02545e0.png",alt:"1"}})]),t._v(" "),a("br"),t._v("\n为了演示方便,本demo省略service层\n"),a("h2",{attrs:{id:"_2-pom"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-pom"}},[t._v("#")]),t._v(" 2.Pom")]),t._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("xmlns")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://maven.apache.org/POM/4.0.0"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("schemaLocation")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("modelVersion")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("4.0.0"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("parent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.springframework.boot"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("spring-boot-starter-parent"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("2.6.0"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("relativePath")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- lookup parent from repository --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("com.example"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("ee-use"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("0.0.1-SNAPSHOT"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("ee-use"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("description")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Demo project for Spring Boot"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("java.version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.8"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencies")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.springframework.boot"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("spring-boot-starter-web"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("io.github.xpc1024"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("easy-es-boot-starter"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Latest version"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.springframework.boot"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("spring-boot-starter-test"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("scope")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("test"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("plugins")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("plugin")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.springframework.boot"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("spring-boot-maven-plugin"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br"),a("span",{staticClass:"line-number"},[t._v("25")]),a("br"),a("span",{staticClass:"line-number"},[t._v("26")]),a("br"),a("span",{staticClass:"line-number"},[t._v("27")]),a("br"),a("span",{staticClass:"line-number"},[t._v("28")]),a("br"),a("span",{staticClass:"line-number"},[t._v("29")]),a("br"),a("span",{staticClass:"line-number"},[t._v("30")]),a("br"),a("span",{staticClass:"line-number"},[t._v("31")]),a("br"),a("span",{staticClass:"line-number"},[t._v("32")]),a("br"),a("span",{staticClass:"line-number"},[t._v("33")]),a("br"),a("span",{staticClass:"line-number"},[t._v("34")]),a("br"),a("span",{staticClass:"line-number"},[t._v("35")]),a("br"),a("span",{staticClass:"line-number"},[t._v("36")]),a("br"),a("span",{staticClass:"line-number"},[t._v("37")]),a("br"),a("span",{staticClass:"line-number"},[t._v("38")]),a("br"),a("span",{staticClass:"line-number"},[t._v("39")]),a("br"),a("span",{staticClass:"line-number"},[t._v("40")]),a("br"),a("span",{staticClass:"line-number"},[t._v("41")]),a("br"),a("span",{staticClass:"line-number"},[t._v("42")]),a("br"),a("span",{staticClass:"line-number"},[t._v("43")]),a("br"),a("span",{staticClass:"line-number"},[t._v("44")]),a("br"),a("span",{staticClass:"line-number"},[t._v("45")]),a("br"),a("span",{staticClass:"line-number"},[t._v("46")]),a("br"),a("span",{staticClass:"line-number"},[t._v("47")]),a("br"),a("span",{staticClass:"line-number"},[t._v("48")]),a("br")])]),a("h2",{attrs:{id:"_3-核心代码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_3-核心代码"}},[t._v("#")]),t._v(" 3.核心代码")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@RestController")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@RequiredArgsConstructor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("onConstructor "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@__")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Autowired")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestUseEeController")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DocumentMapper")]),t._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@GetMapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/insert"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("insert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 初始化-> 新增数据")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" document "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"推*技术过硬"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("insert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@GetMapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/search"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("search")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 查询出所有标题为老汉的文档列表")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br")])]),a("h2",{attrs:{id:"_4-启动及使用"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_4-启动及使用"}},[t._v("#")]),t._v(" 4.启动及使用")]),t._v(" "),a("h3",{attrs:{id:"a-添加配置信息"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#a-添加配置信息"}},[t._v("#")]),t._v(" a.添加配置信息")]),t._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("easy-es")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("enable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[t._v("true")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 默认为true,若为false时,则认为不启用本框架")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("address")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" 127.0.0.0"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("9200")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#填你的es连接地址")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# username: 有设置才填写,非必须")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# password: 有设置才填写,非必须")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br")])]),a("h3",{attrs:{id:"b-启动项目"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#b-启动项目"}},[t._v("#")]),t._v(" b.启动项目")]),t._v(" "),a("p",[t._v("使用你的IDE启动项目\n"),a("br")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/b6d12f86-58db-45ad-af05-29ab9b398614.png",alt:"image.png"}})]),t._v(" "),a("p",[t._v("如果你的配置正确,ES版本及Springboot版本均兼容,你将看到ES索引被框架自动创建,并在控制台输出:\n===> Congratulations auto process index by Easy-Es is done !")]),t._v(" "),a("h3",{attrs:{id:"c-使用"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#c-使用"}},[t._v("#")]),t._v(" c.使用")]),t._v(" "),a("p",[a("a",{attrs:{href:"http://localhost:8080/insert",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8080/insert"),a("OutboundLink")],1),t._v(" (插入数据)")]),t._v(" "),a("p",[a("a",{attrs:{href:"http://localhost:8080/search",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8080/search"),a("OutboundLink")],1),t._v(" (查询)")]),t._v(" "),a("p",[t._v("效果图:\n"),a("br"),t._v(" "),a("img",{attrs:{src:"https://iknow.hs.net/903287b2-f683-4335-a29a-6b58418b6950.png",alt:"image.png"}}),a("br")]),t._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/0c9dd4f1-1b56-4d1a-ba39-cc3bf51d87a3.png",alt:"image.png"}})]),t._v(" "),a("h2",{attrs:{id:"_5-结语"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_5-结语"}},[t._v("#")]),t._v(" 5.结语")]),t._v(" "),a("p",[t._v("至此,您已初步体验Easy-Es的基本功能,如果你感觉使用起来体验还不错,想进一步体验更多强大功能,那就继续往下看吧!")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/13.9a702316.js b/dist/assets/js/13.9a702316.js new file mode 100644 index 00000000..e354a2da --- /dev/null +++ b/dist/assets/js/13.9a702316.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{332:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("p",[a("strong",[s._v("基础配置:")])]),s._v(" "),a("p",[s._v("如果缺失可导致项目无法正常启动,其中账号密码可缺省.")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("easy-es")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 是否开启EE自动配置")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("address")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 127.0.0.1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9200")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("schema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" http "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 默认为http")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" elastic "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#如果无账号密码则可不配置此行")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" WG7WVmuNMtM4GwNYkyWH "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#如果无账号密码则可不配置此行")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[a("strong",[s._v("拓展配置:")])]),s._v(" "),a("p",[s._v("可缺省,不影响项目启动,为了提高生产环境性能,建议您按需配置")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("easy-es")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("keep-alive-millis")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("18000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 心跳策略时间 单位:ms")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("connectTimeout")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 连接超时时间 单位:ms")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("socketTimeout")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 通信超时时间 单位:ms")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("requestTimeout")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 请求超时时间 单位:ms")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("connectionRequestTimeout")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 连接请求超时时间 单位:ms")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxConnTotal")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 最大连接数 单位:个")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("maxConnPerRoute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 最大连接路由数 单位:个")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("p",[a("strong",[s._v("全局配置:")])]),s._v(" "),a("p",[s._v("可缺省,不影响项目启动,若缺省则为默认值")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("easy-es")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("global-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("process_index_mode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" smoothly "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#索引处理模式,smoothly:平滑模式,默认开启此模式, not_smoothly:非平滑模式, manual:手动模式")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("print-dsl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("distributed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁.")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("db-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("map-underscore-to-camel-case")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 是否开启下划线转驼峰 默认为false")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("table-prefix")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" daily_ "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 索引前缀,可用于区分环境 默认为空 用法和MP一样")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("id-type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" customize "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("field-strategy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" not_empty "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 字段更新策略 默认为not_null")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enable-track-total-hits")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 默认开启,查询若指定了size超过1w条时也会自动开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响.")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("refresh-policy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" immediate "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 数据刷新策略,默认为不刷新")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("enable-must2-filter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 是否全局开启must查询类型转换为filter查询类型 默认为false不转换")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br")])]),a("p",[a("strong",[s._v("其它配置:")])]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("logging")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("level")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("tracer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" trace "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 开启trace级别日志,在开发时可以开启此配置,则控制台可以打印es全部请求信息及DSL语句,为了避免重复,开启此项配置后,可以将EE的print-dsl设置为false.")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("banner-mode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" off "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 有用户反馈想关闭EE打印的Banner,由于EE的banner是直接覆盖springboot默认banner的,所以如需关闭,直接关闭springboot的banner即可关闭EE的banner.")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("ul",[a("li",[a("p",[s._v("id-type支持3种类型:")]),s._v(" "),a("ul",[a("li",[s._v("auto: 由ES自动生成,是默认的配置,无需您额外配置 推荐")]),s._v(" "),a("li",[s._v("uuid: 系统生成UUID,然后插入ES (不推荐)")]),s._v(" "),a("li",[s._v("customize: 用户自定义,在此类型下,用户可以将任意数据类型的id存入es作为es中的数据id,比如将mysql自增的id作为es的id,可以开启此模式,或通过@TableId(type)注解指定.")])])]),s._v(" "),a("li",[a("p",[s._v("field-strategy支持3种类型:")]),s._v(" "),a("ul",[a("li",[s._v("not_null: 非Null判断,字段值为非Null时,才会被更新")]),s._v(" "),a("li",[s._v("not_empty: 非空判断,字段值为非空字符串时才会被更新")]),s._v(" "),a("li",[s._v("ignore: 忽略判断,无论字段值为什么,都会被更新")]),s._v(" "),a("li",[s._v("在配置了全局策略后,您仍可以通过注解针对个别类进行个性化配置,全局配置的优先级是小于注解配置的")])])]),s._v(" "),a("li",[a("p",[s._v("refresh-policy支持3种策略")]),s._v(" "),a("ul",[a("li",[s._v("none: 默认策略,不刷新数据")]),s._v(" "),a("li",[s._v("immediate : 立即刷新,会损耗较多性能,对数据实时性要求高的场景下适用")]),s._v(" "),a("li",[s._v("wait_until: 请求提交数据后,等待数据完成刷新(1s),再结束请求 性能损耗适中")])])])])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/14.c7f528a4.js b/dist/assets/js/14.c7f528a4.js new file mode 100644 index 00000000..b216b07b --- /dev/null +++ b/dist/assets/js/14.c7f528a4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{330:function(t,a,s){"use strict";s.r(a);var e=s(6),n=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("本文将介绍 Easy-Es 注解包相关类详解(更多详细描述可点击查看源码注释)")]),t._v(" "),s("blockquote",[s("p",[t._v("注解类包源码:👉 "),s("a",{attrs:{href:"https://gitee.com/dromara/easy-es/tree/master/easy-es-annotation",target:"_blank",rel:"noopener noreferrer"}},[t._v("easy-es-annotation"),s("OutboundLink")],1)])]),t._v(" "),s("h2",{attrs:{id:"esmapperscan"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#esmapperscan"}},[t._v("#")]),t._v(" "),s("a",{attrs:{href:"https://gitee.com/dromara/easy-es/blob/master/easy-es-boot-starter/src/main/java/cn/easyes/starter/register/EsMapperScan.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("@EsMapperScan"),s("OutboundLink")],1)]),t._v(" "),s("ul",[s("li",[s("p",[t._v("描述:mapper扫描注解,功能与MP的@MapperScan一致")])]),t._v(" "),s("li",[s("p",[t._v("使用位置:Springboot启动类")])])]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@EsMapperScan")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cn.easy-es-mapper"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Application")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 省略其它...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br")])]),s("table",[s("thead",[s("tr",[s("th",[t._v("属性")]),t._v(" "),s("th",[t._v("类型")]),t._v(" "),s("th",[t._v("必须指定")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("描述")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("value")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("是")]),t._v(" "),s("td",[t._v('""')]),t._v(" "),s("td",[t._v("自定义mapper所在包全路径")])])])]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("温馨提示")]),t._v(" "),s("p",[t._v("由于EE和MP对Mapper的扫描都是采用Springboot的doScan,而且两套系统互相独立,所以在扫描的时候没有办法互相隔离,因此如果您的项目同时有用到EE和MP,您需要将EE的Mapper和MP的Mapper放在不同的包下,否则项目将无法正常启动。")])]),t._v(" "),s("h2",{attrs:{id:"indexname"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#indexname"}},[t._v("#")]),t._v(" "),s("a",{attrs:{href:"https://gitee.com/dromara/easy-es/blob/master/easy-es-annotation/src/main/java/cn/easyes/annotation/IndexName.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("@IndexName"),s("OutboundLink")],1)]),t._v(" "),s("ul",[s("li",[s("p",[t._v("描述:索引名注解,标识实体类对应的索引 对应MP的@TableName注解,在v0.9.40之前此注解为@TableName.")])]),t._v(" "),s("li",[s("p",[t._v("使用位置:实体类")])])]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@IndexName")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 省略其它字段")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br")])]),s("table",[s("thead",[s("tr",[s("th",[t._v("属性")]),t._v(" "),s("th",[t._v("类型")]),t._v(" "),s("th",[t._v("必须指定")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("描述")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("value")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v('""')]),t._v(" "),s("td",[t._v("索引名,可简单理解为MySQL表名")])]),t._v(" "),s("tr",[s("td",[t._v("shardsNum")]),t._v(" "),s("td",[t._v("int")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("1")]),t._v(" "),s("td",[t._v("索引分片数")])]),t._v(" "),s("tr",[s("td",[t._v("replicasNum")]),t._v(" "),s("td",[t._v("int")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("1")]),t._v(" "),s("td",[t._v("索引副本数")])]),t._v(" "),s("tr",[s("td",[t._v("aliasName")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v('""')]),t._v(" "),s("td",[t._v("索引别名")])]),t._v(" "),s("tr",[s("td",[t._v("keepGlobalPrefix")]),t._v(" "),s("td",[t._v("boolean")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("false")]),t._v(" "),s("td",[t._v("是否保持使用全局的 tablePrefix 的值,与MP用法一致")])]),t._v(" "),s("tr",[s("td",[t._v("child")]),t._v(" "),s("td",[t._v("boolean")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("false")]),t._v(" "),s("td",[t._v("是否子文档")])]),t._v(" "),s("tr",[s("td",[t._v("childClass")]),t._v(" "),s("td",[t._v("Class")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("DefaultChildClass.class")]),t._v(" "),s("td",[t._v("父子文档-子文档类")])])])]),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v("动态索引名称支持")]),t._v("\n如果你的索引名称是不固定的,我们提供了两种方式可修改CRUD时的索引名称")]),t._v(" "),s("ul",[s("li",[t._v("调用mapper.setCurrentActiveIndex(String indexName)方法,此处的mapper为你自定义的mapper,如documentMapper,通过此API修改索引名称后,全局生效.")]),t._v(" "),s("li",[t._v("在对应的参数中指定当前操作作用的索引,例如 wrapper.index(String indexName),通过此API修改索引名称后,仅作用于该wrapper对应的操作,粒度最细.")])])]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("温馨提示")]),t._v(" "),s("ul",[s("li",[t._v("当您想直接把类名当作索引名,且并不需要对索引进行其它配置时,可省略此注解")]),t._v(" "),s("li",[t._v("通过注解指定的索引名称优先级最高,指定了注解索引,则全局配置和自动生成索引不生效,采用注解中指定的索引名称. 优先级排序: 注解索引>全局配置索引前缀>自动生成")]),t._v(" "),s("li",[t._v("keepGlobalPrefix选项,(0.9.4+版本才支持)默认值为false,是否保持使用全局的 tablePrefix 的值:\n"),s("ul",[s("li",[t._v("既配置了全局tablePrefix,@TableName注解又指定了value值时,此注解选项才会生效,如果其值为true,则框架最终使用的索引名称为:全局tablePrefix+此注解的value,例如:dev_document.")]),t._v(" "),s("li",[t._v("此注解选项用法和MP中保持一致.")])])]),t._v(" "),s("li",[t._v("其中shardNum为分片数,replicasNum为副本数,如果不指定,默认值均为1")])])]),t._v(" "),s("h2",{attrs:{id:"indexid"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#indexid"}},[t._v("#")]),t._v(" "),s("a",{attrs:{href:"https://gitee.com/dromara/easy-es/blob/master/easy-es-annotation/src/main/java/cn/easyes/annotation/IndexId.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("@IndexId"),s("OutboundLink")],1)]),t._v(" "),s("ul",[s("li",[t._v("描述:ES主键注解,在v0.9.40之前此注解为@TableId.")]),t._v(" "),s("li",[t._v("使用位置:实体类中被作为ES主键的字段, 对应MP的@TableId注解")])]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@IndexId")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 省略其它字段")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br")])]),s("table",[s("thead",[s("tr",[s("th",[t._v("属性")]),t._v(" "),s("th",[t._v("类型")]),t._v(" "),s("th",[t._v("必须指定")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("描述")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("value")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v('"_id"')]),t._v(" "),s("td",[t._v("主键字段名")])]),t._v(" "),s("tr",[s("td",[t._v("type")]),t._v(" "),s("td",[t._v("Enum")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("IdType.NONE")]),t._v(" "),s("td",[t._v("指定主键类型")])])])]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("温馨提示")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("当您字段命名为id且类型为String时,且不需要采用UUID及自定义ID类型时,可省略此注解")])]),t._v(" "),s("li",[s("strong",[t._v("由于es对id的默认名称做了处理(下划线+id):_id,所以EE已为您屏蔽这步操作,您无需在注解中指定,框架也会自动帮您完成映射.")])]),t._v(" "),s("li",[s("strong",[t._v("Id的生成类型支持以下几种:")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("IdType.AUTO:")]),t._v(" 由ES自动生成,是默认的配置,无需您额外配置 推荐")]),t._v(" "),s("li",[s("strong",[t._v("IdType.UUID:")]),t._v(" 系统生成UUID,然后插入ES (不推荐)")]),t._v(" "),s("li",[s("strong",[t._v("IdType.CUSTOMIZE:")]),t._v(" 由用户自定义,用户自己对id值进行set,如果用户指定的id在es中不存在,则在insert时就会新增一条记录,如果用户指定的id在es中已存在记录,则自动更新该id对应的记录.")])])])]),t._v(" "),s("p",[s("strong",[t._v("优先级:")]),t._v(" 注解配置的Id生成策略>全局配置的Id生成策略")])]),t._v(" "),s("h2",{attrs:{id:"indexfield"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#indexfield"}},[t._v("#")]),t._v(" "),s("a",{attrs:{href:"https://gitee.com/dromara/easy-es/blob/master/easy-es-annotation/src/main/java/cn/easyes/annotation/IndexField.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("@IndexField"),s("OutboundLink")],1)]),t._v(" "),s("ul",[s("li",[t._v("描述:ES字段注解, 对应MP的@TableField注解,在v0.9.40之前此注解为@TableField")]),t._v(" "),s("li",[t._v("使用位置:实体类中被作为ES索引字段的字段")]),t._v(" "),s("li",[t._v("使用场景举例:")])]),t._v(" "),s("ol",[s("li",[t._v("实体类中的字段并非ES中实际的字段,比如把实体类直接当DTO用了,加了一些ES中并不存在的无关字段,此时可以标记此字段,以便让EE框架跳过此字段,对此字段不处理.")]),t._v(" "),s("li",[t._v("字段的更新策略,比如在调用更新接口时,实体类的字段非Null或者非空字符串时才更新,此时可以加字段注解,对指定字段标记更新策略.")]),t._v(" "),s("li",[t._v('对指定字段进行自定义命名,比如该字段在es中叫wu-la,但在实体model中叫ula,此时可以在value中指定value="wu-la".')]),t._v(" "),s("li",[t._v("在自动托管索引模式下,可指定索引分词器及索引字段类型.")]),t._v(" "),s("li",[t._v("在自动托管索引模式下,可指定索引中日期的format格式.")]),t._v(" "),s("li",[t._v("...")])]),t._v(" "),s("p",[t._v("使用示例:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 此处省略其它字段... ")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 场景一:标记es中不存在的字段")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@TableField")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exist "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" notExistsField"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 场景二:更新时,此字段非空字符串才会被更新")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@TableField")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("strategy "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FieldStrategy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("NOT_EMPTY"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" creator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 场景三:自定义字段名")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@TableField")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wu-la"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" ula"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 场景四:支持日期字段在es索引中的format类型")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@TableField")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fieldType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FieldType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("DATE"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dateFormat "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" gmtCreate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 场景五:支持指定字段在es索引中的分词器类型")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@TableField")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fieldType "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FieldType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TEXT"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" analyzer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Analyzer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("IK_SMART"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" searchAnalyzer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Analyzer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("IK_MAX_WORD"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" content"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br")])]),s("table",[s("thead",[s("tr",[s("th",[t._v("属性")]),t._v(" "),s("th",[t._v("类型")]),t._v(" "),s("th",[t._v("必须指定")]),t._v(" "),s("th",[t._v("默认值")]),t._v(" "),s("th",[t._v("描述")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("value")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v('""')]),t._v(" "),s("td",[t._v("字段名")])]),t._v(" "),s("tr",[s("td",[t._v("exist")]),t._v(" "),s("td",[t._v("boolean")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("true")]),t._v(" "),s("td",[t._v("字段是否存在")])]),t._v(" "),s("tr",[s("td",[t._v("fieldType")]),t._v(" "),s("td",[t._v("Enum")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("FieldType.NONE")]),t._v(" "),s("td",[t._v("字段在es索引中的类型")])]),t._v(" "),s("tr",[s("td",[t._v("analyzer")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("Analyzer.NONE")]),t._v(" "),s("td",[t._v("索引文档时用的分词器")])]),t._v(" "),s("tr",[s("td",[t._v("searchAnalyzer")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("Analyzer.NONE")]),t._v(" "),s("td",[t._v("查询分词器")])]),t._v(" "),s("tr",[s("td",[t._v("strategy")]),t._v(" "),s("td",[t._v("Enum")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("FieldStrategy.DEFAULT")]),t._v(" "),s("td",[t._v("字段验证策略")])]),t._v(" "),s("tr",[s("td",[t._v("dateFormat")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v('""')]),t._v(" "),s("td",[t._v("es索引中的日期格式,如yyyy-MM-dd")])]),t._v(" "),s("tr",[s("td",[t._v("nestedClass")]),t._v(" "),s("td",[t._v("Class")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("DefaultNestedClass.class")]),t._v(" "),s("td",[t._v("嵌套类")])]),t._v(" "),s("tr",[s("td",[t._v("parentName")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v('""')]),t._v(" "),s("td",[t._v("父子文档-父名称")])]),t._v(" "),s("tr",[s("td",[t._v("childName")]),t._v(" "),s("td",[t._v("String")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v('""')]),t._v(" "),s("td",[t._v("父子文档-子名称")])]),t._v(" "),s("tr",[s("td",[t._v("joinFieldClass")]),t._v(" "),s("td",[t._v("Class")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("JoinField.class")]),t._v(" "),s("td",[t._v("父子文档-父子类型关系字段类")])])])]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("温馨提示")]),t._v(" "),s("ul",[s("li",[t._v("更新策略一共有3种:\n"),s("ul",[s("li",[t._v("NOT_NULL: 非Null判断,字段值为非Null时,才会被更新")]),t._v(" "),s("li",[t._v("NOT_EMPTY: 非空判断,字段值为非空字符串时才会被更新")]),t._v(" "),s("li",[t._v("IGNORE: 忽略判断,无论字段值为什么,都会被更新")])])])]),t._v(" "),s("p",[t._v("其中场景四和场景五仅在索引自动托管模式下生效,如果开启了手动处理索引模式,则需要用户通过手动调用我提供的API传入相应的分词器及日期格式化参数进行索引的创建/更新.")])]),t._v(" "),s("h2",{attrs:{id:"其它注解"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#其它注解"}},[t._v("#")]),t._v(" 其它注解")]),t._v(" "),s("p",[t._v("除了上面这几个高频注解,项目中偶尔还会用到一些其它注解,比如高亮注解@HighLight,比如拦截器注解@Intercepts等注解,我们会在后面具体的章节详细介绍,此处仅列出几个必须掌握的注解,其它注解按需学习即可。")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/15.60d6541f.js b/dist/assets/js/15.60d6541f.js new file mode 100644 index 00000000..49555d38 --- /dev/null +++ b/dist/assets/js/15.60d6541f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{335:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("前言")]),s._v(" "),a("p",[s._v('ES难用,索引首当其冲,索引的创建不仅复杂,而且难于维护,一旦索引有变动,就必须面对索引重建带来的服务停机和数据丢失等问题... 尽管ES官方提供了索引别名机制来解决问题,但门槛依旧很高,步骤繁琐,在生产环境中由人工操作非常容易出现失误带来严重的问题. 为了解决这些痛点,Easy-Es提供了多种策略,将用户彻底从索引的维护中解放出来,我们提供了多种索引处理策略,来满足不同用户的个性化需求. 通过对索引的初体验,相信您也可以更深体会到EE的成熟度和易用性. 其中全自动平滑模式,首次采用全球领先的"哥哥你不用动,EE我全自动"的模式,索引的创建,更新,数据迁移等所有全生命周期均无需用户介入,由EE全自动完成,过程零停机,连索引类型都可智能自动推断,一条龙服务,包您满意.是全球开源首创,充分借鉴了JVM垃圾回收算法思想,史无前例,尽管网上已有平滑过渡方案,但并非全自动,过程依旧靠人工介入,我为EE代言,请放心将索引托管给EE,索引只有在彻底迁移成功才会删除旧索引,否则均不会对原有索引和数据造成影响,发生任何意外均能保留原索引和数据,所以安全系数很高.')])]),s._v(" "),a("blockquote",[a("p",[s._v("温馨提示:新手上路可尽量选择自动挡模式,老司机自动挡手动挡您请随意~")])]),s._v(" "),a("h2",{attrs:{id:"模式一-自动托管之平滑模式-自动挡-雪地模式-默认开启此模式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#模式一-自动托管之平滑模式-自动挡-雪地模式-默认开启此模式"}},[s._v("#")]),s._v(" 模式一:自动托管之平滑模式(自动挡-雪地模式) 默认开启此模式")]),s._v(" "),a("blockquote",[a("p",[s._v("在此模式下,索引的创建更新数据迁移等全生命周期用户均不需要任何操作即可完成,过程零停机,用户无感知,可实现在生产环境的平滑过渡,类似汽车的自动档-雪地模式,平稳舒适,彻底解放用户,尽情享受自动架势的乐趣!\n需要值得特别注意的是,在自动托管模式下,系统会自动生成一条名为ee-distribute-lock的索引,该索引为框架内部使用,用户可忽略,若不幸因断电等其它因素极小概率下发生死锁,可删除该索引即可.另外,在使用时如碰到索引变更,原索引名称可能会被追加后缀_s0或_s1,不必慌张,这是全自动平滑迁移零停机的必经之路,索引后缀不影响使用,框架会自动激活该新索引.关于_s0和_s1后缀,在此模式下无法避免,因为要保留原索引数据迁移,又不能同时存在两个同名索引,凡是都是要付出代价的,如果您不认可此种处理方式,可继续往下看,总有一种适合您。")])]),s._v(" "),a("p",[s._v("其核心处理流程梳理如下图所示:\n"),a("img",{attrs:{src:"https://iknow.hs.net/c6cd0fb8-93ce-437b-ac4e-36522e378d04.png",alt:"平滑模式.png"}})]),s._v(" "),a("h2",{attrs:{id:"模式二-自动托管之非平滑模式-自动挡-运动模式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#模式二-自动托管之非平滑模式-自动挡-运动模式"}},[s._v("#")]),s._v(" 模式二:自动托管之非平滑模式(自动挡-运动模式)")]),s._v(" "),a("p",[s._v("在此模式下,索引额创建及更新由EE全自动异步完成,但不处理数据迁移工作,速度极快类似汽车的自动挡-运动模式,简单粗暴,弹射起步! 适合在开发及测试环境使用,当然如果您使用logstash等其它工具来同步数据,亦可在生产环境开启此模式,在此模式下不会出现_s0和_s1后缀,索引会保持原名称.")]),s._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/0b1b4d41-cac5-410f-bae1-9a0b3557da75.png",alt:"非平滑模式.png"}})]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("p",[s._v("以上两种自动模式中,索引信息主要依托于实体类,如果用户未对该实体类进行任何配置,EE依然能够根据字段类型智能推断出该字段在ES中的存储类型,此举可进一步减轻开发者负担,对刚接触ES的小白更是福音.")]),s._v(" "),a("p",[s._v("当然,仅靠框架自动推断是不够的,我们仍然建议您在使用中尽量进行详细的配置,以便框架能自动创建出生产级的索引.举个例子,例如String类型字段,框架无法推断出您实际查询中对该字段是精确查询还是分词查询,所以它无法推断出该字段到底用keyword类型还是text类型,倘若是text类型,用户期望的分词器是什么? 这些都需要用户通过配置告诉框架,否则框架只能按默认值进行创建,届时将不能很好地完成您的期望.")]),s._v(" "),a("p",[s._v("自动推断类型的优先级 < 用户通过注解指定的类型优先级")])]),s._v(" "),a("p",[s._v("自动推断映射表:")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("JAVA")]),s._v(" "),a("th",[s._v("ES")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[s._v("byte")]),s._v(" "),a("td",[s._v("byte")])]),s._v(" "),a("tr",[a("td",[s._v("short")]),s._v(" "),a("td",[s._v("short")])]),s._v(" "),a("tr",[a("td",[s._v("int")]),s._v(" "),a("td",[s._v("integer")])]),s._v(" "),a("tr",[a("td",[s._v("long")]),s._v(" "),a("td",[s._v("long")])]),s._v(" "),a("tr",[a("td",[s._v("float")]),s._v(" "),a("td",[s._v("float")])]),s._v(" "),a("tr",[a("td",[s._v("double")]),s._v(" "),a("td",[s._v("double")])]),s._v(" "),a("tr",[a("td",[s._v("BigDecimal")]),s._v(" "),a("td",[s._v("keyword")])]),s._v(" "),a("tr",[a("td",[s._v("char")]),s._v(" "),a("td",[s._v("keyword")])]),s._v(" "),a("tr",[a("td",[s._v("String")]),s._v(" "),a("td",[s._v("keyword")])]),s._v(" "),a("tr",[a("td",[s._v("boolean")]),s._v(" "),a("td",[s._v("boolean")])]),s._v(" "),a("tr",[a("td",[s._v("Date")]),s._v(" "),a("td",[s._v("date")])]),s._v(" "),a("tr",[a("td",[s._v("LocalDate")]),s._v(" "),a("td",[s._v("date")])]),s._v(" "),a("tr",[a("td",[s._v("LocalDateTime")]),s._v(" "),a("td",[s._v("date")])]),s._v(" "),a("tr",[a("td",[s._v("List")]),s._v(" "),a("td",[s._v("text")])]),s._v(" "),a("tr",[a("td",[s._v("...")]),s._v(" "),a("td",[s._v("...")])])])]),s._v(" "),a("blockquote",[a("p",[s._v('"自动挡"模式下的最佳实践示例:')])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Data")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("shardsNum "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("replicasNum "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 可指定分片数,副本数,若缺省则默认均为1")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * es中的唯一id,如果你想自定义es中的id为你提供的id,比如MySQL中的id,请将注解中的type指定为customize,如此id便支持任意数据类型)\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("type "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IdType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("CUSTOMIZE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Long")]),s._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 文档标题,不指定类型默认被创建为keyword类型,可进行精确查询\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 文档内容,指定了类型及存储/查询分词器\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@HighLight")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mappingField"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"highlightContent"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fieldType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("TEXT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" analyzer "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Analyzer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("IK_SMART"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" searchAnalyzer "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Analyzer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("IK_MAX_WORD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 作者 加@TableField注解,并指明strategy = FieldStrategy.NOT_EMPTY 表示更新的时候的策略为 创建者不为空字符串时才更新\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("strategy "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldStrategy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("NOT_EMPTY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" creator"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 创建时间\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fieldType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("DATE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" dateFormat "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" gmtCreate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * es中实际不存在的字段,但模型中加了,为了不和es映射,可以在此类型字段上加上 注解@TableField,并指明exist=false\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("exist "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" notExistsField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('/**\n * 地理位置经纬度坐标 例如: "40.13933715136454,116.63441990026217"\n */')]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fieldType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("GEO_POINT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" location"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 图形(例如圆心,矩形)\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fieldType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("GEO_SHAPE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" geoLocation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 自定义字段名称\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"wu-la"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" customField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 高亮返回值被映射的字段\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" highlightContent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br")])]),a("h2",{attrs:{id:"模式三-手动模式-手动挡"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#模式三-手动模式-手动挡"}},[s._v("#")]),s._v(" 模式三:手动模式(手动挡)")]),s._v(" "),a("p",[s._v("在此模式下,索引的所有维护工作EE框架均不介入,由用户自行处理,EE提供了开箱即用的索引CRUD相关API,您可以选择使用该API手动维护索引,由于API高度完善,尽管是手动挡,但使用起来依旧简单到爆,一行代码搞定索引创建.当然您亦可通过es-head等工具来维护索引,总之在此模式下,您拥有更高的自由度,比较适合那些质疑EE框架的保守用户或追求极致灵活度的用户使用,类似汽车的手动挡,新手不建议使用此模式,老司机请随便.")]),s._v(" "),a("blockquote",[a("p",[s._v("手动挡模式下,EE提供了如下API,供用户进行便捷调用:")]),s._v(" "),a("ul",[a("li",[s._v("indexName需要用户手动指定")]),s._v(" "),a("li",[s._v("对象 Wrapper 为 条件构造器")])])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 获取索引信息")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GetIndexResponse")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 获取指定索引信息")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GetIndexResponse")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 是否存在索引")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("existsIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据实体及自定义注解一键创建索引")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("createIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 创建索引")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("createIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 更新索引")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 删除指定索引")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("deleteIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br")])]),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/3faa18ce-c39f-44d5-b0e5-244b4828df3e.png",alt:"手动模式.png"}})]),s._v(" "),a("blockquote",[a("p",[s._v("上述API,我们仅演示创建索引,其它过于简单,不在这里赘述,如有需要可移步至源码test模块查看.\n通过API手动创建索引,我们提供了两种方式")])]),s._v(" "),a("p",[s._v("-方式一:根据实体类及自定义注解一键创建(推荐),99.9%场景适用")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 实体类信息\n**/")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Data")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("shardsNum "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" replicasNum "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" keepGlobalPrefix "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * es中的唯一id,如果你想自定义es中的id为你提供的id,比如MySQL中的id,请将注解中的type指定为customize或直接在全局配置文件中指定,如此id便支持任意数据类型)\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("type "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IdType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("CUSTOMIZE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 文档标题,不指定类型默认被创建为keyword类型,可进行精确查询\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 文档内容,指定了类型及存储/查询分词器\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@HighLight")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mappingField "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"highlightContent"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@IndexField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fieldType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("TEXT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" analyzer "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Analyzer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("IK_SMART"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" searchAnalyzer "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Analyzer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("IK_MAX_WORD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略其它字段...")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br")])]),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testCreateIndexByEntity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 然后通过该实体类的mapper直接一键创建,非常傻瓜级")]),s._v("\n documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("createIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("p",[s._v("实体类中的注解用法可参考注解章节,整体比较傻瓜级,和MP中的注解用法高度相似.")])]),s._v(" "),a("p",[s._v("-方式二:通过api创建,每个需要被索引的字段都需要处理,比较繁琐,但灵活性最好,支持所有es能支持的所有索引创建,供0.01%场景使用(不推荐)")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testCreatIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 此处简单起见 索引名称须保持和实体类名称一致,字母小写 后面章节会教大家更如何灵活配置和使用索引")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("indexName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getSimpleName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("toLowerCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 此处将文章标题映射为keyword类型(不支持分词),文档内容映射为text类型,可缺省")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 支持分词查询,内容分词器可指定,查询分词器也可指定,,均可缺省或只指定其中之一,不指定则为ES默认分词器(standard)")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("mapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("KEYWORD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("mapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("TEXT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Analyzer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("IK_MAX_WORD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Analyzer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("IK_MAX_WORD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 如果上述简单的mapping不能满足你业务需求,可自定义mapping")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// wrapper.mapping(Map);")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 设置分片及副本信息,3个shards,2个replicas,可缺省")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("settings")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 如果上述简单的settings不能满足你业务需求,可自定义settings")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// wrapper.settings(Settings);")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 设置别名信息,可缺省")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" aliasName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"daily"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("createAlias")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("aliasName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 创建索引")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" isOk "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("createIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Assert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("assertTrue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("isOk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("p",[s._v("实体类中,id字段不需要创建索引,否则会报错.")]),s._v(" "),a("p",[s._v("由于ES索引改动自动重建的特性,因此本接口设计时将创建索引所需的mapping,settings,alias信息三合一了,尽管其中每一项配置都可缺省,但我们仍建议您在创建索引前提前规划好以上信息,可以规避后续修改带来的不必要麻烦,若后续确有修改,您仍可以通过别名迁移的方式(推荐,可平滑过渡),或删除原索引重新创建的方式进行修改.")])]),s._v(" "),a("h2",{attrs:{id:"配置启用模式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置启用模式"}},[s._v("#")]),s._v(" 配置启用模式")]),s._v(" "),a("p",[s._v("以上三种模式的配置,您只需要在您项目的配置文件application.properties或application.yml中加入一行配置即可:")]),s._v(" "),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("easy-es")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("global-config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("process_index_mode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" smoothly "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#smoothly:平滑模式, not_smoothly:非平滑模式, manual:手动模式")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("async-process-index-blocking")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 异步处理索引是否阻塞主线程 默认阻塞")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("distributed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 项目是否分布式环境部署,默认为true, 如果是单机运行可填false,将不加分布式锁,效率更高.")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("若缺省此行配置,则默认开启平滑模式.")]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("ul",[a("li",[s._v("运行测试模块时强烈建议开启异步处理索引阻塞主线程,否则测试用例跑完后,主线程退出,但异步线程可能还没跑完,可能出现死锁,若不幸出现死锁,删除ee-distribute-lock即可.")]),s._v(" "),a("li",[s._v("生产环境或迁移数据量比较大的情况下,可以配置开启非阻塞,这样服务启动更快.")]),s._v(" "),a("li",[s._v("以上三种模式,用户可根据实际需求灵活选择,自由体验,在使用过程中如有任何意见或建议可反馈给我们,我们将持续优化和改进,")]),s._v(" "),a("li",[s._v("EE在索引托管采用了策略+工厂设计模式,未来如果有更多更优模式,可以在不改动原代码的基础上轻松完成拓展,符合开闭原则,也欢迎各路开源爱好者贡献更多模式PR!")]),s._v(" "),a("li",[s._v("我们将持续秉承把复杂留给框架,把易用留给用户这一理念,砥砺前行.")])])]),s._v(" "),a("p",[s._v("上述所有API对应代码演示皆可参考源码test模块->test目录->index包下代码")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/16.0cc4e33d.js b/dist/assets/js/16.0cc4e33d.js new file mode 100644 index 00000000..869ac198 --- /dev/null +++ b/dist/assets/js/16.0cc4e33d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{338:function(s,t,a){"use strict";a.r(t);var e=a(6),n=Object(e.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"mapper-crud-接口"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mapper-crud-接口"}},[s._v("#")]),s._v(" Mapper CRUD 接口")]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("说明")]),s._v(" "),a("ul",[a("li",[s._v("通用 CRUD 封装"),a("a",{attrs:{href:"https://gitee.com/dromara/easy-es/blob/master/easy-es-core/src/main/java/cn/easyes/core/conditions/interfaces/BaseEsMapper.java",target:"_blank",rel:"noopener noreferrer"}},[s._v("BaseEsMapper"),a("OutboundLink")],1),s._v(" 接口,为 Easy-Es 启动时自动解析实体对象关系映射转换为 EE 内部对象注入容器")]),s._v(" "),a("li",[s._v("泛型 T 为任意实体对象")]),s._v(" "),a("li",[s._v("insert接口需要区别于MP,具体可看下面insert文档")]),s._v(" "),a("li",[s._v("参数 Serializable 为任意类型主键 Easy-Es 不推荐使用复合主键约定每个索引都有自己的唯一 id 主键")]),s._v(" "),a("li",[s._v("对象 Wrapper 为 条件构造器")]),s._v(" "),a("li",[s._v("针对实体对象T中的 "),a("code",[s._v("get和set")]),s._v(" 方法,我们推荐您使用"),a("a",{attrs:{href:"https://projectlombok.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Lombok"),a("OutboundLink")],1),s._v("插件生成,若您采用IDEA自带插件生成,通过Lambda风格获取的字段名称时,会导致部分驼峰命名的字段无法获取正确的字段名.\n比如有字段名称叫eName,采用Lombok生成的的get方法为getEName(),但IDEA生成的为geteName(),如此框架底层解析字段名称时就会报错,MP也存在同样问题.")])])]),s._v(" "),a("h3",{attrs:{id:"insert"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#insert"}},[s._v("#")]),s._v(" Insert")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 插入一条记录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("insert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),s._v(" entity"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 批量插入多条记录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("insertBatch")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Collection")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" entityList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("h5",{attrs:{id:"参数说明"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#参数说明"}},[s._v("#")]),s._v(" 参数说明")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("类型")]),s._v(" "),a("th",[s._v("参数名")]),s._v(" "),a("th",[s._v("描述")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[a("code",[s._v("T")])]),s._v(" "),a("td",[s._v("entity")]),s._v(" "),a("td",[s._v("实体对象")])]),s._v(" "),a("tr",[a("td",[a("code",[s._v("Collection")])]),s._v(" "),a("td",[s._v("entityList")]),s._v(" "),a("td",[s._v("实体对象集合")])])])]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("特别注意")]),s._v(" "),a("ul",[a("li",[s._v("如果您在insert时传入的entity有id并且该id对应数据已存在,则此次insert实际效果为更新该id对应的数据,并且更新不计入insert接口最后返回的成功总条数.")]),s._v(" "),a("li",[s._v("当insert接口如上所述,触发了数据更新逻辑,本次更新字段和全局配置的策略(如NOT_NULL/NOT_EMPTY)等均不生效,若您期望策略生效,可以调用update接口而非insert接口.")]),s._v(" "),a("li",[s._v("插入后如需id值可直接从entity中取,用法和MP中一致,批量插入亦可直接从原对象中获取插入成功后的数据id,以上接口返回Integer为成功条数.")])])]),s._v(" "),a("h3",{attrs:{id:"delete"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#delete"}},[s._v("#")]),s._v(" Delete")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据 ID 删除")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("deleteById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Serializable")]),s._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据 entity 条件,删除记录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("delete")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 删除(根据ID 批量删除)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("deleteBatchIds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Collection")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("extends")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Serializable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" idList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("h5",{attrs:{id:"参数说明-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#参数说明-2"}},[s._v("#")]),s._v(" 参数说明")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("类型")]),s._v(" "),a("th",[s._v("参数名")]),s._v(" "),a("th",[s._v("描述")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[a("code",[s._v("Wrapper")])]),s._v(" "),a("td",[s._v("queryWrapper")]),s._v(" "),a("td",[s._v("实体包装类 QueryWrapper")])]),s._v(" "),a("tr",[a("td",[a("code",[s._v("Serializable")])]),s._v(" "),a("td",[s._v("id")]),s._v(" "),a("td",[s._v("主键ID")])]),s._v(" "),a("tr",[a("td",[a("code",[s._v("Collection")])]),s._v(" "),a("td",[s._v("idList")]),s._v(" "),a("td",[s._v("主键ID列表")])])])]),s._v(" "),a("h3",{attrs:{id:"update"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update"}},[s._v("#")]),s._v(" Update")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//根据 ID 更新")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),s._v(" entity"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据ID 批量更新")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateBatchByIds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Collection")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" entityList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据动态条件 更新记录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("update")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),s._v(" entity"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsUpdateWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" updateWrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("h5",{attrs:{id:"参数说明-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#参数说明-3"}},[s._v("#")]),s._v(" 参数说明")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("类型")]),s._v(" "),a("th",[s._v("参数名")]),s._v(" "),a("th",[s._v("描述")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[a("code",[s._v("T")])]),s._v(" "),a("td",[s._v("entity")]),s._v(" "),a("td",[s._v("实体对象")])]),s._v(" "),a("tr",[a("td",[a("code",[s._v("Wrapper")])]),s._v(" "),a("td",[s._v("updateWrapper")]),s._v(" "),a("td",[s._v("实体对象封装操作类 UpdateWrapper")])]),s._v(" "),a("tr",[a("td",[a("code",[s._v("Collection")])]),s._v(" "),a("td",[s._v("entityList")]),s._v(" "),a("td",[s._v("实体对象集合")])])])]),s._v(" "),a("h3",{attrs:{id:"select"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#select"}},[s._v("#")]),s._v(" Select")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v("\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 获取总数")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Long")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectCount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据 ID 查询")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Serializable")]),s._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询(根据ID 批量查询)")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectBatchIds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Collection")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("extends")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Serializable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" idList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据动态查询条件,查询一条记录 若存在多条记录 会报错")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectOne")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据动态查询条件,查询全部记录")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("h5",{attrs:{id:"参数说明-4"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#参数说明-4"}},[s._v("#")]),s._v(" 参数说明")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("类型")]),s._v(" "),a("th",[s._v("参数名")]),s._v(" "),a("th",[s._v("描述")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[a("code",[s._v("Wrapper")])]),s._v(" "),a("td",[s._v("queryWrapper")]),s._v(" "),a("td",[s._v("实体包装类 QueryWrapper")])]),s._v(" "),a("tr",[a("td",[a("code",[s._v("Serializable")])]),s._v(" "),a("td",[s._v("id")]),s._v(" "),a("td",[s._v("主键ID")])]),s._v(" "),a("tr",[a("td",[a("code",[s._v("Collection")])]),s._v(" "),a("td",[s._v("idList")]),s._v(" "),a("td",[s._v("主键ID列表")])])])]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("ul",[a("li",[s._v("CRUD接口用法基本与MP一致")]),s._v(" "),a("li",[s._v("用户需要继承的Mapper为BaseEsMapper,而非BaseMapper")]),s._v(" "),a("li",[s._v("EE没有提供Service层,而是把MP中一些Service层的方法直接下沉到Mapper层了,用户用起来会更方便")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/17.9e7ed1bb.js b/dist/assets/js/17.9e7ed1bb.js new file mode 100644 index 00000000..c8ca146e --- /dev/null +++ b/dist/assets/js/17.9e7ed1bb.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{333:function(s,a,t){"use strict";t.r(a);var n=t(6),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),t("p",[s._v("如果您之前已经有了解过MP的条件构造器,那我们建议您直接拉到文末,看一下index,enableMust2Filter,and&or这三项MP中没有的即可,其它与MP一致.\nWrapper支持两种方式创建:")]),s._v(" "),t("ul",[t("li",[s._v("直接new,例如 new "),t("code",[s._v("LambdaEsQueryWrapper<>()")]),s._v(".")]),s._v(" "),t("li",[s._v("通过EsWrappers.lambdaQuery()创建,可支撑链式编程的场景,对标MP的Wrappers")])])]),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("说明")]),s._v(" "),t("ul",[t("li",[s._v("以下出现的第一个入参boolean condition表示该条件是否加入最后生成的语句中,例如:query.like(StringUtils.isNotBlank(name), Entity::getName, name) .eq(age!=null && age >= 0, Entity::getAge, age)")]),s._v(" "),t("li",[s._v("以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true")]),s._v(" "),t("li",[s._v("以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)")]),s._v(" "),t("li",[s._v("以下方法在入参中出现的R为泛型,在普通wrapper中是String,在LambdaWrapper中是函数(例:Entity::getId,Entity为实体类,getId为字段id的getMethod)")]),s._v(" "),t("li",[s._v("以下方法入参中的R column均表示数据库字段,当R具体类型为String时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名!!!,另当R具体类型为SFunction时项目runtime不支持eclipse自家的编译器!!!")]),s._v(" "),t("li",[s._v("以下举例均为使用普通wrapper,入参为Map和List的均以json形式表现!")]),s._v(" "),t("li",[s._v("使用中如果入参的Map或者List为空,则不会加入最后生成的sql中!")]),s._v(" "),t("li",[s._v("有任何疑问就点开源码看,看不懂函数的"),t("a",{attrs:{href:"https://www.jianshu.com/p/613a6118e2e0",target:"_blank",rel:"noopener noreferrer"}},[s._v("点击我学习新知识"),t("OutboundLink")],1)])])]),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("警告")]),s._v(" "),t("p",[s._v("不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输")]),s._v(" "),t("ol",[t("li",[s._v("wrapper 很重")]),s._v(" "),t("li",[s._v("传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)")]),s._v(" "),t("li",[s._v("正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作")]),s._v(" "),t("li",[s._v("我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr")])])]),s._v(" "),t("h3",{attrs:{id:"abstractwrapper"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#abstractwrapper"}},[s._v("#")]),s._v(" AbstractWrapper")]),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("说明")]),s._v(" "),t("p",[s._v("QueryWrapper(LambdaEsQueryWrapper) 和 UpdateWrapper(LambdaEsUpdateWrapper) 的父类用于生成 语句 的 where 条件, entity 属性也用于生成 语句 的 where 条件注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件 "),t("strong",[s._v("没有任何关联行为")])])]),s._v(" "),t("h3",{attrs:{id:"querywrapper"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#querywrapper"}},[s._v("#")]),s._v(" QueryWrapper")]),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("说明")]),s._v(" "),t("p",[s._v("继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaEsQueryWrapper")])]),s._v(" "),t("h3",{attrs:{id:"updatewrapper"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#updatewrapper"}},[s._v("#")]),s._v(" UpdateWrapper")]),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("说明")]),s._v(" "),t("p",[s._v("继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaEsUpdateWrapper")])]),s._v(" "),t("h3",{attrs:{id:"alleq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#alleq"}},[s._v("#")]),s._v(" allEq")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("allEq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Map")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("V")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" params"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("allEq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Map")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("V")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" params"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" null2IsNull"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("allEq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Map")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("V")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" params"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" null2IsNull"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("全部"),t("RouterLink",{attrs:{to:"/v1.0.0/020.核心功能/eq.html"}},[s._v("eq")]),s._v("(或个别"),t("RouterLink",{attrs:{to:"/v1.0.0/020.核心功能/isNull.html"}},[s._v("isNull")]),s._v(")")],1),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("个别参数说明")]),s._v(" "),t("p",[s._v("params : key为数据库字段名,value为字段值\nnull2IsNull : 为true则在map的value为null时调用"),t("RouterLink",{attrs:{to:"/v1.0.0/020.核心功能/isNull.html"}},[s._v(" isNull")]),s._v("方法,为false时则忽略value为null的")],1)]),s._v(" "),t("ul",[t("li",[s._v("例1: allEq({id:1,name:\"老王\",age:null})---\x3eid = 1 and name = '老王' and age is null")]),s._v(" "),t("li",[s._v("例2: allEq({id:1,name:\"老王\",age:null}, false)---\x3eid = 1 and name = '老王'")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("allEq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("BiPredicate")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("V")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" filter"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Map")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("V")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" params"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("allEq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("BiPredicate")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("V")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" filter"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Map")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("V")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" params"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" null2IsNull"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("allEq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("BiPredicate")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("V")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" filter"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Map")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("V")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" params"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" null2IsNull"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("个别参数说明")]),s._v(" "),t("blockquote",[t("p",[s._v("filter : 过滤函数,是否允许字段传入比对条件中\nparams 与 null2IsNull : 同上")])])]),s._v(" "),t("ul",[t("li",[s._v('例1: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})---\x3ename = \'老王\' and age is null')]),s._v(" "),t("li",[s._v('例2: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)---\x3ename = \'老王\'')])]),s._v(" "),t("h3",{attrs:{id:"eq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eq"}},[s._v("#")]),s._v(" eq")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("等于 =")]),s._v(" "),t("li",[s._v('例: eq("name", "老王")---\x3ename = \'老王\'')])]),s._v(" "),t("h3",{attrs:{id:"ne"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ne"}},[s._v("#")]),s._v(" ne")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ne")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ne")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("不等于 !=")]),s._v(" "),t("li",[s._v('例: ne("name", "老王")---\x3ename != \'老王\'')])]),s._v(" "),t("h3",{attrs:{id:"gt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gt"}},[s._v("#")]),s._v(" gt")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("gt")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("gt")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("大于 >")]),s._v(" "),t("li",[s._v('例: gt("age", 18)---\x3eage > 18')])]),s._v(" "),t("h3",{attrs:{id:"ge"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ge"}},[s._v("#")]),s._v(" ge")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ge")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ge")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("大于等于 >=")]),s._v(" "),t("li",[s._v('例: ge("age", 18)---\x3eage >= 18')])]),s._v(" "),t("h3",{attrs:{id:"lt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lt"}},[s._v("#")]),s._v(" lt")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("lt")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("lt")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("小于 <")]),s._v(" "),t("li",[s._v('例: lt("age", 18)---\x3eage < 18')])]),s._v(" "),t("h3",{attrs:{id:"le"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#le"}},[s._v("#")]),s._v(" le")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("le")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("le")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("小于等于 <=")]),s._v(" "),t("li",[s._v('例: le("age", 18)---\x3eage <= 18')])]),s._v(" "),t("h3",{attrs:{id:"between"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#between"}},[s._v("#")]),s._v(" between")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("between")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val2"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("between")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val2"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("BETWEEN 值1 AND 值2")]),s._v(" "),t("li",[s._v('例: between("age", 18, 30)---\x3eage between 18 and 30')])]),s._v(" "),t("h3",{attrs:{id:"notbetween"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notbetween"}},[s._v("#")]),s._v(" notBetween")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("notBetween")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val2"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("notBetween")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val2"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("NOT BETWEEN 值1 AND 值2")]),s._v(" "),t("li",[s._v('例: notBetween("age", 18, 30)---\x3eage not between 18 and 30')])]),s._v(" "),t("h3",{attrs:{id:"like"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#like"}},[s._v("#")]),s._v(" like")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("like")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("like")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("LIKE '%值%'")]),s._v(" "),t("li",[s._v('例: like("name", "王")---\x3ename like \'%王%\'')])]),s._v(" "),t("h3",{attrs:{id:"notlike"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notlike"}},[s._v("#")]),s._v(" notLike")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("notLike")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("notLike")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("NOT LIKE '%值%'")]),s._v(" "),t("li",[s._v('例: notLike("name", "王")---\x3ename not like \'%王%\'')])]),s._v(" "),t("h3",{attrs:{id:"likeleft"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#likeleft"}},[s._v("#")]),s._v(" likeLeft")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("likeLeft")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("likeLeft")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("LIKE '%值'")]),s._v(" "),t("li",[s._v('例: likeLeft("name", "王")---\x3ename like \'%王\'')])]),s._v(" "),t("h3",{attrs:{id:"likeright"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#likeright"}},[s._v("#")]),s._v(" likeRight")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("likeRight")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("likeRight")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("LIKE '值%'")]),s._v(" "),t("li",[s._v('例: likeRight("name", "王")---\x3ename like \'王%\'')])]),s._v(" "),t("h3",{attrs:{id:"isnull"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#isnull"}},[s._v("#")]),s._v(" isNull")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("isNull")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("isNull")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("字段 IS NULL")]),s._v(" "),t("li",[s._v("例: isNull(Document::getTitle)---\x3etitle is null")])]),s._v(" "),t("h3",{attrs:{id:"isnotnull"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#isnotnull"}},[s._v("#")]),s._v(" isNotNull")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("isNotNull")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("isNotNull")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("字段 IS NOT NULL")]),s._v(" "),t("li",[s._v("例: isNotNull(Document::getTitle)---\x3etitle is not null")])]),s._v(" "),t("h3",{attrs:{id:"in"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#in"}},[s._v("#")]),s._v(" in")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("in")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Collection")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" value"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("in")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Collection")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" value"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("字段 in (value.get(0), value.get(1), ...)")]),s._v(" "),t("li",[s._v('例: in("age",{1,2,3})---\x3eage in (1,2,3)')])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("in")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" values"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("in")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" values"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("字段 in (v0, v1, ...)")]),s._v(" "),t("li",[s._v('例: in("age", 1, 2, 3)---\x3eage in (1,2,3)')])]),s._v(" "),t("h3",{attrs:{id:"notin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notin"}},[s._v("#")]),s._v(" notIn")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("notIn")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Collection")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" value"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("notIn")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Collection")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" value"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("字段 not in (value.get(0), value.get(1), ...)")]),s._v(" "),t("li",[s._v('例: notIn("age",{1,2,3})---\x3eage not in (1,2,3)')])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("notIn")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" values"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("notIn")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" values"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("字段 not in (v0, v1, ...)")]),s._v(" "),t("li",[s._v('例: notIn("age", 1, 2, 3)---\x3eage not in (1,2,3)')])]),s._v(" "),t("h3",{attrs:{id:"groupby"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#groupby"}},[s._v("#")]),s._v(" groupBy")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupBy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" columns"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupBy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" columns"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("分组:GROUP BY 字段, ...")]),s._v(" "),t("li",[s._v("例: groupBy(Document::getId,Document::getTitle)---\x3egroup by id,title")])]),s._v(" "),t("h3",{attrs:{id:"orderbydesc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#orderbydesc"}},[s._v("#")]),s._v(" orderByDesc")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("orderByDesc")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" columns"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("orderByDesc")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" columns"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("排序:ORDER BY 字段, ... DESC")]),s._v(" "),t("li",[s._v("例: orderByDesc(Document::getId,Document::getTitle)---\x3eorder by id DESC,title DESC")])]),s._v(" "),t("h3",{attrs:{id:"limit"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#limit"}},[s._v("#")]),s._v(" limit")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("limit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("limit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" m"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("ul",[t("li",[s._v("limit n 最多返回多少条数据,相当于MySQL中limit n 中的n,用法一致.")]),s._v(" "),t("li",[s._v("limit m,n 跳过m条数据,最多返回n条数据,相当于MySQL中的limit m,n 或 offset m limit n")]),s._v(" "),t("li",[s._v("例: limit(10)---\x3e最多只返回10条数据")]),s._v(" "),t("li",[s._v("例: limit(2,5)---\x3e跳过前2条数据,从第3条开始查询,总共查询5条数据")])]),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),t("p",[s._v("n参数若不指定,则其默认值是10000 如果你单次查询,不想要太多得分较低的数据,需要手动指定n去做限制.\n另外此参数作用与Es中的size,from一致,只是为了兼容MySQL语法而引入,使用者可以根据自身习惯二选一,当两种都用时,只有一种会生效,后指定的会覆盖先指定的.")])]),s._v(" "),t("h3",{attrs:{id:"from"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#from"}},[s._v("#")]),s._v(" from")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("from")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" from"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("ul",[t("li",[s._v("从第几条数据开始查询,相当于MySQL中limit (m,n)中的m.")]),s._v(" "),t("li",[s._v("例: from(10)---\x3e从第10条数据开始查询")])]),s._v(" "),t("h3",{attrs:{id:"size"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#size"}},[s._v("#")]),s._v(" size")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("size")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" size"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("ul",[t("li",[s._v("最多返回多少条数据,相当于MySQL中limit (m,n)中的n 或limit n 中的n")]),s._v(" "),t("li",[s._v("例: size(10)---\x3e最多只返回10条数据")])]),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),t("p",[s._v("如果你单次查询,不想要太多得分较低的数据,需要手动指定size去做限制.")])]),s._v(" "),t("h3",{attrs:{id:"set"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set"}},[s._v("#")]),s._v(" set")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" column"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("SQL SET 字段")]),s._v(" "),t("li",[s._v('例: set("name", "老李头")')]),s._v(" "),t("li",[s._v('例: set("name", "")---\x3e数据库字段值变为'),t("strong",[s._v("空字符串")])]),s._v(" "),t("li",[s._v('例: set("name", null)---\x3e数据库字段值变为null')])]),s._v(" "),t("h3",{attrs:{id:"index"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#index"}},[s._v("#")]),s._v(" index")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("index")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexName"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexName"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),t("p",[s._v('可通过wrapper.index(String indexName)指定本次查询作用于哪个索引,如果本次查询要从多个索引上查询,那么索引名称可以用逗号隔开,例如wrapper.eq("index1","indexes").\nwrapper中指定的索引名称优先级最高,如果不指定则取实体类中配置的索引名称,如果实体类也未配置,则取实体名称小写作为当前查询的索引名\n针对insert/delete/update等接口中无wrapper的情况,如果你需要指定索引名,可直接在对应接口的入参中添加索引名称,可参考下面示例:')])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" document "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略为document赋值的代码")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexName "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"laohan"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("insert")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("document"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("indexName"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("h3",{attrs:{id:"enablemust2filter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enablemust2filter"}},[s._v("#")]),s._v(" enableMust2Filter")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("enableMust2Filter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" enable"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("enableMust2Filter")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" enable"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),t("p",[s._v("是否将must查询条件转换成filter查询条件,可以在wrapper中直接指定本次查询的条件是否转换,如果不指定,则从全局配置文件中获取,若配置文件中也未配置,则默认不转换.\nmust查询条件计算得分,filter不计算得分,因此在不需要计算得分的查询场景中,开启此配置可提升少许查询性能.")])]),s._v(" "),t("h3",{attrs:{id:"and-or-重点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#and-or-重点"}},[s._v("#")]),s._v(" and&or (重点)")]),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("致歉")]),s._v(" "),t("p",[s._v("ES的参数实际上是以树形数据结构封装的,所以在ES中的AND及OR没有办法做到和MySQL中一致,为了实现和MP几乎一致的语法,作者那糟老头子头发都想没了...\n好在最后,基本上做到了99%相似度的语法,仍有1%需要各位用户学习一下.")])]),s._v(" "),t("p",[s._v("MySQL和ES语法对应关系表格如下")]),s._v(" "),t("table",[t("thead",[t("tr",[t("th",[s._v("MySQL")]),s._v(" "),t("th",[s._v("ES")])])]),s._v(" "),t("tbody",[t("tr",[t("td",[s._v("and(条件1,条件2...)")]),s._v(" "),t("td",[s._v("must BoolQueryBuilder(条件1,条件2)")])]),s._v(" "),t("tr",[t("td",[s._v("or(条件1,条件2...)")]),s._v(" "),t("td",[s._v("should BoolQueryBuilder(条件1,条件2)")])]),s._v(" "),t("tr",[t("td",[s._v("条件1.or().条件2")]),s._v(" "),t("td",[s._v("should条件1,should条件2")])])])]),s._v(" "),t("blockquote",[t("p",[s._v("AND 介绍,EE中的AND其实就是将AND括号中的多个查询条件封装进一个BoolQueryBuilder中作为整体,然后该整体与其他参数默认以Must封装,功能类似MySQL中的 AND(条件1,条件2,条件3...)")])]),s._v(" "),t("p",[s._v("AND API")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("and")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Consumer")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Param")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" consumer"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("and")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Consumer")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Param")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" consumer"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("AND")]),s._v(" "),t("li",[s._v("例: and(i -> i.eq(Document::getTitle, \"Hello\").ne(Document::getCreator, \"Guy\"))---\x3eand (title ='Hello' and creator != 'Guy' )")])]),s._v(" "),t("blockquote",[t("p",[s._v("OR 介绍,EE中的OR和MP中的OR一样,支持2种,一种是or(),作为连接符,另一种是or(条件1,条件2,条件3).")])]),s._v(" "),t("ul",[t("li",[s._v("第一种or():用于把or()连接符前面和后面的must条件统统重置为should查询条件")]),s._v(" "),t("li",[s._v("第二种or(条件1,条件2,条件3...): 用于将括号中的多个查询条件封装进一个BoolQueryBuilder中作为整体,然后该整体与其它参数默认以Should封装,功能类似MySQL中的OR(条件1,条件2,条件3...)")]),s._v(" "),t("li",[s._v("第三种特殊情况,就是第一种or()连接符出现在and(条件1.or().条件2...)或or(条件1.or().条件2...)中,此时or()将must条件重置为should条件的范围仅限于括号内,括号外面的查询条件不受影响.")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("or")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("or")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[s._v("拼接 OR "),t("strong",[s._v("注意事项:")]),s._v(" 主动调用or表示紧接着下一个"),t("strong",[s._v("方法")]),s._v("不是用and连接!(不调用or则默认为使用and连接)")]),s._v(" "),t("li",[s._v('例: eq("Document::getId",1).or().eq(Document::getTitle,"Hello")---\x3eid = 1 or title =\'Hello\'')])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("or")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Consumer")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Param")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" consumer"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("or")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Consumer")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Param")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" consumer"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("ul",[t("li",[t("p",[s._v("OR")])]),s._v(" "),t("li",[t("p",[s._v("例: or(i -> i.eq(Document::getTitle, \"Hello\").ne(Document::getCreator, \"Guy\"))---\x3eor (title ='Hello' and status != 'Guy' )")])]),s._v(" "),t("li",[t("p",[s._v("特殊情况")])]),s._v(" "),t("li",[t("p",[s._v('例: eq(Document::getTitle,"Hello")\n.and(i->i.eq(Document::getCreator,"Bob").or().eq(Document::getCreator,"Tom"))---\x3e title="Hello" and(creator="Bob" or creator="Tom")')])])]),s._v(" "),t("hr"),s._v(" "),t("p",[s._v("除此之外,有一部分使用场景是如下图这样的,所有查询字段,查询类型,匹配规则等都是不固定的,由用户自由来选,这种情况下,采用上面的语法代码会非常难写,不妨使用queryStringQuery API来解决,用它来解决,整个语法就更像MySQL了,而且灵活性和效率都很高.")]),s._v(" "),t("p",[t("img",{attrs:{src:"https://iknow.hs.net/7bcf189a-053a-48fa-85d6-ef8b763d427a.png",alt:"image1"}})]),s._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("前置知识学习")]),s._v(" "),t("p",[s._v("正式进入主题前,我们先来了解下ES的索引,因为有很多小白不懂ES索引,所以这里简单说一下ES的keyword类型和text类型,以免下面踩坑,已经了解的可直接跳过此段介绍.")]),s._v(" "),t("p",[s._v('ES中的keyword类型,和MySQL中的字段基本上差不多,当我们需要对查询字段进行精确匹配,左模糊,右模糊,全模糊,排序聚合等操作时,需要该字段的索引类型为keyword类型,当我们需要对字段进行分词查询时,需要该字段的类型为text类型,并且指定分词器(不指定就用ES默认分词器,效果通常不理想).当同一个字段,我们既需要把它当keyword类型使用,又需要把它当text类型使用时,此时我们的索引类型为keyword_text类型,EE中可以对字段添加注解@TableField(fieldType = FieldType.KEYWORD_TEXT),如此该字段就会被创建为keyword+text双类型如下图所示,值得注意的是,当我们把该字段当做keyword类型查询时,ES要求传入的字段名称为"字段名.keyword",当把该字段当text类型查询时,直接使用原字段名即可.')])]),s._v(" "),t("p",[t("img",{attrs:{src:"https://iknow.hs.net/72818af6-7cc3-4833-b7a7-dbff845ce73e.png",alt:"image2"}})]),s._v(" "),t("p",[s._v("还需要注意的是,如果一个字段的索引类型被创建为仅为keyword类型(如下图所示)查询时,则不需要在其名称后面追加.keyword,直接查询就行.")]),s._v(" "),t("p",[t("img",{attrs:{src:"https://iknow.hs.net/87335e55-1fe3-44ed-920b-61354383e85a.png",alt:"image3"}})]),s._v(" "),t("hr"),s._v(" "),t("p",[s._v("啰嗦完了,正式进入主题,queryStringQuery API:")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("queryStringQuery")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" queryString"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v('其中queryString字符串就是我们的查询条件,我们可以用StringBuilder把查询字段和值拼接进去,组装成最终的查询语句.\n以上图为例,我演示一个场景,请忽略场景合理性,因为是我瞎xx选的:假设我的查询条件是:字段:创建者 等于老王,且创建者分词匹配"隔壁"(比如:隔壁老汉,隔壁老王),或者创建者包含大猪蹄子,对应的代码如下:')]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v(" "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("testQueryString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringBuilder")]),s._v(" sb "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringBuilder")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n sb"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"("')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"("')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"creator.keyword"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('":"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老王"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('")"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"AND"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"("')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"creator"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('":"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"隔壁"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('")"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('")"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"OR"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"("')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"creator.keyword"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('":"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"*大猪蹄子*"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('")"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// sb最终拼接为:((creator.keyword:老王)AND(creator:隔壁))OR(creator.keyword:*大猪蹄子*) ,可以说和MySQL语法非常相似了")]),s._v("\n wrapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("queryStringQuery")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sb"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br")])]),t("p",[s._v("前端参数页面每传递一行查询参数,我们往sb中append对应参数就完事了,是不是很简单,没错,但是代码不优雅,可咋整? 老汉已经给你们想好出路了,我们提供了工具类,其全路径为:cn.easyes.core.toolkit.QueryUtils\n我们用使用该工具类重构上面的代码,如下:")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v(" "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("testQueryStringQueryMulti")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" queryStr "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryUtils")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("combine")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Link")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("OR"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryUtils")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildQueryString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老王"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Query")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("EQ"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Link")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("AND"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryUtils")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildQueryString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"隔壁"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Query")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("MATCH"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryUtils")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildQueryString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"*大猪蹄子*"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Query")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("EQ"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("queryStringQuery")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("queryStr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("p",[s._v("是不是优雅了很多,其中的枚举Query和Link我也已经为你们封装好了,直接使用即可,不懂其枚举含义也可以直接点开查看,我在源码中有详细注释.")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/18.85a6012d.js b/dist/assets/js/18.85a6012d.js new file mode 100644 index 00000000..e6e48f82 --- /dev/null +++ b/dist/assets/js/18.85a6012d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{336:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"何为混合查询"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#何为混合查询"}},[s._v("#")]),s._v(" 何为混合查询?")]),s._v(" "),a("p",[s._v('简单理解,就是一半采用EE的语法,一半采用RestHighLevelClient的语法,类似"油电混动",相信你会爱上这种"油电混动"模式,因为它结合了两种模式的优点!')]),s._v(" "),a("h2",{attrs:{id:"为什么要有混合查询"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#为什么要有混合查询"}},[s._v("#")]),s._v(" 为什么要有混合查询?")]),s._v(" "),a("p",[s._v("因为EE目前还没有做到对RestHighLevelClient的功能100%覆盖,目前开源初期,仅覆盖了RestHighLevelClient约90%左右的功能,99%的核心高频使用功能,如此就不可避免的会出现个别场景下,EE不能满足某个特殊需求,此时对EE框架进行二次开发或直接将该需求提给EE作者,在时间上都无法满足开发者需求,有些需求可能产品经理要的比较紧,那么此时,您就可以通过混合查询来解决窘境.")]),s._v(" "),a("h2",{attrs:{id:"如何使用混合查询"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何使用混合查询"}},[s._v("#")]),s._v(" 如何使用混合查询?")]),s._v(" "),a("p",[s._v("在我没提供此篇文档时,尽管我提供了混合查询的API和简单介绍,但很多人还不知道有此功能,更不知道该如何使用,所以这里我以一个具体的案例,给大家演示如何使用混合查询,供大家参考,主公们别担心篇幅多,其实非常非常简单,只是我教程写的细.")]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("背景")]),s._v(" "),a("p",[s._v('用户"向阳"微信向我反馈,说目前EE尚不支持查询按照距给定点的位置由近及远排序.\n实际开发中,此场景可以被应用到打车时"乘客下单,要求优先派单给周围3公里内离我最近的司机",然后该乘客是个美女,担心自身安全问题,又多加了几个要求,比如司机必须是女性,驾龄大于3年,商务型车子等...')])]),s._v(" "),a("p",[s._v("以上面打车的场景为例,我们来看下用EE怎么查询?上面查询可以分为两部分")]),s._v(" "),a("ul",[a("li",[s._v("EE支持的常规查询:如周围3公里内,司机性别为女,查询驾龄>=3年...")]),s._v(" "),a("li",[s._v("EE不支持的非常规查询:按照复杂的排序规则排序(写此篇文档时是不支持的,现已支持,但这不重要,本篇仅以此来演示混合查询的使用)")])]),s._v(" "),a("p",[s._v("对于支持的部分,我们可以直接调用EE,由EE先构建一个SearchSourceBuilder出来")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 假设该乘客所在位置经纬度为 31.256224D, 121.462311D")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Driver")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nwrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoDistance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Driver")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getLocation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3.0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DistanceUnit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("KILOMETERS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("31.256224D")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("121.462311D")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Driver")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getGender")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"女"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ge")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Driver")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getDriverAge")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Driver")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCarModel")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"商务车"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchSourceBuilder")]),s._v(" searchSourceBuilder "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" driverMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getSearchSourceBuilder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("对于不支持的语句,可以继续用RestHighLevelClient的语法进行封装,封装好了,直接调用EE提供的原生查询接口,就可以完成整个查询.")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchRequest")]),s._v(" searchRequest "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"索引名"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 此处的searchSourceBuilder由上面EE构建而来,我们继续对其追加排序参数")]),s._v("\nsearchSourceBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoDistanceSortBuilder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"location"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("31.256224D")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("121.462311D")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("order")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SortOrder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("DESC"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("unit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DistanceUnit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("KILOMETERS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoDistance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoDistance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ARC"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nsearchRequest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("source")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("searchSourceBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchResponse")]),s._v(" searchResponse "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" driverMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("search")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("searchRequest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RequestOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("DEFAULT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("p",[s._v("如此您便可以既享受到了EE帮您生成好的基本查询,又可完成EE暂未支持的功能,只需要不太多的代码(相比直接RestHighLevelClient,仍能节省大量代码)就可以达成您的目标,和当下纯电动汽车尚未完全发展成熟下的一种折中方案---油电混动有着异曲同工之妙.")]),s._v(" "),a("p",[s._v("当然,如果您不习惯使用这种模式,您仍可以直接使用原生查询,所以您大可以无忧无虑的使用EE,我们已经为您想好了各种兜底的方案和退路,无忧售后!如果您也认可这种模式,不妨给作者点个赞吧,为了让EE的用户爽,作者那糟老头子可谓是煞费苦心!")]),s._v(" "),a("h2",{attrs:{id:"结语"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#结语"}},[s._v("#")]),s._v(" 结语")]),s._v(" "),a("p",[s._v("因为ES官方提供的RestHighLevel支持的功能实在是过于繁多,尽管我目前仍在马不停蹄的集成各种新的功能,以及修复用户反馈的问题,优化既有代码性能,但仍不可避免地会出现有些许功能不能满足您当前需求,请各位主公们见谅,EE才诞生三个月,不可能做到十全十美,请给我们一点时间,这些所谓的不足,都会被解决,就像新能源车在未来终会逐步取代燃油车,那些所谓的问题,在未来都不是问题,乌拉!")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/19.d00a06db.js b/dist/assets/js/19.d00a06db.js new file mode 100644 index 00000000..23d4a103 --- /dev/null +++ b/dist/assets/js/19.d00a06db.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{334:function(s,t,a){"use strict";a.r(t);var e=a(6),n=Object(e.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api"}},[s._v("#")]),s._v(" API")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v("\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 半原生查询")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchResponse")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("search")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IOException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 标准原生查询 可指定 RequestOptions")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchResponse")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("search")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchRequest")]),s._v(" searchRequest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RequestOptions")]),s._v(" requestOptions"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IOException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("p",[s._v("在一些高阶语法中,比如指定高亮字段,如果我们返回类型是实体对象本身,但实体中通常又没有高亮字段,导致高亮字段无法接收,此时可以用RestClietn原生的返回对象SearchResponse.\n尽管EE覆盖了我们使用ES的绝大多场景,但仍可能存在没有覆盖到的场景,此时您仍可以通过RestClient提供的原生语法进行查询,调用标准原生查询方法即可,入参和返回均为RestClient原生\n如果您需要在代码中用到RestHighLevelClient,您可以直接使用@Autowired注解注入使用,EE已经帮您自动配置了该bean,所以使用EE永远是>=RestHighLevelClient的.")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/20.0c45c443.js b/dist/assets/js/20.0c45c443.js new file mode 100644 index 00000000..79eea13f --- /dev/null +++ b/dist/assets/js/20.0c45c443.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{337:function(s,a,t){"use strict";t.r(a);var n=t(6),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h2",{attrs:{id:"浅分页"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#浅分页"}},[s._v("#")]),s._v(" 浅分页")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 物理分页")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PageInfo")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("pageQuery")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" pageNum"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),s._v(" pageSize"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),t("p",[s._v("无需集成任何插件,即可使用分页查询,本查询属于物理分页,基于size+from的浅分页模式,如您需要\n在一些高阶语法的使用场景中,目前已知的有聚合字段的返回,我们分页器尚不能支持,需要您自己封装分页,其它场景基本都能完美支持,用起来无比简单.\n注意PageInfo是由本框架提供的,如果你项目中已经有目前最受欢迎的开源分页插件PageHelper,请在引入包的时候注意别引入错误了,EE采用和PageHelper一样的返回字段,您无需担心字段名称不统一带来的额外工作量.")])]),s._v(" "),t("blockquote",[t("p",[s._v("使用示例:")])]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v(" "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("testPageQuery")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老汉"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PageInfo")]),t("span",{pre:!0,attrs:{class:"token generics"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documentPageInfo "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("pageQuery")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documentPageInfo"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br")])]),t("h2",{attrs:{id:"滚动查询"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#滚动查询"}},[s._v("#")]),s._v(" 滚动查询")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[s._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 滚动查询")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchResponse")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("scroll")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchScrollRequest")]),s._v(" searchScrollRequest"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RequestOptions")]),s._v(" requestOptions"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IOException")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),t("p",[s._v("若您有需要进行超大量的数据查询和分页需求,可以采用滚动查询来实现,关于滚动查询,我们实际上已经提供了getSearchSourceBuilderAPI用于快速构造出SearchSourceBuilder,配合上面提供的滚动查询API,助力您快速实现滚动查询。\n当然我们对滚动查询的支持不会止步于此,后期还会持续优化,针对分页查询数据量超过一定阈值时自动开启滚动查询分页,且用户可以通过配置选择采用哪种分页模式,敬请期待.")])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/21.b01e3dd8.js b/dist/assets/js/21.b01e3dd8.js new file mode 100644 index 00000000..d3f5a4fe --- /dev/null +++ b/dist/assets/js/21.b01e3dd8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{339:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("前言")]),s._v(" "),a("p",[s._v("ES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对嵌套文档的支持,实际上也是采取了一种投机取巧的方式实现的.")]),s._v(" "),a("p",[s._v("嵌套的文档均以独立的文档存入,然后添加关联关系,这就会导致,一条嵌套类型的文档,底层实际上存储了N条数据,而且更新时会株连九族式更新,导致效率低下,而且对于嵌套类型,其查询功能也受限,不支持聚合排序等功能,因此我们并不建议您在实际开发中使用这种类型.")]),s._v(" "),a("p",[s._v('ES本身更适合"大宽表"模式,不要带着传统关系型数据库那种思维方式去使用ES,我们完全可以通过把多张表中的字段和内容合并到一张表(一个索引)中,来完成期望功能,尽可能规避嵌套类型的使用,不仅效率高,功能也更强大.')]),s._v(" "),a("p",[s._v("当然存在即合理,也确实有个别场景下,不可避免的会用到嵌套类型,作为全球首屈一指的ES-ORM框架,我们对此也提供了支持,用户可以不用,但我们不能没有!")])]),s._v(" "),a("h2",{attrs:{id:"_1-前套类型创建索引"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-前套类型创建索引"}},[s._v("#")]),s._v(" 1.前套类型创建索引")]),s._v(" "),a("ul",[a("li",[s._v("自动挡模式:")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略其它字段...")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 嵌套类型 \n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@TableField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fieldType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("NESTED"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nestedClass "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" users"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("注意")]),s._v(" "),a("p",[s._v("务必像上面示例一样指定类型为fieldType=NESTED及其nestedClass,否则会导致框架无法正常运行")])]),s._v(" "),a("ul",[a("li",[s._v("手动挡模式")]),s._v(" "),a("li",[s._v("方式一:\n按照自动挡模式,配置好注解,然后直接调用一键生成API生成索引 (v0.9.30+ 版本支持)")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v("documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("createIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("ul",[a("li",[s._v("方式二:\n纯手工打造,所有字段自己安排一遍,不推荐,麻烦得很")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略其它代码")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("mapping")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getUsers")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("NESTED"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("注意")]),s._v(" "),a("p",[s._v("在手动挡模式下,除了要通过注解@TableField指定nestedClass外,还需要通过wrapper指定该嵌套字段,然后完成索引创建/更新")])]),s._v(" "),a("h2",{attrs:{id:"嵌套类型-crud"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#嵌套类型-crud"}},[s._v("#")]),s._v(" 嵌套类型 CRUD")]),s._v(" "),a("p",[s._v("其中增删改与非嵌套类型使用无差异,这里不赘述")]),s._v(" "),a("p",[s._v("查询示例:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testNestedMatch")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('// 嵌套查询 查询内容匹配人才且嵌套数据中用户名匹配"用户1"的数据')]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 其中嵌套类的字段名称获取我们提供了工具类FieldUtils.val帮助用户通过lambda函数式获取字段名称,当然如果不想用也可以直接传字符串")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("EsWrappers")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("lambdaQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"人才"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nestedMatch")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getUsers")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("val")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("User")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getUsername")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"用户"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("p",[s._v("相关demo可参考源码的test模块->test目录->nested包")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/22.19b7c6e9.js b/dist/assets/js/22.19b7c6e9.js new file mode 100644 index 00000000..1438bb17 --- /dev/null +++ b/dist/assets/js/22.19b7c6e9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{340:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("前言")]),s._v(" "),a("p",[s._v("ES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的.")]),s._v(" "),a("p",[s._v("父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有减少文档数量,而且增加了父子绑定关系,会导致查询效率低下,因此我们并不建议您在实际开发中使用父子类型.")]),s._v(" "),a("p",[s._v('ES本身更适合"大宽表"模式,不要带着传统关系型数据库那种思维方式去使用ES,我们完全可以通过把多张表中的字段和内容合并到一张表(一个索引)中,来完成期望功能,尽可能规避父子类型的使用,不仅效率高,功能也更强大.')]),s._v(" "),a("p",[s._v("当然存在即合理,也确实有个别场景下,不可避免的会用到父子类型,作为全球首屈一指的ES-ORM框架,我们对此也提供了支持,用户可以不用,但我们不能没有!")]),s._v(" "),a("p",[s._v("关于父子类型和嵌套类型的选择:如果对文档的写多于读,那么建议你选择父子类型,如果文档读多于写, 那么请选择嵌套类型.")])]),s._v(" "),a("h2",{attrs:{id:"_1父子类型创建索引"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1父子类型创建索引"}},[s._v("#")]),s._v(" 1父子类型创建索引")]),s._v(" "),a("ul",[a("li",[s._v("自动挡模式:")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 父文档\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@TableName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("childClass "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略其它字段...")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 须通过注解在父文档及子文档的实体类中指明其类型为Join,及其父名称和子名称,这里的JoinField类框架已内置,无需重复造轮子\n * JoinField类全路径为cn.easyes.common.params.JoinField,如果你非要自己造轮子,也支持,那么需要在@TableField注解中指明joinFieldClass=你造的轮子\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@TableField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fieldType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("JOIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" parentName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"document"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" childName "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"comment"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JoinField")]),s._v(" joinField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 子文档\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@TableName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("child "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略其它字段...")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 父子关系字段 须通过注解在父文档及子文档的实体类中指明其类型为Join,子文档中的父子关系可省略\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@TableField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fieldType "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("JOIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JoinField")]),s._v(" joinField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br")])]),a("blockquote",[a("p",[a("strong",[s._v("注意:")]),s._v(" 务必像上面示例一样,在父文档的类上加注解@TableName指明其子文档类,在子文档的类上加注解@TableName,指明child=true,并在JoinField类的@TableField注解中指定类型为fieldType=JOIN及其parentName,childName,否则会导致框架无法正常工作")])]),s._v(" "),a("ul",[a("li",[s._v("手动挡模式")]),s._v(" "),a("li",[s._v("方式一:\n按照自动挡模式,配置好注解,然后直接调用一键生成API生成索引 (v0.9.30+ 版本支持)")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v("documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("createIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("ul",[a("li",[s._v("方式二:\n纯手工打造,所有字段自己安排一遍,不推荐,麻烦得很")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略其它代码")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("join")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"joinField"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"document"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"comment"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("注意")]),s._v(" "),a("p",[s._v("在手动挡模式下,主类上的注解依然不能少,框架运行时需要用到父子关系,在方式二还需要通过wrapper指定该嵌套字段,然后完成索引创建/更新")])]),s._v(" "),a("h2",{attrs:{id:"父子类型-crud"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#父子类型-crud"}},[s._v("#")]),s._v(" 父子类型 CRUD")]),s._v(" "),a("p",[s._v("注意父子类型由于都是独立的文档,独立的实体类,所以各自都需要有各自的mapper")]),s._v(" "),a("p",[s._v("CRUD示例:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testInsert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 测试新增父子文档,此处开启自动挡模式,父子类型索引已被自动处理")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 新新增父文档,然后再插入子文档")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" document "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"父文档的标题"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"父文档的内容"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JoinField")]),s._v(" joinField "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JoinField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n joinField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"document"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setJoinField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("joinField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("insert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 插入子文档")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),s._v(" comment "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n comment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n comment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCommentContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"文档的评论1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 这里特别注意,子文档必须指定其父文档的id,否则找不到父文档别怪我没提醒")]),s._v("\n joinField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setParent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n joinField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"comment"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n comment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setJoinField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("joinField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n commentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("insert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("comment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 插入子文档2")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),s._v(" comment1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n comment1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"3"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n comment1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCommentContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"文档的评论2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n comment1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setJoinField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("joinField"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n commentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("insert")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("comment1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testSelect")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 温馨提示,下面wrapper中的type实际上就是JoinField字段注解@TableField中指定的parentName和childName,与原生语法是一致的")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// case1: hasChild查询,返回的是相关的父文档 所以查询用父文档实体及其mapper")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documentWrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n documentWrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("hasChild")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"comment"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FieldUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("val")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCommentContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"评论"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documentWrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// case2: hasParent查询,返回的是相关的子文档 所以查询用子文档实体及其mapper")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" commentWrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 字段名称你也可以不用FieldUtils.val,直接传入字符串也行")]),s._v("\n commentWrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("hasParent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"document"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"content"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"内容"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" comments "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" commentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("commentWrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("comments"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// case3: parentId查询,返回的是相关的子文档,与case2类似,所以查询用子文档实体及其mapper")]),s._v("\n commentWrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n commentWrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("parentId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"comment"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" commentList "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" commentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("commentWrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("commentList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testUpdate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// case1: 父文档/子文档 根据各自的id更新")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" document "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"父标题"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("document"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// case2: 父文档/子文档 根据各自条件更新")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),s._v(" comment "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n comment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setCommentContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"更新后的评论"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsUpdateWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsUpdateWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCommentContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"评论"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n commentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("update")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("comment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testDelete")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// case1: 父文档/子文档 根据各自的id删除")]),s._v("\n documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("deleteById")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//case2: 父文档/子文档 根据各自条件删除")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Comment")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCommentContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"评论"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n commentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("delete")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br"),a("span",{staticClass:"line-number"},[s._v("64")]),a("br"),a("span",{staticClass:"line-number"},[s._v("65")]),a("br"),a("span",{staticClass:"line-number"},[s._v("66")]),a("br"),a("span",{staticClass:"line-number"},[s._v("67")]),a("br"),a("span",{staticClass:"line-number"},[s._v("68")]),a("br"),a("span",{staticClass:"line-number"},[s._v("69")]),a("br"),a("span",{staticClass:"line-number"},[s._v("70")]),a("br"),a("span",{staticClass:"line-number"},[s._v("71")]),a("br"),a("span",{staticClass:"line-number"},[s._v("72")]),a("br"),a("span",{staticClass:"line-number"},[s._v("73")]),a("br"),a("span",{staticClass:"line-number"},[s._v("74")]),a("br"),a("span",{staticClass:"line-number"},[s._v("75")]),a("br"),a("span",{staticClass:"line-number"},[s._v("76")]),a("br"),a("span",{staticClass:"line-number"},[s._v("77")]),a("br"),a("span",{staticClass:"line-number"},[s._v("78")]),a("br"),a("span",{staticClass:"line-number"},[s._v("79")]),a("br"),a("span",{staticClass:"line-number"},[s._v("80")]),a("br"),a("span",{staticClass:"line-number"},[s._v("81")]),a("br")])]),a("p",[s._v("相关demo可参考源码的test模块->test目录->join包")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/23.bfe8ee88.js b/dist/assets/js/23.bfe8ee88.js new file mode 100644 index 00000000..5dce49df --- /dev/null +++ b/dist/assets/js/23.bfe8ee88.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{346:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api"}},[s._v("#")]),s._v(" API")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 获取通过本框架生成的查询参数 可用于检验本框架生成的查询参数是否正确以及其它用途")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getSource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("p",[s._v("如果您获取DSL语句仅仅是为了打印,您无需再手动调用此接口获取DSL语句,DSL语句默认会在控制台打印,生产环境如需关闭请在配置文件中配置print-dsl=false,配置可参考配置章节.")])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/25.3abb42f0.js b/dist/assets/js/25.3abb42f0.js new file mode 100644 index 00000000..61fd677f --- /dev/null +++ b/dist/assets/js/25.3abb42f0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{342:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"ee内置排序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ee内置排序"}},[s._v("#")]),s._v(" EE内置排序")]),s._v(" "),a("blockquote",[a("p",[s._v("针对字段的排序,EE提供了一些内置开箱即用的API,用于支持升序排序和降序排序:")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 降序排列")]),s._v("\nwrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("orderByDesc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("排序字段"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("支持多字段"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 升序排列")]),s._v("\nwrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("orderByAsc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("排序字段"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("支持多字段"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据得分排序(此功能0.9.7+版本支持;不指定SortOrder时默认降序,得分高的在前,支持升序/降序)")]),s._v("\nwrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sortByScore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SortOrder")]),s._v(" sortOrder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 排序入参由前端传入, 字符串格式,有点类似之前MySQL那种")]),s._v("\nwrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("orderBy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderByParam")]),s._v(" orderByParam"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 排序入参由前端传入,多字段情形")]),s._v("\nwrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("orderBy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderByParam")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" orderByParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br")])]),a("p",[s._v("使用示例:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testSort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 测试排序 为了测试排序,我们在Document对象中新增了创建时间字段,更新了索引,并新增了两条数据")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("likeRight")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"推"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("select")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getGmtCreate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" before "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"before:"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("before"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("orderByDesc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getGmtCreate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" desc "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"desc:"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("desc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br")])]),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testSortByScore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 测试根据得分升序排列(分数低的排前面)")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"技术"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sortByScore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SortOrder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ASC"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testOrderByParams")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 此处模拟参数由前端通过xxQuery类传入,排序根据标题降序,根据内容升序")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" jsonParam "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"[{\\"order\\":\\"title\\",\\"sort\\":\\"DESC\\"},{\\"order\\":\\"creator\\",\\"sort\\":\\"ASC\\"}]"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderByParam")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" orderByParams "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" JSON"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("parseArray")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("jsonParam"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("OrderByParam")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"技术"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("orderBy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("orderByParams"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("效果:\n"),a("img",{attrs:{src:"https://iknow.hs.net/8730de70-29af-4279-9d40-43baa363a95b.png",alt:"image.png"}})]),s._v(" "),a("h2",{attrs:{id:"自定义排序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#自定义排序"}},[s._v("#")]),s._v(" 自定义排序")]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("背景")]),s._v(" "),a("p",[s._v("ES的排序器非常丰富多变,也足够灵活,我们很难用一套固定的方案将所有排序都简化。因此我们针对上面这些高频的排序提供了开箱即用的支持,对于其它低频使用的排序,将排序建造者通过自定义的方式直接委托给用户使用,无疑是目前较好的解决方案,如此便可以在不使用原生查询和混合查询的前提下,还能100%支持ES提供的所有查询功能。而且随着不断迭代和吸纳用户反馈,在不久的将来,我们也会持续提供更多开箱即用的API支持,敬请期待。")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// API")]),s._v("\nwrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SortBuilder")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" sortBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("使用示例:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testSort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 测试复杂排序,SortBuilder的子类非常多,这里仅演示一种, 比如有用户提出需要随机获取数据")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"技术"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Script")]),s._v(" script "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Script")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Math.random()"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ScriptSortBuilder")]),s._v(" scriptSortBuilder "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ScriptSortBuilder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("script"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ScriptSortBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ScriptSortType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("NUMBER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("scriptSortBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("p",[s._v("SortBuilder类的子类非常多,也非常灵活,所以能支撑和覆盖的排序场景也足够多,其它各种类型的查询,如果您在使用过程中有碰到,可以参考上面的例子去写")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/26.cba464b2.js b/dist/assets/js/26.cba464b2.js new file mode 100644 index 00000000..41f807cb --- /dev/null +++ b/dist/assets/js/26.cba464b2.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{348:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("前言")]),s._v(" "),a("p",[s._v("聚合可以算得上ES中最难用的一部分了,其API也是最反人类的,懂的都懂。对聚合的支持,SpringData-ElasticSearch直接放弃了,EE对其ES的聚合的简化也比较有限,尽管如此,也算得上目前市面上开源框架中对ES聚合支持得最好的框架了,大家在用得时候请轻喷,在聚合方式排列组合有上千种,以及灵活多变的树形桶得数据解析上,我们真的尽力了,奉劝大家抛弃幻想,准备迎接挑战,这不是MySQL。ES的聚合和MySQL的聚合完全是两种不同的东西。\n您现在看到的聚合也绝对不是EE对聚合支持的最终形态,我们还会持续探索进一步简化聚合,来减轻用户使用ES聚合功能的烦恼。")])]),s._v(" "),a("h2",{attrs:{id:"常规聚合"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#常规聚合"}},[s._v("#")]),s._v(" 常规聚合")]),s._v(" "),a("p",[s._v("在MySQL中,我们可以通过指定字段进行group by聚合,EE同样也支持类似聚合:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testGroupBy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("likeRight")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"推"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupBy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 支持多字段聚合")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// wrapper.groupBy(Document::getCreator,Document::getCreator);")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchResponse")]),s._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("search")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("response"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("p",[s._v("尽管语法与MP一致,但实际上,ES的聚合结果是放在单独的对象中的,格式如下所示,因此我们高阶语法均需要用SearchResponse来接收返回结果,这点需要区别于MP和MySQL.")])]),s._v(" "),a("div",{staticClass:"language-json line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"aggregations"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"sterms#creator"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"doc_count_error_upper_bound"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"sum_other_doc_count"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"buckets"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"key"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"doc_count"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"key"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老王"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"doc_count"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h2",{attrs:{id:"其它聚合"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#其它聚合"}},[s._v("#")]),s._v(" 其它聚合:")]),s._v(" "),a("div",{staticClass:"language-json line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 求最小值")]),s._v("\nwrapper.min();\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 求最大值")]),s._v("\nwrapper.max();\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 求平均值")]),s._v("\nwrapper.avg();\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 求和")]),s._v("\nwrapper.sum();\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("p",[s._v("如果需要先groupBy,再根据groupBy聚合后桶中的数据进行求最值,均值之类的,也是支持的,会按照您在wrapper中指定的顺序,管道聚合(pipeline aggregation).")]),s._v(" "),a("p",[s._v("示例:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testAgg")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 根据创建者聚合,聚合完在该桶中再次根据点赞数聚合")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 注意:指定的多个聚合参数为管道聚合,就是第一个聚合参数聚合之后的结果,再根据第二个参数聚合,对应Pipeline聚合")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupBy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getStarNum")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchResponse")]),s._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("search")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("response"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("blockquote",[a("p",[s._v("另外EE还提供了可以配置是否开启管道聚合的参数,默认为开启,如果你想让多个字段聚合的结果出现在各自的桶中,那么你可以指定enablePipeline参数为false即可.")])]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testAggNotPipeline")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对于下面两个字段,如果不想以pipeline管道聚合,各自聚合的结果在各自的桶中展示的话,我们也提供了支持")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 指定启用管道聚合为false")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupBy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchResponse")]),s._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("search")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("response"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("h2",{attrs:{id:"去重聚合"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#去重聚合"}},[s._v("#")]),s._v(" 去重聚合")]),s._v(" "),a("blockquote",[a("p",[s._v("为了方便用户去重,我们针对字段的去重提供了极为友好的方式,解决用户根据字段进行去重及分页要写大量代码来实现的烦恼,使用ee单字段去重仅需1行即可搞定!")])]),s._v(" "),a("p",[s._v("API:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 去重,入参为去重列")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("distinct")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("下面我用一段代码来演示根据指定字段去重:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testDistinct")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询所有标题为老汉的文档,根据创建者去重,并分页返回")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("distinct")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("PageInfo")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" pageInfo "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pageQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("pageInfo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("坏味道")]),s._v(" "),a("p",[s._v("对于多字段的去重支持,没有上述这么简单,因为多字段去重无法通过折叠去实现,数据会被置入桶中返回,桶中数据的解析,需要哪些字段,排序规则,覆盖规则是怎样的过于灵活,我们无法通过框架来帮用户屏蔽这些,市面上目前也无任何框架能够支撑,因此,我们对多字段的去重仅支持到了查询条件的封装,数据解析部分需用户自行完成,敬请谅解.好在多字段去重的场景并不是太多,用户如果有用到多字段去重,可参见本篇开头对groupBy的介绍,可通过groupBy对多字段实现去重。")])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/27.600fb5f6.js b/dist/assets/js/27.600fb5f6.js new file mode 100644 index 00000000..2ae3ebfe --- /dev/null +++ b/dist/assets/js/27.600fb5f6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{344:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"分词匹配相关功能api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#分词匹配相关功能api"}},[s._v("#")]),s._v(" 分词匹配相关功能API")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("notMatch")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Float")]),s._v(" boost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 下面这些API 0.9.12+版本才支持,如需可自行升级EE版本")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("matchPhase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Float")]),s._v(" boost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("matchAllQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("matchPhrasePrefixQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxExpansions"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Float")]),s._v(" boost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("multiMatchQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" val"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Operator")]),s._v(" operator"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" minimumShouldMatch"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Float")]),s._v(" boost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" columns"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("queryStringQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" queryString"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Float")]),s._v(" boost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("prefixQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" prefix"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Float")]),s._v(" boost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("注意")]),s._v(" "),a("p",[s._v("注意:涉及需要分词匹配的字段索引类型必须为text,并为其指定分词器,所需分词器需提前安装,否则将使用es默认分词器,对中文支持不好.")])]),s._v(" "),a("ul",[a("li",[s._v("分词匹配")]),s._v(" "),a("li",[s._v('例: match("content", "老王")---\x3econtent 包含关键词 \'老王\' 如果分词粒度设置的比较细,老王可能会被拆分成"老"和"王",只要content中包含"老"或"王",均可以被搜出来,其它api可参考下面代码示例.')])]),s._v(" "),a("h2",{attrs:{id:"代码示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#代码示例"}},[s._v("#")]),s._v(" 代码示例")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testMatch")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 会对输入做分词,只要所有分词中有一个词在内容中有匹配就会查询出该数据,无视分词顺序")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"技术"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("size")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testMatchPhase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样,否则就无法查询出结果")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 例如es中数据是 技术过硬,如果搜索关键词为过硬技术就无法查询出结果")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("matchPhase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"技术"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testMatchAllQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询所有数据,类似mysql select all.")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("matchAllQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testMatchPhrasePrefixQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 前缀匹配查询 查询字符串的最后一个词才能当作前缀使用")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 前缀 可能会匹配成千上万的词,这不仅会消耗很多系统资源,而且结果的用处也不大,所以可以提供入参maxExpansions,若不写则默认为50")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("matchPhrasePrefixQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCustomField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"乌拉巴拉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testMultiMatchQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 从多个指定字段中查询包含老王的数据")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("multiMatchQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老王"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getTitle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCustomField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 其中,默认的Operator为OR,默认的minShouldMatch为60% 这两个参数都可以按需调整,我们api是支持的 例如:")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 其中AND意味着所有搜索的Token都必须被匹配,OR表示只要有一个Token匹配即可. minShouldMatch 80 表示只查询匹配度大于80%的数据")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('// wrapper.multiMatchQuery("老王",Operator.AND,80,Document::getCustomField,Document::getContent);')]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("size")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("queryStringQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 从所有字段中查询包含关键词老汉的数据")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("queryStringQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("prefixQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('// 查询创建者以"隔壁"打头的所有数据 比如隔壁老王 隔壁老汉 都能被查出来')]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("prefixQuery")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"隔壁"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br"),a("span",{staticClass:"line-number"},[s._v("64")]),a("br"),a("span",{staticClass:"line-number"},[s._v("65")]),a("br"),a("span",{staticClass:"line-number"},[s._v("66")]),a("br"),a("span",{staticClass:"line-number"},[s._v("67")]),a("br"),a("span",{staticClass:"line-number"},[s._v("68")]),a("br"),a("span",{staticClass:"line-number"},[s._v("69")]),a("br"),a("span",{staticClass:"line-number"},[s._v("70")]),a("br"),a("span",{staticClass:"line-number"},[s._v("71")]),a("br"),a("span",{staticClass:"line-number"},[s._v("72")]),a("br")])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/28.0f3e3129.js b/dist/assets/js/28.0f3e3129.js new file mode 100644 index 00000000..81af4a16 --- /dev/null +++ b/dist/assets/js/28.0f3e3129.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{345:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("blockquote",[a("p",[s._v("权重查询也是Es有MySQL无的一种查询,语法如下")])]),s._v(" "),a("h2",{attrs:{id:"api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api"}},[s._v("#")]),s._v(" API")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("字段"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" 值"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Float")]),s._v(" 权重值"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h2",{attrs:{id:"代码示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#代码示例"}},[s._v("#")]),s._v(" 代码示例")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testWeight")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IOException")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n \t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 测试权重")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" keyword "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"过硬"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("float")]),s._v(" contentBoost "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.0f")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("match")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getContent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("keyword"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("contentBoost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" creator "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("float")]),s._v(" creatorBoost "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2.0f")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getCreator")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("creator"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("creatorBoost"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchResponse")]),s._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("search")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("response"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("p",[s._v("如果你需要得分,则通过SearchResponse返回,如果不需要得分,只需要按照得分高的排名靠前返回,则直接用"),a("code",[s._v("List")]),s._v("接收即可.")])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/29.26187e5d.js b/dist/assets/js/29.26187e5d.js new file mode 100644 index 00000000..799de1b4 --- /dev/null +++ b/dist/assets/js/29.26187e5d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{343:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("p",[s._v("高亮字段通过自定义注解@HighLight即可实现,将该注解添加在需要被高亮的字段上即可")])]),s._v(" "),a("h2",{attrs:{id:"注解使用示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#注解使用示例"}},[s._v("#")]),s._v(" 注解使用示例")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 需要被高亮的字段\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@HighLight")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略其它无关字段...")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("p",[s._v("如果你不想原来的字段值被高亮字段覆盖,那么你需要在@HighLight注解中指定mappingField,并将该字段添加至对应实体类中,这样配置以后,高亮内容在highlightContent字段中返回,原content字段的值依旧返回它本身的值.")])]),s._v(" "),a("p",[s._v("例如:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 需要被高亮的字段\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@HighLight")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mappingField "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"highlightContent"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" content"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 高亮返回值被映射的字段\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" highlightContent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略其它无关字段...")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("其它")]),s._v(" "),a("ul",[a("li",[s._v("高亮注解支持设置高亮返回内容截取的长度fragmentSize,默认值为100")]),s._v(" "),a("li",[s._v("高亮注解支持设置高亮内容的标签,默认为"),a("em")])])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/30.82ed81b3.js b/dist/assets/js/30.82ed81b3.js new file mode 100644 index 00000000..495f5266 --- /dev/null +++ b/dist/assets/js/30.82ed81b3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{350:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("p",[s._v("地理位置查询,与Es官方提供的功能完全一致,共支持4种类型的地理位置查询:")]),s._v(" "),a("ul",[a("li",[s._v("GeoBoundingBox")]),s._v(" "),a("li",[s._v("GeoDistance")]),s._v(" "),a("li",[s._v("GeoPolygon")]),s._v(" "),a("li",[s._v("GeoShape")])])]),s._v(" "),a("p",[s._v("通过这4类查询,可以实现各种强大实用的功能")]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("应用场景")]),s._v(" "),a("ul",[a("li",[s._v("外卖类APP 附近的门店")]),s._v(" "),a("li",[s._v("社交类APP 附近的人")]),s._v(" "),a("li",[s._v("打车类APP 附近的司机")]),s._v(" "),a("li",[s._v("区域人群画像类APP 指定范围内的人群特征提取")]),s._v(" "),a("li",[s._v("健康码等")]),s._v(" "),a("li",[s._v("...")])])]),s._v(" "),a("p",[s._v("EE对ES地理位置相关功能支持覆盖100%,且使用更为简单.")]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("注意事项")]),s._v(" "),a("ol",[a("li",[s._v("在使用地理位置查询API之前,需要提前创建或更新好索引\n"),a("ul",[a("li",[s._v("划重点:其中前三类API(GeoBoundingBox,GeoDistance,GeoPolygon)字段索引类型必须为geo_point")]),s._v(" "),a("li",[s._v("GeoShape字段索引类型必须为geo_shape,否则将导致功能无法正常使用,具体可参考下图")])])]),s._v(" "),a("li",[s._v("字段类型推荐使用String,因为wkt文本格式就是String,非常方便,至于字段名称,见名知意即可.")])])]),s._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/94fcefcc-3bfd-48c6-99fa-2bfa6d803f20.png",alt:"1"}})]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 省略其它字段...")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" location"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" geoLocation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("h2",{attrs:{id:"geoboundingbox"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#geoboundingbox"}},[s._v("#")]),s._v(" GeoBoundingBox")]),s._v(" "),a("p",[s._v("GeoBoundingBox: 直译为地理边界盒,由左上点和右下点构成的矩形范围,在此范围内的点均可以被查询出来,实际使用的并不多,可参考下图:"),a("br"),a("img",{attrs:{src:"https://iknow.hs.net/1c6b9123-d3ea-4c7e-8a54-ea31e4d0b371.png",alt:"1"}})]),s._v(" "),a("h3",{attrs:{id:"api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api"}},[s._v("#")]),s._v(" API")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 在矩形内")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoBoundingBox")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" topLeft"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" bottomRight"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 不在矩形内 (0.9.7+版本支持)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("notInGeoBoundingBox")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" topLeft"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" bottomRight"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("h3",{attrs:{id:"使用示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#使用示例"}},[s._v("#")]),s._v(" 使用示例")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testGeoBoundingBox")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询位于左上点和右下点坐标构成的长方形内的所有点")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 假设左上点坐标")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" leftTop "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("41.187328D")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("115.498353D")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 假设右下点坐标")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" bottomRight "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("39.084509D")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("117.610461D")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoBoundingBox")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getLocation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" leftTop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" bottomRight"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查不在此长方形内的所有点")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// wrapper.notInGeoBoundingBox(Document::getLocation, leftTop, bottomRight);")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("forEach")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("ol",[a("li",[s._v("上面使用示例仅演示了其中一种,实际上本框架中坐标点的语法支持非常多种,ElasticSearch官方提供的几种数据格式都支持,用户可按自己习惯自行选择对应的api进行查询参数构造:")])]),s._v(" "),a("ul",[a("li",[s._v("GeoPoint:上面Demo中使用的经纬度表示方式")]),s._v(" "),a("li",[s._v("经纬度数组: [116.498353, 40.187328],[116.610461, 40.084509]")]),s._v(" "),a("li",[s._v('经纬度字符串: "40.187328, 116.498353","116.610461, 40.084509"')]),s._v(" "),a("li",[s._v('经纬度边界框WKT: "BBOX (116.498353,116.610461,40.187328,40.084509)"')]),s._v(" "),a("li",[s._v('经纬度GeoHash(哈希): "xxx"')])]),s._v(" "),a("p",[s._v("其中,经纬度哈希的转换可参考此网站:"),a("a",{attrs:{href:"http://geohash.co/",target:"_blank",rel:"noopener noreferrer"}},[s._v("GeoHash坐标在线转换"),a("OutboundLink")],1)])]),s._v(" "),a("h2",{attrs:{id:"geodistance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#geodistance"}},[s._v("#")]),s._v(" GeoDistance")]),s._v(" "),a("p",[s._v("GeoDistance:直译为地理距离,实际上就是以给定的点为圆心,给定的半径画个圆,处在此圆内的点都能被查出来,使用较为高频,比如像我们用的外卖软件,查询周围3公里内的所有店铺,就可以用此功能去实现,没错你还可以用来写YP软件,查询下附近三公里内的PLMM...")]),s._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/fb76fc69-1f09-41d9-a760-93639b45a580.png",alt:"1"}})]),s._v(" "),a("h3",{attrs:{id:"api-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api-2"}},[s._v("#")]),s._v(" API")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查圆形内的所有点")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoDistance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Double")]),s._v(" distance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DistanceUnit")]),s._v(" distanceUnit"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" centralGeoPoint"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查不在圆形内的所有点 (0.9.7+ 版本支持)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("notInGeoDistance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Double")]),s._v(" distance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DistanceUnit")]),s._v(" distanceUnit"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" centralGeoPoint"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("h3",{attrs:{id:"使用示例-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#使用示例-2"}},[s._v("#")]),s._v(" 使用示例")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testGeoDistance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询以经度为41.0,纬度为115.0为圆心,半径168.8公里内的所有点")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 其中单位可以省略,默认为km")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoDistance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getLocation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("168.8")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DistanceUnit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("KILOMETERS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("41.0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("116.0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//查询不在圆形内的所有点")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// wrapper.notInGeoDistance(Document::getLocation, 168.8, DistanceUnit.KILOMETERS, new GeoPoint(41.0, 116.0));")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 上面语法也可以写成下面这几种形式,效果是一样的,兼容不同用户习惯而已:")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('// wrapper.geoDistance(Document::getLocation,"1.5km",new GeoPoint(41.0,115.0));')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('// wrapper.geoDistance(Document::getLocation, "1.5km", "41.0,115.0");')]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("ol",[a("li",[s._v("同样的对于坐标点的表达形式也支持多种,和GeoBondingBox中的Tips介绍的一样,这里不再赘述.")]),s._v(" "),a("li",[s._v("对于宠粉的EE来说,兼容各种用户的不同习惯是理所当然的,所以你在使用时会发现大量方法重载,选一种最符合你使用习惯或符合指定使用场景的api进行调用即可.")])])]),s._v(" "),a("h2",{attrs:{id:"geopolygon"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#geopolygon"}},[s._v("#")]),s._v(" GeoPolygon")]),s._v(" "),a("p",[s._v("GeoPolygon:直译为地理多边形,实际上就是以给定的所有点构成的多边形为范围,查询此范围内的所有点,此功能常被用来做电子围栏,使用也较为高频,像共享单车可以停放的区域就可以通过此技术实现,可参考下图:")]),s._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/8c72431f-a5e7-48da-9021-c25dc0adc081.png",alt:"1"}})]),s._v(" "),a("h3",{attrs:{id:"api-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api-3"}},[s._v("#")]),s._v(" API")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoPolygon")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" geoPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h3",{attrs:{id:"使用示例-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#使用示例-3"}},[s._v("#")]),s._v(" 使用示例")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testGeoPolygon")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询以给定点列表构成的不规则图形内的所有点,点数至少为3个")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" geoPoints "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" geoPoint "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("40.178012")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("116.577188")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" geoPoint1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("40.169329")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("116.586315")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" geoPoint2 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("40.178288")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("116.591813")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n geoPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("geoPoint"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n geoPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("geoPoint1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n geoPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("geoPoint2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoPolygon")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getLocation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" geoPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("ol",[a("li",[s._v("同样的,关于坐标点的入参形式,也支持多种,与官方一致,可以参考GeoBoundingBox中的Tips,这里不赘述.值得注意的是多边形的点数不能少于3个,否则Es无法勾勒出多边形,本次查询会报错.")]),s._v(" "),a("li",[s._v("索引类型和字段类型与GeoBondingBox中的Tips介绍的一样")])])]),s._v(" "),a("h2",{attrs:{id:"geoshape"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#geoshape"}},[s._v("#")]),s._v(" GeoShape")]),s._v(" "),a("p",[s._v("GeoShape:直译为地理图形,怎么理解?乍一看好像和GeoPolygon很像,但实际上,前面三种类型查询的都是坐标点,而此方法查询的是图形,比如一个园区,从世界地图上看可以把它当做一个点,但如果放得足够大,比如把地图具体到杭州市滨江区,园区就可能变成若干个点构成的一个区域,在一些特殊的场景中,需要查询此完整的区域,以及两个区域的交集之类的,就需要用到GeoShape了,如果你还不理解,不妨先接着往下看,以杭州为例,我举一个健康码的例子,假设黑色圈内区域为中风险地区,我现在要查出ES中所有在市民中心且处于中风险区域的人,把他们的健康码统统变成橙色,那实际上我要找的就是下图中橙色那块区域,此时红色箭头所构成的区域是整个市民中心,我可以把整个市民中心作为一个地理图形,然后把黑色大圆作为查询的图形,找出它们的交集即可.")]),s._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/0160ab8d-ac6b-4c6a-b438-bf5da8cd0d34.png",alt:"1"}})]),s._v(" "),a("p",[s._v("上图对应的ShapeRelation为INTERSECTS,看以看下面API.")]),s._v(" "),a("h2",{attrs:{id:"api-4"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api-4"}},[s._v("#")]),s._v(" API")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询符合已索引图形的图形")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexedShapeId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询不符合已索引图形的图形 (0.9.7+ 版本支持)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("notInGeoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexedShapeId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询符合指定图形和图形关系的图形列表")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Geometry")]),s._v(" geometry"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ShapeRelation")]),s._v(" shapeRelation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询不符合指定图形和图形关系的图形列表")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("notInGeoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Geometry")]),s._v(" geometry"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ShapeRelation")]),s._v(" shapeRelation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("h2",{attrs:{id:"使用示例-4"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#使用示例-4"}},[s._v("#")]),s._v(" 使用示例")]),s._v(" "),a("p",[s._v("此API不常用,也可直接跳过看下面通过图形查询的.")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 已知图形索引ID(不常用)\n * 在一些高频场景下,比如一个已经造好的园区,其图形坐标是固定的,因此可以先把这种固定的图形先存进es\n * 后续可根据此图形的id直接查询,比较方便,故有此方法,但不够灵活,不常用\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testGeoShapeWithShapeId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 这里的indexedShapeId为用户事先已经在Es中创建好的图形的id")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getGeoLocation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"edu"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 不符合的情况")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('// wrapper.notInGeoShape(Document::getGeoLocation, "edu");')]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br")])]),a("p",[s._v("此API相较上面方式更常用,即用户可以自行指定要查询的图形是矩形,圆形,还是多边形...(具体看代码中注释):")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 图形由用户自定义(常用),本框架支持Es所有支持的图形:\n * (Point,MultiPoint,Line,MultiLine,Circle,LineaRing,Polygon,MultiPolygon,Rectangle)\n */")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("testGeoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 注意,这里查询的是图形,所以图形的字段索引类型必须为geoShape,不能为geoPoint,故这里用geoLocation字段而非location字段")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 这里以矩形为例演示,其中x,y为圆心坐标,r为半径. 其它图形请读者自行演示,篇幅原因不一一演示了")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Circle")]),s._v(" circle "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Circle")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("14")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// shapeRelation支持多种,如果不传则默认为within")]),s._v("\n wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getGeoLocation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" circle"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ShapeRelation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("INTERSECTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 不符合的情况")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// wrapper.notInGeoShape(Document::getGeoLocation, circle, ShapeRelation.INTERSECTS);")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Document")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" documents "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" documentMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("documents"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("p",[s._v("上述地图中的\n市民中心(多边形)的WKT(Well-Known Text)坐标(模拟的数据,真实数据可从高德地图/百度地图等通过 调用它们提供的开放API获取):")]),s._v(" "),a("p",[s._v('"POLYGON((108.36549282073975 22.797566864832092,108.35974216461182 22.786093175673713,108.37265968322754 22.775963875498206,108.4035587310791 22.77600344454008,108.41003894805907 22.787557113881462,108.39557647705077 22.805360509802284,108.36549282073975 22.797566864832092))";')]),s._v(" "),a("p",[s._v("已经存储在Es中了,实际上我们在项目中都会把可能用到的数据或业务数据都事先存入Es了,否则查询也就无意义了,查个空气? 所以上面API根据GeoShape查询时,需要传入的参数的仅是你圈定的范围的图形(上面该参数是圆).")]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("温馨提示")]),s._v(" "),a("p",[s._v("GeoShape容易和GeoPolygon混淆,需要特别注意,它俩其实是两种不同的东西,其索引类型也需要区别,前者为geo_point,后者为geo_shape。")])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/31.7e645eec.js b/dist/assets/js/31.7e645eec.js new file mode 100644 index 00000000..402c1934 --- /dev/null +++ b/dist/assets/js/31.7e645eec.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{347:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("blockquote",[a("p",[s._v("期待已久的插件模块来了,在此模块大家可以发挥自己的想象力,脑洞大开,自定义插件,可根据自己项目喜好自行开发一些好用的插件, 只要有价值,皆可提交PR,评审通过即可成为EE贡献者,该插件即可供全球开发者使用..")])]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("注意事项")]),s._v(" "),a("ul",[a("li",[s._v("插件模块尽量独立于其它模块,尤其是core模块")]),s._v(" "),a("li",[s._v("插件模块不得过度修改其它模块代码,如有修改,需评估影响范围")]),s._v(" "),a("li",[s._v("插件模块尽量做到可配置,不配置开启时,不可影响其它模块运行及性能安全等")])])]),s._v(" "),a("p",[a("img",{attrs:{src:"https://iknow.hs.net/9c6b157d-4b22-4099-b110-92e318de1d6d.png",alt:"image.png"}})]),s._v(" "),a("h2",{attrs:{id:"拦截器插件"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#拦截器插件"}},[s._v("#")]),s._v(" 拦截器插件")]),s._v(" "),a("blockquote",[a("p",[s._v("本插件由开源团队成员:璐先生贡献")])]),s._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("适用场景")]),s._v(" "),a("p",[s._v("需要对一些方法做特殊前置处理,比如:")]),s._v(" "),a("ul",[a("li",[s._v("需要在执行删除es数据操作前,需要先验证用户权限,或是记录操作记录等")]),s._v(" "),a("li",[s._v("需要在执行查询前,追加一些特殊参数,比如逻辑删除\n总之就是对EE提供的各种API的AOP前置拦截增强.")])])]),s._v(" "),a("h3",{attrs:{id:"需求背景"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#需求背景"}},[s._v("#")]),s._v(" 需求背景")]),s._v(" "),a("p",[s._v("需要拦截本框架提供的selectList方法,然后在此方法的查询参数中追加逻辑删除为未删除的状态作为查询条件")]),s._v(" "),a("h3",{attrs:{id:"使用示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#使用示例"}},[s._v("#")]),s._v(" 使用示例")]),s._v(" "),a("p",[s._v("新增拦截器,通过@Intercepts注解指定拦截的方法列表,通过@Signature注解指定被拦截的类,方法,参数等信息.")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Intercepts")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Signature")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("type "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("BaseEsMapper")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" method "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"selectList"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" args "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Component")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryInterceptor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Interceptor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("intercept")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Invocation")]),s._v(" invocation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Throwable")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"啊啊啊,我拦截到了查询,统一增加查询条件"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 查询条件中统一加入逻辑删除状态为未删除")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" invocation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getArgs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeneralBean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" arg "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsQueryWrapper")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("eq")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeneralBean")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getExistStatus")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" invocation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("proceed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("ol",[a("li",[s._v("需要将此拦截器加上@Component注解,将其加入Spring容器,否则此拦截器不生效.")]),s._v(" "),a("li",[s._v("实现的Interceptor全路径为:com.xpc.easyes.sample.interceptor,而非其它同名拦截器.")])])]),s._v(" "),a("h3",{attrs:{id:"改进建议"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#改进建议"}},[s._v("#")]),s._v(" 改进建议")]),s._v(" "),a("p",[s._v("粒度过于细,不支持通配,比如我想拦截5个方法前缀为selectXXX的方法,需要通过注解配置5次才能实现,\n后续建议可支持通配拦截,比如通过select*拦截指定类中以select打头的所有方法. 后续迭代如果我有时间会优化此处,如有开发者感兴趣欢迎提交改进代码,贡献PR!")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/32.250aacd0.js b/dist/assets/js/32.250aacd0.js new file mode 100644 index 00000000..9414d707 --- /dev/null +++ b/dist/assets/js/32.250aacd0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{349:function(t,s,a){"use strict";a.r(s);var n=a(6),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("1.当碰到有一些需求EE提供的API不支持时怎么办? 没关系,作者早就帮主公们想到最优的解决方案了,请查看这里:"),a("RouterLink",{attrs:{to:"/v1.0.0/060.其它/hybrid-query.html"}},[t._v("混合查询")])],1),t._v(" "),a("p",[t._v("2.试用过程中,报错:java.lang.reflect.UndeclaredThrowableException")]),t._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Caused by: [daily_document] ElasticsearchStatusException[Elasticsearch exception [type=index_not_found_exception, reason=no such index [daily_document]]]\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[t._v("如果您的错误信息和原因与上面一致,请检查索引名称是否正确配置,检查全局配置,注解配置,如果配置无误,可能是索引不存在,您可以通过es-head可视化工具查看是否已存在指定索引,若无此索引,可以通过EE提供的API快速创建.")]),t._v(" "),a("p",[t._v("3.依赖冲突"),a("br"),t._v("尽管EE框架足够轻量,我在研发过程中也尽量避免使用过多其它依赖,但仍难保证在极小概率下发生和宿主项目发生依赖冲突的情况,如果有依赖冲突,开发者可通过移除重复依赖或统一依赖版本号来解决,EE所有可能发生冲突的依赖如下:")]),t._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.projectlombok"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("lombok"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.18.12"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.elasticsearch.client"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("elasticsearch-rest-high-level-client"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("7.10.1"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.elasticsearch"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("elasticsearch"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("7.10.1"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("com.alibaba"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("fastjson"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.2.79"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("commons-codec"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("commons-codec"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.6"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br"),a("span",{staticClass:"line-number"},[t._v("25")]),a("br")])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("报错NoSuchMethod,错误信息大致如下:")])]),t._v(" "),a("blockquote",[a("p",[t._v("EasyEsException: no such method:\nat ExceptionUtils.eee(ExceptionUtils.java:36)\nat BaseCache.lambda$setterMethod$5(BaseCache.java:94)\nat java.util.Optional.orElseThrow(Optional.java:290)")])]),t._v(" "),a("p",[t._v("通常情况下是您实体类Model中无id字段,可复制我下面提供的示例,按需二选一,添加id字段即可,字段类型不限,但字段名称必须叫id.")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 使用es自动生成的Id值")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 如果你的id是自己指定值的,例如用MySQL中该id的值,请加注解")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@TableId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("type "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IdType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CUSTOMIZE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Long")]),t._v(" id"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br")])]),a("p",[t._v('当然也有个别用户反馈说已经加了Id还是报错,不妨去掉@TableId(value="id")注解中的value="id",因为id字段在es中的命名为_id,这点差异我已在框架中做了屏蔽处理,所以用户无需再去指定value.最简单的方式就是直接复制我上面提供的代码.')]),t._v(" "),a("p",[t._v('5.使用wrapper.eq(xx::getXX,"查询内容")查不出来数据?\neq对应的是es的TermQuery(),需要被查询字段的索引类型为keyword时才能查询,如果被查询字段的索引类型为text,那么该字段将无法被eq查询,在使用前不妨先看看自己的需求,是否需要分词匹配,如果需要分词匹配,把该字段的索引类型建立为text类型,然后使用wrapper.match(),wrapper.queryString()等方式查询;如果需要精确匹配,可将该索引字段类型建立为keyword类型,然后使用wrapper.eq()查询; 如果同一个字段,既需要用精确匹配查询,又需要被分词查询,可将其索引类型创建为keyword&text类型,在把它当作keyword类型查询时,需要传入字段名称为“字段名称.keyword”,在把它当text类型查询时,直接用字段名即可。或者不妨将该字段冗余,新增一个字段,值与该字段保持一致,一个索引用keyword,一个用text类型,这样就可以完美化解了,对es而言支持PB级数据,增加一个冗余字段,对性能影响微乎其微.')]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("温馨提示")]),t._v(" "),a("p",[t._v("在框架使用中,难免会因为各种原因导致异常,我们不排除框架本身有缺陷导致,但目前发布的功能中,绝大多数都是比较稳定且有测试用例覆盖及大量用户生产环境验证过的,更多的时候是用户没有按文档使用,自由发挥,导致出现一些问题,这类用户通常还比较懒,一碰到鸡毛大点问题马上来群里问,或是抱怨框架垃圾,然后我们协助排查解决最后发现是xx地方没有按文档使用,而是胡乱搞,我们也很无奈,毕竟做开源,精力和时间也比较有限,我们想把时间花在刀刃上,比如收集真正的bug,去迭代解决,而不是把时间浪费在这些无谓的地方.\n所以我们还是希望用户能在使用前多读文档,遇到问题不妨先从文档下手,看看我们提供的DEMO是怎么写的? 打断点找找原因,看看源码分析分析,经历了这些步骤,如果仍然解决不了,可以再来答疑群里问,这是一个码农基本的素养,而且对提升自身技术水平有很大帮助,如果碰到问题就抛出去,久而久之,自我独立解决和分析问题的能力会越来越差,长此以往,若有一天用了某款开源产品,碰到问题恰好没人答疑,又当何去何从?")])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/33.cdd6e732.js b/dist/assets/js/33.cdd6e732.js new file mode 100644 index 00000000..fd99a531 --- /dev/null +++ b/dist/assets/js/33.cdd6e732.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{352:function(s,t,a){"use strict";a.r(t);var n=a(6),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[s._v("提示")]),s._v(" "),a("p",[s._v("为了减少开发者的额外学习负担,我们尽量保持了和MP几乎一致的语法,但为了避免歧义,仍有个别地方存在些许差异,毕竟ES和MySQL有很多地方不一样,无论如何,在你看完这些差异和原因后,你肯定也会赞同这种差异存在的必要性.")])]),s._v(" "),a("h2",{attrs:{id:"_1-命名差异"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-命名差异"}},[s._v("#")]),s._v(" 1.命名差异")]),s._v(" "),a("p",[s._v("为了区别MP的命名带来的歧义问题,以下三处命名中我们加了Es字母区别于MP:")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th"),s._v(" "),a("th",[s._v("MP")]),s._v(" "),a("th",[s._v("EE")]),s._v(" "),a("th",[s._v("差异原因")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[s._v("启动类注解")]),s._v(" "),a("td",[s._v('@MapperScan("xxx")')]),s._v(" "),a("td",[s._v('@EsMapperScan("xxx")')]),s._v(" "),a("td",[s._v("一个项目中可能会同时用到MP和EE,避免同一系统中同时引入同名注解时,需要加全路径区分")])]),s._v(" "),a("tr",[a("td",[s._v("父类Mapper命名")]),s._v(" "),a("td",[a("code",[s._v("BaseMapper")])]),s._v(" "),a("td",[a("code",[s._v("BaseEsMapper")])]),s._v(" "),a("td",[s._v("一个项目中可能会同时用到MP和EE,避免继承时误继承到MP的Mapper")])]),s._v(" "),a("tr",[a("td",[s._v("条件构造器命名")]),s._v(" "),a("td",[s._v("LambdaQueryWrapper")]),s._v(" "),a("td",[s._v("LambdaEsQueryWrapper")]),s._v(" "),a("td",[s._v("一个项目中可能会同时用到MP和EE,避免错误创建条件构造器")])])])]),s._v(" "),a("h2",{attrs:{id:"_2-移除了service"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-移除了service"}},[s._v("#")]),s._v(" 2.移除了Service")]),s._v(" "),a("p",[s._v("MP中引入了Service层,但EE中并无Service层,因为我个人认为MP的Service层太重了,不够灵活,实际开发中基本不用,被很多人吐槽,所以EE中我直接去掉了Service层,在使用过程中你无需像MP那样继承ISevice,另外我把一些高频使用的service层封装的方法下沉到了mapper层,比如批量更新,批量新增等,大家可以在调用基类Mapper层中的方法时看到,灵活且不失优雅.")]),s._v(" "),a("h2",{attrs:{id:"_3-方法差异"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_3-方法差异"}},[s._v("#")]),s._v(" 3.方法差异")]),s._v(" "),a("p",[s._v("group by 聚合在EE中使用groupBy方法时,调用查询接口必须使用获取原生返回内容,不能像MP中一样返回泛型T,这点是由于ES和MySQL的差导致的,所以需要特别注意")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsUpdateWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsUpdateWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nwrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupBy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("getField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// MP语法")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" list "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" xxxMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// EE语法")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SearchResponse")]),s._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" xxxMapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("search")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("p",[s._v("因为Es会把聚合的结果单独放到aggregations对象中,但原来的实体对象中并无此字段,所以我们需要用SearchResponse接收查询返回的结果,我们所需要的所有查询信息都可以从SearchResponse中获取.")]),s._v(" "),a("div",{staticClass:"language-json line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"aggregations"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"sterms#creator"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"doc_count_error_upper_bound"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"sum_other_doc_count"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"buckets"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"key"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老汉"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"doc_count"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"key"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"老王"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token property"}},[s._v('"doc_count"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("移除了几个我目前还没看到使用场景的方法:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("having")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" sqlHaving"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" params"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("having")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" sqlHaving"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v(" params"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Consumer")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Children")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" condition"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Consumer")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Children")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" consumer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("新增了一些EE有但MP不支持的方法:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 索引创建相关")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("existsIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("createIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updateIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("LambdaEsIndexWrapper")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("T")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" wrapper"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("deleteIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 权重")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("function")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("字段"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" 值"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Float")]),s._v(" 权重值"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// Geo 地理位置相关")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoBoundingBox")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" topLeft"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" bottomRight"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoDistance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Double")]),s._v(" distance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("DistanceUnit")]),s._v(" distanceUnit"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),s._v(" centralGeoPoint"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoPolygon")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GeoPoint")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" geoPoints"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexedShapeId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" indexedShapeId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("geoShape")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("R")]),s._v(" column"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Geometry")]),s._v(" geometry"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ShapeRelation")]),s._v(" shapeRelation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 其它...")]),s._v("\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br")])]),a("p",[s._v("除了需要注意以上列出的这些小差异,其余地方和MP并无明显差异,使用者完全可以像使用MP一样使用EE")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/34.5df37364.js b/dist/assets/js/34.5df37364.js new file mode 100644 index 00000000..89c6619f --- /dev/null +++ b/dist/assets/js/34.5df37364.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{351:function(t,v,_){"use strict";_.r(v);var d=_(6),r=Object(d.a)({},(function(){var t=this,v=t.$createElement,_=t._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h2",{attrs:{id:"mysql和easy-es语法对照表"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#mysql和easy-es语法对照表"}},[t._v("#")]),t._v(" MySQL和Easy-Es语法对照表")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("MySQL")]),t._v(" "),_("th",[t._v("Easy-Es")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("and")]),t._v(" "),_("td",[t._v("and")])]),t._v(" "),_("tr",[_("td",[t._v("or")]),t._v(" "),_("td",[t._v("or")])]),t._v(" "),_("tr",[_("td",[t._v("=")]),t._v(" "),_("td",[t._v("eq")])]),t._v(" "),_("tr",[_("td",[t._v("!=")]),t._v(" "),_("td",[t._v("ne")])]),t._v(" "),_("tr",[_("td",[t._v(">")]),t._v(" "),_("td",[t._v("gt")])]),t._v(" "),_("tr",[_("td",[t._v(">=")]),t._v(" "),_("td",[t._v("ge")])]),t._v(" "),_("tr",[_("td",[t._v("<")]),t._v(" "),_("td",[t._v("lt")])]),t._v(" "),_("tr",[_("td",[t._v("<=")]),t._v(" "),_("td",[t._v("le")])]),t._v(" "),_("tr",[_("td",[t._v("like '%field%'")]),t._v(" "),_("td",[t._v("like")])]),t._v(" "),_("tr",[_("td",[t._v("not like '%field%'")]),t._v(" "),_("td",[t._v("notLike")])]),t._v(" "),_("tr",[_("td",[t._v("like '%field'")]),t._v(" "),_("td",[t._v("likeLeft")])]),t._v(" "),_("tr",[_("td",[t._v("like 'field%'")]),t._v(" "),_("td",[t._v("likeRight")])]),t._v(" "),_("tr",[_("td",[t._v("between")]),t._v(" "),_("td",[t._v("between")])]),t._v(" "),_("tr",[_("td",[t._v("notBetween")]),t._v(" "),_("td",[t._v("notBetween")])]),t._v(" "),_("tr",[_("td",[t._v("is null")]),t._v(" "),_("td",[t._v("isNull")])]),t._v(" "),_("tr",[_("td",[t._v("is notNull")]),t._v(" "),_("td",[t._v("isNotNull")])]),t._v(" "),_("tr",[_("td",[t._v("in")]),t._v(" "),_("td",[t._v("in")])]),t._v(" "),_("tr",[_("td",[t._v("not in")]),t._v(" "),_("td",[t._v("notIn")])]),t._v(" "),_("tr",[_("td",[t._v("group by")]),t._v(" "),_("td",[t._v("groupBy")])]),t._v(" "),_("tr",[_("td",[t._v("order by")]),t._v(" "),_("td",[t._v("orderBy")])]),t._v(" "),_("tr",[_("td",[t._v("min")]),t._v(" "),_("td",[t._v("min")])]),t._v(" "),_("tr",[_("td",[t._v("max")]),t._v(" "),_("td",[t._v("max")])]),t._v(" "),_("tr",[_("td",[t._v("avg")]),t._v(" "),_("td",[t._v("avg")])]),t._v(" "),_("tr",[_("td",[t._v("sum")]),t._v(" "),_("td",[t._v("sum")])]),t._v(" "),_("tr",[_("td",[t._v("sum")]),t._v(" "),_("td",[t._v("sum")])]),t._v(" "),_("tr",[_("td",[t._v("-")]),t._v(" "),_("td",[t._v("orderByAsc")])]),t._v(" "),_("tr",[_("td",[t._v("-")]),t._v(" "),_("td",[t._v("orderByDesc")])]),t._v(" "),_("tr",[_("td",[t._v("-")]),t._v(" "),_("td",[t._v("match")])]),t._v(" "),_("tr",[_("td",[t._v("-")]),t._v(" "),_("td",[t._v("highLight")])]),t._v(" "),_("tr",[_("td",[t._v("...")]),t._v(" "),_("td",[t._v("...")])])])])])}),[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/35.9b536766.js b/dist/assets/js/35.9b536766.js new file mode 100644 index 00000000..ced2b0b6 --- /dev/null +++ b/dist/assets/js/35.9b536766.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{355:function(e,r,t){"use strict";t.r(r);var s=t(6),a=Object(s.a)({},(function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("...")]),e._v(" "),t("p",[t("s",[t("a",{attrs:{href:"https://gitee.com/dromara/easy-es/releases/V0.9.12",target:"_blank",rel:"noopener noreferrer"}},[e._v("v0.9.12"),t("OutboundLink")],1)])]),e._v(" "),t("p",[t("s",[t("a",{attrs:{href:"https://gitee.com/dromara/easy-es/releases/V0.9.13",target:"_blank",rel:"noopener noreferrer"}},[e._v("v0.9.13"),t("OutboundLink")],1)])]),e._v(" "),t("p",[t("s",[t("a",{attrs:{href:"https://gitee.com/dromara/easy-es/releases/V0.9.14",target:"_blank",rel:"noopener noreferrer"}},[e._v("v0.9.14"),t("OutboundLink")],1)])]),e._v(" "),t("p",[t("s",[t("a",{attrs:{href:"https://gitee.com/dromara/easy-es/releases/V0.9.15",target:"_blank",rel:"noopener noreferrer"}},[e._v("v0.9.15"),t("OutboundLink")],1)])]),e._v(" "),t("p",[t("s",[t("a",{attrs:{href:"https://gitee.com/dromara/easy-es/releases/V0.9.16",target:"_blank",rel:"noopener noreferrer"}},[e._v("v0.9.16"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("...")]),e._v(" "),t("p",[t("s",[t("a",{attrs:{href:"https://gitee.com/dromara/easy-es/releases/v0.9.40",target:"_blank",rel:"noopener noreferrer"}},[e._v("v0.9.40"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("持续更新中...")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("提示")]),e._v(" "),t("p",[e._v("已发布的版本会被用删除线标记")])])])}),[],!1,null,null,null);r.default=a.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/36.61cc3afd.js b/dist/assets/js/36.61cc3afd.js new file mode 100644 index 00000000..62485c74 --- /dev/null +++ b/dist/assets/js/36.61cc3afd.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{356:function(t,a,e){"use strict";e.r(a);var r=e(6),s=Object(r.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h2",{attrs:{id:"版本更新计划"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#版本更新计划"}},[t._v("#")]),t._v(" 版本更新计划")]),t._v(" "),e("p",[t._v("期待已久的1.0稳定版连同全新官网和文档一起正式上线,届时将显著降低发版频率,因为功能已经基本上成熟且非常丰富了,可以放心的在生产环境投产使用.\n后期的迭代也会更慢,力求稳如老狗,API稳定性将排在第一位,另外节省出来的时间会发更多力在项目推广上,让更多人用到EE.")]),t._v(" "),e("h2",{attrs:{id:"需求池"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#需求池"}},[t._v("#")]),t._v(" 需求池")]),t._v(" "),e("blockquote",[e("p",[t._v("需求池中需求待排期,看迭代规划,择期上线")])]),t._v(" "),e("ol",[e("li",[t._v("xpack本地秘钥型权限校验模块配置功能 由网友@周立波邮件本人提出此需求支持 8.0+es才有,所以此需求预计将在很长时间之后才会支持")]),t._v(" "),e("li",[t._v("Percolate反向检索支持,由码云用户Earl提出")]),t._v(" "),e("li",[t._v("提供插件支持按日/周/月/年等自定义规则自动生成索引并切换索引")]),t._v(" "),e("li",[t._v("提供多数据源支持")]),t._v(" "),e("li",[t._v("提供对各种非springboot框架的支持")])]),t._v(" "),e("p",[t._v("持续更新中...")])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/37.ec29b472.js b/dist/assets/js/37.ec29b472.js new file mode 100644 index 00000000..f93a275d --- /dev/null +++ b/dist/assets/js/37.ec29b472.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{354:function(e,t,r){"use strict";r.r(t);var n=r(6),a=Object(n.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("本框架为了保持与MP一致的语法,有部分代码来源于开源框架"),r("a",{attrs:{href:"https://mp.baomidou.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mybatis-Plus"),r("OutboundLink")],1),e._v(",或是对其做了修改,在此特别声明.")]),e._v(" "),r("p",[e._v("本框架底层使用了ElasticSearch官方开源框架"),r("a",{attrs:{href:"https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("RestHighLevelClient"),r("OutboundLink")],1),e._v(",在此特别声明.")]),e._v(" "),r("p",[e._v("本框架采用和Mybatis-plus一样的"),r("a",{attrs:{href:"https://www.apache.org/licenses/LICENSE-2.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("Apache2.0开源协议"),r("OutboundLink")],1),e._v(",并且承诺永不参与商业用途,仅供大家无偿使用.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/38.7ff1bc74.js b/dist/assets/js/38.7ff1bc74.js new file mode 100644 index 00000000..a17da8dd --- /dev/null +++ b/dist/assets/js/38.7ff1bc74.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{357:function(t,e,s){"use strict";s.r(e);var a=s(6),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("提示")]),t._v(" "),s("p",[t._v("这里特别鸣谢国内最受欢迎的MySQL开源框架"),s("a",{attrs:{href:"https://mp.baomidou.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mybatis-Plus"),s("OutboundLink")],1),t._v("的作者及所有参与开发者.\n鸣谢ElasticSearch官方打造的开源框架"),s("a",{attrs:{href:"https://www.elastic.co/guide/en/elasticsearch/client/java-rest/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("RestHighLevelClient"),s("OutboundLink")],1),t._v("\n的作者及其所有参与开发者.\n感谢协助本人将语雀中数量庞大的"),s("a",{attrs:{href:"https://www.yuque.com/laohan-14b9d/tald79/qf7ns2",target:"_blank",rel:"noopener noreferrer"}},[t._v("Easy-Es英文文档"),s("OutboundLink")],1),t._v('悉数迁移至本站的"清风徐飘"先生,由衷感谢!')])]),t._v(" "),s("p",[t._v("感谢MP和ES官方开源如此强大又好用的框架,由此带来国内外无数开发者的解放,大幅提高了开发搬砖效率,由此给众多开发者节省了大量宝贵时间.也给我提供了创作灵感,可以说没有Mybatis-Plus就没有Easy-Es,当然未来也或许会有,但起码不会这么快和大家见面,也或许是其它作者开发. Mybatis-Plus和Easy-Es的关系,就像F22和歼20的关系,在框架开发的过程中,无论是为了兼容语法还是一些未知点的突破,MP都给予了恰到好处的指引,让我少走了很多弯路,把别人好几年走完的路,作为起点,站在巨人的肩膀上,由此打造出一款非常易用的ES-ORM框架.")]),t._v(" "),s("p",[t._v("为了保持与MP99%相似度的语法,EE框架在开发过程中大量借鉴了MP源码,如果不深入底层看,仅看接口定义,会误以为是复制粘贴MP接口,但底层逻辑终究是不一样的,MP最终是将语法转换成String SQL, 而EE最终是将语法转换成JSON类型的ES语法,本质上还是有挺大差别,这里面依旧有很多创新点和难点需要突破,由于ES天然的复杂性和高门槛,开发EE的难度要远大于MP,期间有几个难点,一度让我产生放弃的念头,还好最后通过各种努力和思考,以及坚持不懈,完成了整个框架的开发,测试,文档撰写等.")]),t._v(" "),s("p",[t._v('现在,我将此框架源码开源献给全球所有开发者,毕竟凝聚了国内外各路优秀开发者的思路,那才有可能打造真正的"Easyest",否则它只能是Easy-ES.')]),t._v(" "),s("p",[t._v("如果本框架有在开发过程中帮您提高开发效率,节省了开发时间,不妨花几秒钟时间(打造此框架前后耗费大量光阴)给本框架在Git点个Star,让更多人看到并用到它,不做拿来主义者,从我做起!")]),t._v(" "),s("p",[t._v("最后感谢每一位支持EE的您, 感谢您对EE的支持,谢谢! 也谢谢社区所有为EE贡献过建议及代码的伙伴,以及为了EE无私奉献的自己.")]),t._v(" "),s("p",[t._v("by老汉")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/39.1e998fde.js b/dist/assets/js/39.1e998fde.js new file mode 100644 index 00000000..b4d46062 --- /dev/null +++ b/dist/assets/js/39.1e998fde.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{359:function(t,_,e){"use strict";e.r(_);var v=e(6),r=Object(v.a)({},(function(){var t=this,_=t.$createElement,e=t._self._c||_;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("话说东汉末年,天下动荡,豪杰纷起,群雄逐鹿。天下苦ES语法久矣,十八路猪猴人人愿得而诛之,此间有一")]),t._v(" "),e("p",[t._v("乡勇,名曰“老汉”,布衣出身,此人生得头脑复杂,四肢发达,有匹夫不当之勇。 正当众人无计可施之际,")]),t._v(" "),e("p",[t._v("只见此人仰天长叹,吟得一首好诗:")]),t._v(" "),e("p",[t._v("《韭菜》\n-老汉")]),t._v(" "),e("p",[t._v("键盘敲得肌无力,秃头枸杞曾太拼。")]),t._v(" "),e("p",[t._v("编码未捷身先死,长使老汉泪满襟。")]),t._v(" "),e("p",[t._v("闻此诗者,无不临诗涕零。 正此间,有一人破口大骂:大丈夫不为天下效力,何故在此痛哭? 尔等能哭死ES乎?")]),t._v(" "),e("p",[t._v("何不用MP语法简化之!老汉顿悟,撸起衣袖,麒麟臂显露,一顿操作猛如虎,日以继夜,攻城拔寨数载,终于...")]),t._v(" "),e("p",[t._v("时间来到了2021年,Easy-Es诞生了,最初是用于公司一核心项目上,经过生产大量验证后,开始大幅改造并全面")]),t._v(" "),e("p",[t._v("开源,旨在帮助全球众多开发者减轻开发负担。开源后,迅速获得了很多人的关注,曾长期占据Gitee热搜榜首位。")]),t._v(" "),e("p",[t._v("目前Easy-Es被运用在国内很多知名的公司核心项目上,为很多一线开发者带来了福音,大幅降低了ES搜索引擎使用")]),t._v(" "),e("p",[t._v("门槛。Easy-Es社区活跃,维护和迭代工作也一直进行着,代码活跃度>85%,流行趋势>99%,开源半年收获累计")]),t._v(" "),e("p",[t._v("2K+ Star,捐赠金额超1K,社区群累计成员超500人...Easy-Es是一个年轻有生命力的开源项目,自开源以来,")]),t._v(" "),e("p",[t._v("已经上线的功能,在功能丰富度和易用度上已经全面超越SpringData-Elasticsearch,跃居ES-ORM框架 领域")]),t._v(" "),e("p",[t._v("NO.?,我不说用户心里也自有答案。由于ES高门槛,高复杂性,项目中使用低频等特性,导致投入和产出不成正比,")]),t._v(" "),e("p",[t._v("因此这个赛道开源几乎没什么竞争对手,国内仅此一家,国外仅Spring在做,我们的目标就是在各方面全面 超越它,")]),t._v(" "),e("p",[t._v("我们不做老二,为国产开源争口气!")]),t._v(" "),e("p",[t._v("如果您也喜欢Easy-Es,可以在Gitee,Github上watch,star和fork三连支持我们,并进入社区群提问和探讨技术。")]),t._v(" "),e("p",[t._v("Easy-Es的Gitee仓库:"),e("a",{attrs:{href:"https://gitee.com/dromara/easy-es",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://gitee.com/dromara/easy-es"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("Easy-Es的Github仓库:"),e("a",{attrs:{href:"https://github.com/dromara/easy-es",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/dromara/easy-es"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("您也可以添加作者微信, 和作者共同交流开源技术,或是探讨健身问题,作者热爱健身,目前健身8年,洛奇健美认证。")]),t._v(" "),e("p",[t._v("作者那糟老头子,还是个车迷,懂车帝,爱钓鱼,户外,是个兴趣爱好广泛的斜杆青年,喜欢结交天下豪杰,如果您也")]),t._v(" "),e("p",[t._v("臭味相投,不妨扫描下面二维码添加我微信,交个朋友。")]),t._v(" "),e("p",[e("img",{attrs:{src:"/img/wx.png",alt:"img"}})])])}),[],!1,null,null,null);_.default=r.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/40.58cc87fe.js b/dist/assets/js/40.58cc87fe.js new file mode 100644 index 00000000..4e283a08 --- /dev/null +++ b/dist/assets/js/40.58cc87fe.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{360:function(t,s,n){"use strict";n.r(s);var e=n(6),p=Object(e.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("Easy-Es是轻量,快速,易用,自动化程度较高的ES搜索引擎ORM框架,自从开源以来,我们收到了很多人")]),t._v(" "),n("p",[t._v("的使用反馈,并听取这些反馈进行迭代和新特性开发。如果您在使用中有问题,或者想咨询了解,可以加入")]),t._v(" "),n("p",[t._v("群聊,我会细心答复每一个人的疑问。由于微信群二维码有效期只有7天,所以这里不方便放微信群二维码,")]),t._v(" "),n("p",[t._v("您可以添加我微信,加好友时备注"),n("code",[t._v("EE")]),t._v(",我会拉你入群。 如果您不习惯用微信,我们也有QQ群,QQ群相对")]),t._v(" "),n("p",[t._v("回复较慢,我们以微信群为主。")]),t._v(" "),n("p",[n("img",{attrs:{src:"/img/wx.png",alt:"微信"}}),t._v(" "),n("img",{attrs:{src:"/img/qq-group.png",alt:"QQ群"}})]),t._v(" "),n("p",[t._v("微信(左图)| QQ群(右图)")])])}),[],!1,null,null,null);s.default=p.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/41.25979c3d.js b/dist/assets/js/41.25979c3d.js new file mode 100644 index 00000000..0c3a112b --- /dev/null +++ b/dist/assets/js/41.25979c3d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{353:function(s,t,a){"use strict";a.r(t);var e=a(6),r=Object(e.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("p",[s._v("欢迎您加入和我们一起贡献Easy-Es,让这个项目变的越来越好。")]),s._v(" "),a("h2",{attrs:{id:"要求"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#要求"}},[s._v("#")]),s._v(" 要求")]),s._v(" "),a("p",[s._v("社区有很多童鞋愿意贡献这个项目,如果你想参与开发,成为committer,有以下要求:")]),s._v(" "),a("ul",[a("li",[a("p",[s._v("需要对开源有热情,技术扎实,有一颗用爱发电的心。")])]),s._v(" "),a("li",[a("p",[s._v("需要有一定空余时间能参与开发和阅读源码。")])])]),s._v(" "),a("h2",{attrs:{id:"如何加入开发团队"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何加入开发团队"}},[s._v("#")]),s._v(" 如何加入开发团队")]),s._v(" "),a("p",[s._v("首先你需要加入Easy-Es的社区群,如何加入请参考"),a("RouterLink",{attrs:{to:"/pages/kd129d/"}},[s._v("加入社区讨论")]),s._v(",然后私聊我,表示有意成为开发者。")],1),s._v(" "),a("p",[s._v("我会把你拉入开发者团队。")]),s._v(" "),a("h2",{attrs:{id:"如何认领任务"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何认领任务"}},[s._v("#")]),s._v(" 如何认领任务")]),s._v(" "),a("p",[s._v("我会不定期的在开发者团队群里push出一些issue,采用自己认领的方式。")]),s._v(" "),a("p",[s._v("在相关issue下回复“认领”就可以了,不用在群里回复。如果已经有相关人员认领了,请不要重复认领。")]),s._v(" "),a("h2",{attrs:{id:"提交pr"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#提交pr"}},[s._v("#")]),s._v(" 提交PR")]),s._v(" "),a("p",[s._v("Easy-Es的PR统一在Gitee平台上进行提交,如果你不知道如何提交PR,可以在Gitee平台里去学习。这里不作说明。")]),s._v(" "),a("p",[s._v("提PR有以下注意点。")]),s._v(" "),a("ul",[a("li",[s._v("fork后切换到"),a("code",[s._v("feature")]),s._v("分支,请以这个分支为开发基准。")]),s._v(" "),a("li",[s._v("所有的PR提交到"),a("code",[s._v("feature")]),s._v("分支,这个分支为开发分支。")]),s._v(" "),a("li",[s._v("如果你作了功能性的变动,请带上你的测试用例,测试用例规范可以参考之前的测试用例。")]),s._v(" "),a("li",[s._v("所有的PR必须关联至少一个issue,如果没有相关issue,请自行创建一个。")]),s._v(" "),a("li",[s._v("正式提交PR之前,请确保所有的测试用例都通过。")]),s._v(" "),a("li",[s._v("提交信息,均要符合要求,下面有讲述。")])]),s._v(" "),a("h2",{attrs:{id:"注释以及comment的要求"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#注释以及comment的要求"}},[s._v("#")]),s._v(" 注释以及Comment的要求")]),s._v(" "),a("p",[s._v("在文件头上,一定得有相关头注释信息,请按照规范,如下所示:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 这是你对这个类的描述,如比较长,多行也行\n * @author 老汉\n * @since 2.6.4\n */")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("YourClass")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("p",[s._v("相关重要代码,为了保证阅读性,也请加上必要的注释, 并尽量遵循阿里巴巴代码开发规约")]),s._v(" "),a("p",[s._v("提交的时候comment也要按照规范来填写:")]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("#bug/future/enhancement/ #issue号 这是你issue的中文描述\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("举例:")]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("enhancemnet #I595MU 在slot的元数据里增加每个组件执行的耗时和是否成功结果\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h2",{attrs:{id:"写代码时要注意的点"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#写代码时要注意的点"}},[s._v("#")]),s._v(" 写代码时要注意的点")]),s._v(" "),a("p",[s._v("开源框架的代码质量的要求会比较高,不仅是实现那么简单,还要考虑到各个环境的兼容性,优雅性和可读性。")]),s._v(" "),a("p",[s._v("所以在写代码时要多想一下。我相信,高标准高要求才能塑造一个优秀的框架, 这对您未来的技术成长也会非常有帮助。")]),s._v(" "),a("p",[s._v("在代码合并时,我会在PR下面给出修改意见,可能会比较苛刻,吹毛求疵。请大家谅解,完全是针对代码质量而不是针")]),s._v(" "),a("p",[s._v("对谁。开源项目要想长久发展,代码质量肯定是要严格把控的,否则这么多开发者,人手一套风格,最终将难以维护。")]),s._v(" "),a("h2",{attrs:{id:"我想对committer说的话"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#我想对committer说的话"}},[s._v("#")]),s._v(" 我想对Committer说的话")]),s._v(" "),a("p",[s._v("熟读代码+完成一个issue并合并到master分支的时候,我会邀请你成为LiteFlow的Committer,通常会在发版前统一邀请。")]),s._v(" "),a("p",[s._v("虽然原则上只需要完成一个issue,issue本身难易程度也有区别,但我希望作为贡献者的你不要满足只提交一个issue,希望")]),s._v(" "),a("p",[s._v("你能成为长期的Committer,来一起参与LiteFlow这个框架的迭代和发展和决策讨论中。只有这样,开源框架才能发展的更")]),s._v(" "),a("p",[s._v("加蓬勃,开源也会作为你成长和技术提高的途径。")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/42.ea91845c.js b/dist/assets/js/42.ea91845c.js new file mode 100644 index 00000000..1282bfff --- /dev/null +++ b/dist/assets/js/42.ea91845c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{358:function(t,e,r){"use strict";r.r(e);var a=r(6),s=Object(a.a)({},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"用爱发电"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#用爱发电"}},[t._v("#")]),t._v(" 用爱发电")]),t._v(" "),r("p",[t._v("如果您正在使用这个项目并感觉良好,或是想支持我们继续开发,您可以通过如下方式支持我们:")]),t._v(" "),r("p",[t._v("1.Star并向您的朋友推荐或分享"),r("a",{attrs:{href:"https://gitee.com/dromara/easy-es",target:"_blank",rel:"noopener noreferrer"}},[t._v("Easy-Es"),r("OutboundLink")],1),t._v("🚀")]),t._v(" "),r("p",[t._v("2.轻轻点击一次上面的广告链接🙃")]),t._v(" "),r("p",[t._v("2.通过"),r("a",{attrs:{href:"https://gitee.com/dromara/easy-es",target:"_blank",rel:"noopener noreferrer"}},[t._v("Gitee"),r("OutboundLink")],1),t._v("直接捐赠,或者扫描下面二维码进行一次性捐款赞助,请作者喝一杯咖啡☕️")]),t._v(" "),r("p",[t._v("非常感谢您对开源精神的支持!❤")]),t._v(" "),r("p",[r("img",{staticStyle:{zoom:"95%"},attrs:{src:t.$withBase("/img/vx-donate.png")}}),r("img",{staticStyle:{zoom:"95%"},attrs:{src:t.$withBase("/img/alipay-donate.png")}})]),t._v(" "),r("p",[t._v("微信(左图)| 支付宝(右图)")]),t._v(" "),r("h2",{attrs:{id:"成为赞助商"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#成为赞助商"}},[t._v("#")]),t._v(" 成为赞助商")]),t._v(" "),r("p",[t._v("1.赞助任意金额,您将获得"),r("RouterLink",{attrs:{to:"/pages/b52ac5/"}},[t._v("赞助者列表")]),t._v("的永久留名。")],1),t._v(" "),r("p",[t._v("2.赞助达到20元,您将获得"),r("RouterLink",{attrs:{to:"/pages/b52ac5/"}},[t._v("赞助者列表")]),t._v("的永久留名,并可附上在赞助者列表里的投放链接。")],1),t._v(" "),r("p",[t._v("3.赞助达50元,您额外获得"),r("a",{attrs:{href:"https://easy-es.cn/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Easy-Es"),r("OutboundLink")],1),t._v("的私下VIP 1对1的技术咨询服务(长达1年)。")]),t._v(" "),r("p",[t._v("4.赞助达100元,您将额外同时获得"),r("a",{attrs:{href:"https://easy-es.cn/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Easy-Es"),r("OutboundLink")],1),t._v("文档首页的赞助者广告展示栏位(长达1年),")]),t._v(" "),r("p",[t._v("并可为您量身定制健身计划一份。")]),t._v(" "),r("p",[t._v("5.赞助超过100元? 壮士请留步,老汉愿以身相许!")]),t._v(" "),r("blockquote",[r("p",[r("a",{attrs:{href:"https://easy-es.cn/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Easy-Es"),r("OutboundLink")],1),t._v("官网目前每月大约有10w+的浏览量。")])]),t._v(" "),r("p",[t._v("相关联系方式(添加烦请注明来意):")]),t._v(" "),r("ul",[r("li",[r("p",[t._v("微信|QQ:252645816")])]),t._v(" "),r("li",[r("p",[t._v("邮件:xpc@dromara.org")])])]),t._v(" "),r("h2",{attrs:{id:"致谢"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#致谢"}},[t._v("#")]),t._v(" 致谢")]),t._v(" "),r("p",[t._v("感谢给予支持的朋友,您的支持是鼓励我们前行的动力❣")])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/43.878163cb.js b/dist/assets/js/43.878163cb.js new file mode 100644 index 00000000..94ebac6e --- /dev/null +++ b/dist/assets/js/43.878163cb.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{362:function(t,e,n){"use strict";n.r(e);var a=n(6),l=Object(a.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"center"}},[t._v("赞助人")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("金额")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("TA的留言/分享")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("赞助渠道")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("赞助时间")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("投放链接")])])]),t._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("Con")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥1")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("码云")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-04")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*头")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥100")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-06-13")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*慢")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥6")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("希望EE做的越来越好")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-06-12")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("L*e")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥20")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("为EE而来,大佬加油")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-06-06")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*天")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥6.66")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-05-16")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*蓝")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥6.66")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("大力支持,希望成为mp")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-05-13")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*。")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥20")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("大佬牛逼,可以公开")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-04-23")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("以梦为马,不负韶华")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥50")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("加油")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-04-15")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*🐝")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥66.66")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("Easy-Es🐮")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-04-14")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*钧")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥0.1")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-04-08")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*吗")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥0.1")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-04-08")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*⑧")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥20")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("请大佬喝☕,牛批")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-04-04")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("很拽の土豆")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥10")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("码云")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-04")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("很拽の土豆")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥10")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("码云")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-04")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*🐸")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥50")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("请大佬喝咖啡 加油")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03-29")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("**尨")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥ 150")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("支付宝")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03-26")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("**兵")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥ 199")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("支付宝")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03-24")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("S*B")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥5")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("很喜欢你的项目 支持")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03-23")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*来")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥50")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03-22")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("**洲")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥10")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("开源不易 感谢大佬 喝杯咖啡")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("支付宝")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03-19")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("r*n")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥5")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03-16")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("以梦为马,不负韶华")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥50")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("加油")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03-10")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("神秘的凯")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥1.88")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("码云")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("jackkang")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥20")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("码云")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("chenzf")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥1")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("码云")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-03")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*y")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥50")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("Es顶,一杯咖啡请笑纳")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-02-25")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("*松")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥2")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("支付宝")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-02-16")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("橘子皮")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥6.66")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-01-19")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("cj")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("¥5")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("微信")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2022-01-19")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("无")])])])])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/44.922896ef.js b/dist/assets/js/44.922896ef.js new file mode 100644 index 00000000..9cf51964 --- /dev/null +++ b/dist/assets/js/44.922896ef.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{363:function(a,r,t){"use strict";t.r(r);var s=t(6),e=Object(s.a)({},(function(){var a=this,r=a.$createElement,t=a._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("p",[a._v("Easy-Es由国内知名开源组织Dromara孵化。")]),a._v(" "),t("h2",{attrs:{id:"关于dromara"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#关于dromara"}},[a._v("#")]),a._v(" 关于Dromara")]),a._v(" "),t("p",[a._v("Dromara是由国内顶尖的开源项目作者共同组成的开源社区。")]),a._v(" "),t("p",[a._v("提供包括开源网关,分布式事务,流行工具,企业级认证,微服务RPC,运维监控,Agent监控,分布式日志,调度编排等")]),a._v(" "),t("p",[a._v("一系列开源产品、解决方案与咨询、技术支持与培训认证服务。技术栈全面开源共建、保持社区中立,致力于为全球用户提")]),a._v(" "),t("p",[a._v("供微服务云原生解决方案。让参与的每一位开源爱好者,体会到开源的快乐。Dromara开源社区目前拥有10+GVP项目,")]),a._v(" "),t("p",[a._v("总star数量超过十万,构建了上万人的开源社区,有成千上万的个人及团队在使用Dromara社区的开源项目。")]),a._v(" "),t("h2",{attrs:{id:"更多生态资源"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#更多生态资源"}},[a._v("#")]),a._v(" 更多生态资源")]),a._v(" "),t("p",[a._v("请移步至"),t("a",{attrs:{href:"ttps://gitee.com/dromara"}},[a._v("Dromara码云首页")]),a._v(" 查看。")])])}),[],!1,null,null,null);r.default=e.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/45.8a0b42b7.js b/dist/assets/js/45.8a0b42b7.js new file mode 100644 index 00000000..5c9505df --- /dev/null +++ b/dist/assets/js/45.8a0b42b7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{361:function(t,r,e){"use strict";e.r(r);var s=e(6),n=Object(s.a)({},(function(){var t=this,r=t.$createElement,e=t._self._c||r;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("table",[e("thead",[e("tr",[e("th",[t._v("公司名称")]),t._v(" "),e("th",[t._v("LOGO")]),t._v(" "),e("th",[t._v("公司名称")]),t._v(" "),e("th",[t._v("LOGO")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[e("a",{attrs:{href:"unknow"}},[t._v("成都岸靠网络科技有限公司")])]),t._v(" "),e("td",[e("img",{attrs:{src:"/img/users/ka.png",alt:"成都岸靠网络科技有限公司"}})]),t._v(" "),e("td",[e("a",{attrs:{href:"www.jiansheji.cn"}},[t._v("世纪开元智印互联科技集团股份有限公司")])]),t._v(" "),e("td",[e("img",{attrs:{src:"/img/users/sjky.png",alt:"世纪开元智印互联科技集团股份有限公司"}})])]),t._v(" "),e("tr",[e("td",[e("a",{attrs:{href:"unknow"}},[t._v("杭州益仓网络科技有限公司")])]),t._v(" "),e("td",[e("img",{attrs:{src:"/img/users/hzyc.png",alt:"杭州益仓网络科技有限公司"}})]),t._v(" "),e("td",[e("a",{attrs:{href:"unknow"}},[t._v("杭州知友网络科技有限公司")])]),t._v(" "),e("td",[e("img",{attrs:{src:"/img/users/hzzy.png",alt:"杭州知友网络科技有限公司"}})])]),t._v(" "),e("tr",[e("td",[e("a",{attrs:{href:"http://www.mengning.xyz/",target:"_blank",rel:"noopener noreferrer"}},[t._v("成都梦柠科技"),e("OutboundLink")],1)]),t._v(" "),e("td",[e("img",{attrs:{src:"/img/users/cdmnkj.png",alt:"成都梦柠科技"}})]),t._v(" "),e("td",[e("a",{attrs:{href:"http://officialpc.fuhangbeiyue.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("富航百悦电子商务有限责任公司"),e("OutboundLink")],1)]),t._v(" "),e("td",[e("img",{attrs:{src:"/img/users/fhby.png",alt:"富航百悦电子商务有限责任公司"}})])]),t._v(" "),e("tr",[e("td",[e("a",{attrs:{href:"http://www.dhcc.com.cn/",target:"_blank",rel:"noopener noreferrer"}},[t._v("东华软件股份公司"),e("OutboundLink")],1)]),t._v(" "),e("td",[e("img",{attrs:{src:"/img/users/dhrj.png",alt:"东华软件股份公司"}})]),t._v(" "),e("td",[e("a",{attrs:{href:"http://dhcclouds.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("东华云都技术有限公司"),e("OutboundLink")],1)]),t._v(" "),e("td",[e("img",{attrs:{src:"/img/users/dhyd.png",alt:"东华云都技术有限公司"}})])])])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("登记")]),t._v(" "),e("p",[t._v("为了更好地为您提供服务,请在此"),e("a",{attrs:{href:"https://gitee.com/dromara/easy-es/issues/I5BKHI",target:"_blank",rel:"noopener noreferrer"}},[t._v("登记"),e("OutboundLink")],1),t._v("。")]),t._v(" "),e("p",[t._v("展位资源有限,先到先得,公司不论大小,排序以issue中提交时间为准,越早提交排名越靠前.")]),t._v(" "),e("p",[t._v("感谢您的支持!")])])])}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/7.6ca3dc74.js b/dist/assets/js/7.6ca3dc74.js new file mode 100644 index 00000000..8b84f3d5 --- /dev/null +++ b/dist/assets/js/7.6ca3dc74.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{329:function(t,e,s){"use strict";s.r(e);var r=s(6),a=Object(r.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"简介"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#简介"}},[t._v("#")]),t._v(" 简介")]),t._v(" "),s("p",[t._v("Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发.")]),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v("理念")]),t._v(" 把简单,易用,方便留给用户,把复杂留给框架.")])]),t._v(" "),s("blockquote",[s("p",[s("strong",[t._v("愿景")]),t._v(" 让天下没有难用的Es, 致力于成为全球最受欢迎的ElasticSearch搜索引擎开发框架.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://iknow.hs.net/9fa0407f-30ff-4d8b-82da-a4990e41a04b.png",alt:"logo"}})]),t._v(" "),s("h2",{attrs:{id:"优势"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#优势"}},[t._v("#")]),t._v(" 优势")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("全自动索引托管:")]),t._v(" 全球开源首创的索引托管模式,开发者无需关心索引的创建更新及数据迁移等繁琐步骤,索引全生命周期皆可托管给框架,由框架自动完成,过程零停机,用户无感知,彻底解放开发者")]),t._v(" "),s("li",[s("strong",[t._v("屏蔽语言差异:")]),t._v(" 开发者只需要会MySQL语法即可使用Es,真正做到一通百通,无需学习枯燥易忘的Es语法,Es使用相对MySQL较低频,学了长期不用也会忘,没必要浪费这时间.开发就应该专注于业务,省下的时间去撸铁,去陪女朋友陪家人,不做资本家的韭菜")]),t._v(" "),s("li",[s("strong",[t._v("代码量极少:")]),t._v(" 与直接使用RestHighLevelClient相比,相同的查询平均可以节省3-5倍左右的代码量")]),t._v(" "),s("li",[s("strong",[t._v("零魔法值:")]),t._v(" 字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值,提高代码可读性,杜绝因字段名称修改而代码漏改带来的Bug")]),t._v(" "),s("li",[s("strong",[t._v("零额外学习成本:")]),t._v(" 开发者只要会国内最受欢迎的Mybatis-Plus语法,即可无缝迁移至EE,EE采用和前者相同的语法,消除使用者额外学习成本,直接上手,爽")]),t._v(" "),s("li",[s("strong",[t._v("降低开发者门槛:")]),t._v(" Es通常需要中高级开发者才能驾驭,但通过接入EE,即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发,可以提高人员利用率,降低企业成本")])]),t._v(" "),s("h2",{attrs:{id:"特性"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#特性"}},[t._v("#")]),t._v(" 特性")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("无侵入")]),t._v(":只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑")]),t._v(" "),s("li",[s("strong",[t._v("损耗小")]),t._v(":启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作")]),t._v(" "),s("li",[s("strong",[t._v("强大的 CRUD 操作")]),t._v(":内置通用 Mapper,仅仅通过少量配置即可实现大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求")]),t._v(" "),s("li",[s("strong",[t._v("支持 Lambda 形式调用")]),t._v(":通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错段")]),t._v(" "),s("li",[s("strong",[t._v("支持主键自动生成")]),t._v(":支持2 种主键策略,可自由配置,完美解决主键问题")]),t._v(" "),s("li",[s("strong",[t._v("支持 ActiveRecord 模式")]),t._v(":支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作")]),t._v(" "),s("li",[s("strong",[t._v("支持自定义全局通用操作")]),t._v(":支持全局通用方法注入( Write once, use anywhere )")]),t._v(" "),s("li",[s("strong",[t._v("内置分页插件")]),t._v(":基于RestHighLevelClient 物理分页,开发者无需关心具体操作,且无需额外配置插件,写分页等同于普通 List 查询,且保持和PageHelper插件同样的分页返回字段,无需担心命名影响")]),t._v(" "),s("li",[s("strong",[t._v("MySQL功能全覆盖")]),t._v(":MySQL中支持的功能通过EE都可以轻松实现")]),t._v(" "),s("li",[s("strong",[t._v("支持ES高阶语法")]),t._v(":支持高亮搜索,分词查询,权重查询,Geo地理位置查询,IP查询,聚合查询等高阶语法")]),t._v(" "),s("li",[s("strong",[t._v("良好的拓展性")]),t._v(":底层仍使用RestHighLevelClient,可保持其拓展性,开发者在使用EE的同时,仍可使用RestHighLevelClient的功能")])]),t._v(" "),s("p",[t._v("...")]),t._v(" "),s("h2",{attrs:{id:"框架架构"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#框架架构"}},[t._v("#")]),t._v(" 框架架构")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://iknow.hs.net/27fb40b8-22d4-45c2-92e0-1471112d5102.jpg",alt:"EasyEsJG.jpg"}})]),t._v(" "),s("h2",{attrs:{id:"代码托管"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#代码托管"}},[t._v("#")]),t._v(" 代码托管")]),t._v(" "),s("blockquote",[s("p",[s("a",{attrs:{href:"https://gitee.com/dromara/easy-es",target:"_blank",rel:"noopener noreferrer"}},[t._v("码云Gitee"),s("OutboundLink")],1),t._v("✔ | "),s("a",{attrs:{href:"https://github.com/dromara/easy-es",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github"),s("OutboundLink")],1),t._v("✔")])]),t._v(" "),s("h2",{attrs:{id:"参与贡献"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#参与贡献"}},[t._v("#")]),t._v(" 参与贡献")]),t._v(" "),s("p",[t._v("尽管目前Easy-Es诞生不算太久,但由于站在巨人的肩膀上(RestHighLevelClient和Mybatis-Plus),这是一款出道即巅峰的框架,这么说并不是说它写得有多好,而是它融合了两款目前非常优秀框架的优点,以及MP的用户习惯和用户生态,这决定了它起点的高度,未来可期,所以在此欢迎各路好汉一起来参与完善 Easy-Es,我们期待你的 PR!")]),t._v(" "),s("ul",[s("li",[t._v("贡献代码:代码地址 "),s("a",{attrs:{href:"https://gitee.com/dromara/easy-es",target:"_blank",rel:"noopener noreferrer"}},[t._v("Easy-ES"),s("OutboundLink")],1),t._v(",欢迎提交 Issue 或者 Pull Requests")]),t._v(" "),s("li",[t._v("维护文档:文档地址 "),s("a",{attrs:{href:"https://github.com/xpc1024/easy-es-home-pages",target:"_blank",rel:"noopener noreferrer"}},[t._v("Easy-ES"),s("OutboundLink")],1),t._v(",欢迎参与翻译和修订")])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/8.32b0893f.js b/dist/assets/js/8.32b0893f.js new file mode 100644 index 00000000..2a49a6e0 --- /dev/null +++ b/dist/assets/js/8.32b0893f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{331:function(t,a,s){"use strict";s.r(a);var e=s(6),_=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[s("img",{attrs:{src:"https://iknow.hs.net/b56d3e1e-9a38-4f6a-8cde-d43bcf25c539.jpg",alt:"1"}})]),t._v(" "),s("h2",{attrs:{id:"_1-检索类服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-检索类服务"}},[t._v("#")]),t._v(" 1. 检索类服务")]),t._v(" "),s("ul",[s("li",[t._v("搜索文库")]),t._v(" "),s("li",[t._v("电商商品检索")]),t._v(" "),s("li",[t._v("海量系统日志检索")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://iknow.hs.net/0f3c8d45-db6c-4c7e-be57-a76f0091be82.png",alt:"2"}})]),t._v(" "),s("h2",{attrs:{id:"_2-问答类服务-本质上也是检索类"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-问答类服务-本质上也是检索类"}},[t._v("#")]),t._v(" 2. 问答类服务(本质上也是检索类)")]),t._v(" "),s("ul",[s("li",[t._v("在线智能客服")]),t._v(" "),s("li",[t._v("机器人")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://iknow.hs.net/ee89621e-f270-49ca-873b-b694ff6206ea.png",alt:"3"}})]),t._v(" "),s("h2",{attrs:{id:"_3-地图类服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-地图类服务"}},[t._v("#")]),t._v(" 3. 地图类服务")]),t._v(" "),s("ul",[s("li",[t._v("打车app")]),t._v(" "),s("li",[t._v("外卖app")]),t._v(" "),s("li",[t._v("社区团购配送")]),t._v(" "),s("li",[t._v("陌生人社交")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://iknow.hs.net/4f144390-796b-457e-87ef-9f4194883df2.png",alt:"4"}})]),t._v(" "),s("p",[t._v("...")]),t._v(" "),s("p",[t._v("以上只是我个人能想到的一些应用场景,实际上Easy-Es的API基本上覆盖了Elastic Search 90%以上的功能,99%以上的常用功能,所以您可以基于EE快速构建出各种系统,即便是十分复杂多变的查询,也可以从容应对,Trust me!")])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/9.54eecf7f.js b/dist/assets/js/9.54eecf7f.js new file mode 100644 index 00000000..e426bf1b --- /dev/null +++ b/dist/assets/js/9.54eecf7f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{327:function(e,t,s){"use strict";s.r(t);var a=s(6),v=Object(a.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h2",{attrs:{id:"_1-性能"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-性能"}},[e._v("#")]),e._v(" 1.性能")]),e._v(" "),s("p",[e._v("在正式接入Easy-Es至生产环境之前,您肯定会担心一个问题,就是使用此框架后,系统的查询效率是否会变低?系统资源开销是否会变大?负面影响到底有多少?\n这些问题关乎到一个框架的存活,作为EE作者,这些问题我在开发前就考虑到了,但用户并不知晓,所以我再此一一帮您粉碎这些顾虑.")]),e._v(" "),s("p",[s("img",{attrs:{src:"https://iknow.hs.net/a057bb79-2f27-4785-b177-87f3056fe920.jpg",alt:"1"}})]),e._v(" "),s("p",[e._v("我们先来看EE在整个查询过程中做了什么事? 总结起来就2件:")]),e._v(" "),s("ol",[s("li",[s("p",[e._v("把用户输入的MySQL语法(Mybatis-Plus语法)转换成RestHighLevel语法,然后调用RestHighLevelClient执行本次查询")])]),e._v(" "),s("li",[s("p",[e._v("把查询结果转换成用户想要的格式:如"),s("code",[e._v("List")]),e._v("并返回.")])])]),e._v(" "),s("ul",[s("li",[s("p",[e._v("其中,语法转换是按照"),s("RouterLink",{attrs:{to:"/pages/6fea40/"}},[e._v("MySQL和EE语法对比")]),e._v("的关系进行转换.这种转换其实耗费的性能非常低,因为即使你直接使用RestHighLevelClient进行查询,你依旧需要创建出termQueryBuilder和BoolQueryBuilder. 唯一的区别就是我把用户输入的查询条件eq放入了队列,然后通过队里FIFO(除查询条件中有or的情况)的顺序逐一进行转换,对于绝大多数查询语句,查询条件都不会太多,所以队里中的元素数大多数情况下都会小于10,而且队列中我只存了枚举和参数,既不会占用过多内存,也不会因为队列的遍历消耗多少性能. 对于现代计算机而言,别说遍历10条小数据,就是成百上千条也是毫秒级的,所以这点性能损耗基本可以忽略不计")],1)]),e._v(" "),s("li",[s("p",[e._v("再说结果解析,结果解析其实就是把调用RestHighLevelClient返回的SearchResponse中的hits取出并用fastJson转换成数组,这个过程就算不用EE,你直接用RestHighLevelClient也是会有这一步,所以这一步并没有过多的损耗,即便是我用了反射,字段的反射和注解信息,都在框架启动时加载进内存中了,做了jvm的缓存,所以这点损耗可忽略不计.")])])]),e._v(" "),s("p",[e._v("当然如上都是基于理论分析,在test模块的Performance测试类中,大家可以看到我针对CURD分别作了不同维度的性能测试,实际测试的结果也很好的印证了我上面的理论分析,EE除了查询会比直接使用RestHighLevelClient平均慢10-15毫秒,增删改API并无差异,而且随着查询数据量的增大,实体字段缓存生效后,查询差异会进一步降低,几乎可以忽略不计. 牺牲10毫秒,对用户而言是无感知的,但对开发而言,可以节省大量代码和时间,我认为这是值得的,基本上没有哪款ORM框架是不会损耗性能的,权衡利弊,主公们心理应该都会有答案.")]),e._v(" "),s("h2",{attrs:{id:"_2-安全"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2-安全"}},[e._v("#")]),e._v(" 2.安全")]),e._v(" "),s("p",[e._v("本框架所有三方依赖有elastic search官方提供的es操作套件和RestHighLevelClient,阿里的fastJson,Spring官方的SpringbootAutoConfig,Apache的commons-codec以及Lombok,无二方依赖,空口黄牙,口说无凭,大家可以点开maven中央仓库,亲自查看一番:"),s("a",{attrs:{href:"https://search.maven.org/search?q=easy-es",target:"_blank",rel:"noopener noreferrer"}},[e._v("maven中央仓库"),s("OutboundLink")],1),e._v("\n以上套件即使不使用EE,你在实际开发中也会用到,且都是官方出品,所以您无需担心.\n那么EE有没有可能有安全问题?毕竟是个人开发者写的,没有前面提到的框架那么强的背书.首先我认为任何框架都有可能有安全风险,即便是有强大的公司背书,比如前阵子阿里FastJson的安全漏洞. 对于EE,我个人认为目前不会有特别严重的安全问题,EE框架的核心原理上面的图中已经列出来了,EE的核心原理只是转换,相当于一个翻译或者中介,并无其它涉及安全类的操作,加上EE框架本身十分轻量,没有引入任何多余的类库,所有工具类都是自己封装,封装的时候也参照了apache工具类,所以有理由认为使用EE是相对安全的,除非下游的官方依赖本身有安全漏洞. 如质疑框架本身存在安全问题的,大可以下载源码阅读一番,看看有无漏洞.\n另外关于FastJson其实一直争议不断,其性能确实是目前市面上当之无愧的一哥,确实够快,安全方面的话之前因为AutoType问题和黑客上演的魔高一尺道高一丈故事,让很多人误以为它漏洞百出,其实它没有那么不堪,之前的漏洞频繁本质上都是一个问题.阿里内部尚且那么多项目在使用FastJson,只要其社区活跃,并有积极处理,都是可以考虑使用的,毕竟没有哪个框架可以保证完全没有漏洞,只不过还没被发现罢了.")]),e._v(" "),s("h2",{attrs:{id:"_3-拓展性"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-拓展性"}},[e._v("#")]),e._v(" 3.拓展性")]),e._v(" "),s("p",[e._v("EE底层用的就是Es官方提供的RestHighLevelClient,我们只是对RestHighLevelClient做了增强,并没有改变减少或是削弱它原有的功能,所以您无需担心拓展性.\n任何框架的使用都会降低系统的灵活性,因为框架是死的,使用了以后不可避免的会碰到一些场景框架无法满足,需要定制化开发,或是短期内您不了解框架本身,不敢贸然使用,不然以后遇到问题怎么办?\n为了解决上述问题,我特地在框架中留了"),s("RouterLink",{attrs:{to:"/pages/a19563/"}},[e._v("混合查询")]),e._v("和"),s("RouterLink",{attrs:{to:"/pages/4446a5/"}},[e._v("原生查询")]),e._v('\n目前EE提供的所有API可以覆盖实际开发中99%的需求,当极小概率下1%的需求无法覆盖时,您可以通过使用混合查询,也就是能支持的语句用EE生成,不能支持的语句就直接用RestHighLevelClient的语法,然后通过原生接口去完成查询,既简单有省事.当然如果您不喜欢这种"油电混动"的方式,您也可以直接用原生查询接口去完成查询,和直接使用RestHighLevelClient一样.\n当然如果您实在不想用EE提供的任何方法,EE仍可以作为一个自动配置版的RestHighLevelClient使用,直接在需要的地方注入RestHighLevelClient进行使用即可,EE已经帮您把RestHighLevelClient按照您在配置文件中指定配置,自动装配成SpringBean了,所以在任何情况下,您都可以很自信很从容,就像直接使用官方的RestHighLevelClient一样,根本不需要担心有一天出问题了怎么办,大不了不用EE,只把它当成一个引入依赖和自动配置的工具.而且这种可能性也非常的低,我们还有专门的答疑群无偿在线给予您支持,对您的合理需求也会第一时间响应并安排落地.')],1),e._v(" "),s("h2",{attrs:{id:"_4-团队及社区活跃度"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_4-团队及社区活跃度"}},[e._v("#")]),e._v(" 4.团队及社区活跃度")]),e._v(" "),s("p",[e._v('团队目前招募到了5人,我称之为"五虎上将",从0.9.5+的版本之后开始TeamWork,未来随着项目发展还会招募更多有志之士加入,社区目前活跃,每年会发很多个版本,不断提升用户体验,对于用户提的需求会在一周内响应,合理的会在一个月内立项,三个月内完成开发上线.Issue类问题确认后会在两周内解决并上线.')]),e._v(" "),s("h2",{attrs:{id:"_5-接入优势"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-接入优势"}},[e._v("#")]),e._v(" 5.接入优势")]),e._v(" "),s("ul",[s("li",[e._v("简单易用高效不用我多说了吧,MyBatis-Plus用户懂的都懂! 大把的时间节省出来,做...爱做的事情,真香!")]),e._v(" "),s("li",[e._v("使用门槛降低,就算是刚不懂Es的小白,也可以用EE开发各种功能")]),e._v(" "),s("li",[e._v("大幅减少代码量,提升代码可读性,降低重复代码量,提升代码质量")]),e._v(" "),s("li",[e._v("专业答疑团队,无忧售后")]),e._v(" "),s("li",[e._v("永久免费")])]),e._v(" "),s("p",[e._v("...")]),e._v(" "),s("h2",{attrs:{id:"_6-结语"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_6-结语"}},[e._v("#")]),e._v(" 6.结语")]),e._v(" "),s("p",[e._v("新能源汽车刚出来的时候,油车车主还在观望,先上车的已经体验到甜头了,好不好用了就知道,至于那些所谓的问题,都会随着时间被解决,多尝试新鲜事物,拥抱变化,不因循守旧,不用一成不变的观念来看瞬息万变的世界,才能立于不败之地.")])])}),[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file diff --git a/dist/assets/js/app.dffb780e.js b/dist/assets/js/app.dffb780e.js new file mode 100644 index 00000000..c256593d --- /dev/null +++ b/dist/assets/js/app.dffb780e.js @@ -0,0 +1,21 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(n){function e(e){for(var r,i,s=e[0],l=e[1],c=e[2],u=0,d=[];ufunction n(e,t,r,o=1){if("string"==typeof e)return m(t,e,r);if(Array.isArray(e))return Object.assign(m(t,e[0],r),{title:e[1]});{o>3&&console.error("[vuepress] detected a too deep nested sidebar group.");const a=e.children||[];return 0===a.length&&e.path?Object.assign(m(t,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>n(e,t,r,o+1)),collapsable:!1!==e.collapsable}}}(n,o,t)):[]}return[]}function f(n){const e=g(n.headers||[]);return[{type:"group",collapsable:!1,title:n.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:n.path,path:n.path+"#"+e.slug,children:e.children||[]}))}]}function g(n){let e;return(n=n.map(n=>Object.assign({},n))).forEach(n=>{2===n.level?e=n:e&&(e.children||(e.children=[])).push(n)}),n.filter(n=>2===n.level)}function v(n){return Object.assign(n,{type:n.items&&n.items.length?"links":"link"})}function y(n){return Object.prototype.toString.call(n).match(/\[object (.*?)\]/)[1].toLowerCase()}function b(n){let e=n.frontmatter.date||n.lastUpdated||new Date,t=new Date(e);return"Invalid Date"==t&&e&&(t=new Date(e.replace(/-/g,"/"))),t.getTime()}function w(n,e){return b(e)-b(n)}},function(n,e){n.exports=function(n){return null!=n&&"object"==typeof n}},function(n,e,t){var r=t(14),o=t(140),a=t(141),i=r?r.toStringTag:void 0;n.exports=function(n){return null==n?void 0===n?"[object Undefined]":"[object Null]":i&&i in Object(n)?o(n):a(n)}},function(n,e,t){var r=t(5).Symbol;n.exports=r},function(n,e,t){var r=t(7),o=t(61),a=t(96),i=t(24),s=t(52),l=TypeError,c=Object.defineProperty,p=Object.getOwnPropertyDescriptor;e.f=r?a?function(n,e,t){if(i(n),e=s(e),i(t),"function"==typeof n&&"prototype"===e&&"value"in t&&"writable"in t&&!t.writable){var r=p(n,e);r&&r.writable&&(n[e]=t.value,t={configurable:"configurable"in t?t.configurable:r.configurable,enumerable:"enumerable"in t?t.enumerable:r.enumerable,writable:!1})}return c(n,e,t)}:c:function(n,e,t){if(i(n),e=s(e),i(t),o)try{return c(n,e,t)}catch(n){}if("get"in t||"set"in t)throw l("Accessors not supported");return"value"in t&&(n[e]=t.value),n}},function(n,e,t){var r=t(2),o=t(0),a=function(n){return o(n)?n:void 0};n.exports=function(n,e){return arguments.length<2?a(r[n]):r[n]&&r[n][e]}},function(n,e,t){var r=t(7),o=t(15),a=t(29);n.exports=r?function(n,e,t){return o.f(n,e,a(1,t))}:function(n,e,t){return n[e]=t,n}},function(n,e,t){var r=t(145),o=t(146),a=t(147),i=t(148),s=t(149);function l(n){var e=-1,t=null==n?0:n.length;for(this.clear();++e
'};function o(n,e,t){return nt?t:n}function a(n){return 100*(-1+n)}t.configure=function(n){var e,t;for(e in n)void 0!==(t=n[e])&&n.hasOwnProperty(e)&&(r[e]=t);return this},t.status=null,t.set=function(n){var e=t.isStarted();n=o(n,r.minimum,1),t.status=1===n?null:n;var l=t.render(!e),c=l.querySelector(r.barSelector),p=r.speed,u=r.easing;return l.offsetWidth,i((function(e){""===r.positionUsing&&(r.positionUsing=t.getPositioningCSS()),s(c,function(n,e,t){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(n)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(n)+"%,0)"}:{"margin-left":a(n)+"%"}).transition="all "+e+"ms "+t,o}(n,p,u)),1===n?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){s(l,{transition:"all "+p+"ms linear",opacity:0}),setTimeout((function(){t.remove(),e()}),p)}),p)):setTimeout(e,p)})),this},t.isStarted=function(){return"number"==typeof t.status},t.start=function(){t.status||t.set(0);var n=function(){setTimeout((function(){t.status&&(t.trickle(),n())}),r.trickleSpeed)};return r.trickle&&n(),this},t.done=function(n){return n||t.status?t.inc(.3+.5*Math.random()).set(1):this},t.inc=function(n){var e=t.status;return e?("number"!=typeof n&&(n=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+n,0,.994),t.set(e)):t.start()},t.trickle=function(){return t.inc(Math.random()*r.trickleRate)},n=0,e=0,t.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&t.start(),n++,e++,r.always((function(){0==--e?(n=0,t.done()):t.set((n-e)/n)})),this):this},t.render=function(n){if(t.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,i=e.querySelector(r.barSelector),l=n?"-100":a(t.status||0),p=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&d(o),p!=document.body&&c(p,"nprogress-custom-parent"),p.appendChild(e),e},t.remove=function(){p(document.documentElement,"nprogress-busy"),p(document.querySelector(r.parent),"nprogress-custom-parent");var n=document.getElementById("nprogress");n&&d(n)},t.isRendered=function(){return!!document.getElementById("nprogress")},t.getPositioningCSS=function(){var n=document.body.style,e="WebkitTransform"in n?"Webkit":"MozTransform"in n?"Moz":"msTransform"in n?"ms":"OTransform"in n?"O":"";return e+"Perspective"in n?"translate3d":e+"Transform"in n?"translate":"margin"};var i=function(){var n=[];function e(){var t=n.shift();t&&t(e)}return function(t){n.push(t),1==n.length&&e()}}(),s=function(){var n=["Webkit","O","Moz","ms"],e={};function t(t){return t=t.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(n,e){return e.toUpperCase()})),e[t]||(e[t]=function(e){var t=document.body.style;if(e in t)return e;for(var r,o=n.length,a=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=n[o]+a)in t)return r;return e}(t))}function r(n,e,r){e=t(e),n.style[e]=r}return function(n,e){var t,o,a=arguments;if(2==a.length)for(t in e)void 0!==(o=e[t])&&e.hasOwnProperty(t)&&r(n,t,o);else r(n,a[1],a[2])}}();function l(n,e){return("string"==typeof n?n:u(n)).indexOf(" "+e+" ")>=0}function c(n,e){var t=u(n),r=t+e;l(t,e)||(n.className=r.substring(1))}function p(n,e){var t,r=u(n);l(n,e)&&(t=r.replace(" "+e+" "," "),n.className=t.substring(1,t.length-1))}function u(n){return(" "+(n.className||"")+" ").replace(/\s+/gi," ")}function d(n){n&&n.parentNode&&n.parentNode.removeChild(n)}return t})?r.call(e,t,e,n):r)||(n.exports=o)},function(n,e,t){var r=t(9),o=String,a=TypeError;n.exports=function(n){if(r(n))return n;throw a(o(n)+" is not an object")}},function(n,e,t){var r=t(3);n.exports=!r((function(){var n=function(){}.bind();return"function"!=typeof n||n.hasOwnProperty("prototype")}))},function(n,e,t){var r=t(43),o=t(51);n.exports=function(n){return r(o(n))}},function(n,e,t){var r=t(2),o=t(58),a=t(8),i=t(60),s=t(56),l=t(55),c=o("wks"),p=r.Symbol,u=p&&p.for,d=l?p:p&&p.withoutSetter||i;n.exports=function(n){if(!a(c,n)||!s&&"string"!=typeof c[n]){var e="Symbol."+n;s&&a(p,n)?c[n]=p[n]:c[n]=l&&u?u(e):d(e)}return c[n]}},function(n,e,t){var r=t(25),o=Function.prototype.call;n.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(n,e){n.exports=function(n,e){return{enumerable:!(1&n),configurable:!(2&n),writable:!(4&n),value:e}}},function(n,e,t){var r=t(1),o=r({}.toString),a=r("".slice);n.exports=function(n){return a(o(n),8,-1)}},function(n,e,t){var r=t(2),o=t(32),a=r["__core-js_shared__"]||o("__core-js_shared__",{});n.exports=a},function(n,e,t){var r=t(2),o=Object.defineProperty;n.exports=function(n,e){try{o(r,n,{value:e,configurable:!0,writable:!0})}catch(t){r[n]=e}return e}},function(n,e,t){var r=t(139),o=t(12),a=Object.prototype,i=a.hasOwnProperty,s=a.propertyIsEnumerable,l=r(function(){return arguments}())?r:function(n){return o(n)&&i.call(n,"callee")&&!s.call(n,"callee")};n.exports=l},function(n,e,t){var r=t(10)(t(5),"Map");n.exports=r},function(n,e){n.exports=function(n){var e=typeof n;return null!=n&&("object"==e||"function"==e)}},function(n,e,t){var r=t(159),o=t(166),a=t(168),i=t(169),s=t(170);function l(n){var e=-1,t=null==n?0:n.length;for(this.clear();++e-1&&n%1==0&&n<=9007199254740991}},function(n,e,t){var r=t(4),o=t(40),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,i=/^\w*$/;n.exports=function(n,e){if(r(n))return!1;var t=typeof n;return!("number"!=t&&"symbol"!=t&&"boolean"!=t&&null!=n&&!o(n))||(i.test(n)||!a.test(n)||null!=e&&n in Object(e))}},function(n,e,t){var r=t(13),o=t(12);n.exports=function(n){return"symbol"==typeof n||o(n)&&"[object Symbol]"==r(n)}},function(n,e){n.exports=function(n){return n}},function(n,e,t){var r=t(2),o=t(50).f,a=t(17),i=t(108),s=t(32),l=t(63),c=t(120);n.exports=function(n,e){var t,p,u,d,m,h=n.target,f=n.global,g=n.stat;if(t=f?r:g?r[h]||s(h,{}):(r[h]||{}).prototype)for(p in e){if(d=e[p],u=n.dontCallGetSet?(m=o(t,p))&&m.value:t[p],!c(f?p:h+(g?".":"#")+p,n.forced)&&void 0!==u){if(typeof d==typeof u)continue;l(d,u)}(n.sham||u&&u.sham)&&a(d,"sham",!0),i(t,p,d,n)}}},function(n,e,t){var r=t(1),o=t(3),a=t(30),i=Object,s=r("".split);n.exports=o((function(){return!i("z").propertyIsEnumerable(0)}))?function(n){return"String"==a(n)?s(n,""):i(n)}:i},function(n,e,t){var r=t(0),o=t(106),a=TypeError;n.exports=function(n){if(r(n))return n;throw a(o(n)+" is not a function")}},function(n,e,t){var r=t(51),o=Object;n.exports=function(n){return o(r(n))}},function(n,e){n.exports={}},function(n,e,t){var r=t(118);n.exports=function(n){return r(n.length)}},function(n,e){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},function(n,e){var t=/^\s+|\s+$/g,r=/^[-+]0x[0-9a-f]+$/i,o=/^0b[01]+$/i,a=/^0o[0-7]+$/i,i=parseInt,s="object"==typeof global&&global&&global.Object===Object&&global,l="object"==typeof self&&self&&self.Object===Object&&self,c=s||l||Function("return this")(),p=Object.prototype.toString,u=Math.max,d=Math.min,m=function(){return c.Date.now()};function h(n){var e=typeof n;return!!n&&("object"==e||"function"==e)}function f(n){if("number"==typeof n)return n;if(function(n){return"symbol"==typeof n||function(n){return!!n&&"object"==typeof n}(n)&&"[object Symbol]"==p.call(n)}(n))return NaN;if(h(n)){var e="function"==typeof n.valueOf?n.valueOf():n;n=h(e)?e+"":e}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(t,"");var s=o.test(n);return s||a.test(n)?i(n.slice(2),s?2:8):r.test(n)?NaN:+n}n.exports=function(n,e,t){var r,o,a,i,s,l,c=0,p=!1,g=!1,v=!0;if("function"!=typeof n)throw new TypeError("Expected a function");function y(e){var t=r,a=o;return r=o=void 0,c=e,i=n.apply(a,t)}function b(n){return c=n,s=setTimeout(x,e),p?y(n):i}function w(n){var t=n-l;return void 0===l||t>=e||t<0||g&&n-c>=a}function x(){var n=m();if(w(n))return E(n);s=setTimeout(x,function(n){var t=e-(n-l);return g?d(t,a-(n-c)):t}(n))}function E(n){return s=void 0,v&&r?y(n):(r=o=void 0,i)}function _(){var n=m(),t=w(n);if(r=arguments,o=this,l=n,t){if(void 0===s)return b(l);if(g)return s=setTimeout(x,e),y(l)}return void 0===s&&(s=setTimeout(x,e)),i}return e=f(e)||0,h(t)&&(p=!!t.leading,a=(g="maxWait"in t)?u(f(t.maxWait)||0,e):a,v="trailing"in t?!!t.trailing:v),_.cancel=function(){void 0!==s&&clearTimeout(s),c=0,r=l=o=s=void 0},_.flush=function(){return void 0===s?i:E(m())},_}},function(n,e,t){var r=t(7),o=t(28),a=t(102),i=t(29),s=t(26),l=t(52),c=t(8),p=t(61),u=Object.getOwnPropertyDescriptor;e.f=r?u:function(n,e){if(n=s(n),e=l(e),p)try{return u(n,e)}catch(n){}if(c(n,e))return i(!o(a.f,n,e),n[e])}},function(n,e){var t=TypeError;n.exports=function(n){if(null==n)throw t("Can't call method on "+n);return n}},function(n,e,t){var r=t(103),o=t(53);n.exports=function(n){var e=r(n,"string");return o(e)?e:e+""}},function(n,e,t){var r=t(16),o=t(0),a=t(54),i=t(55),s=Object;n.exports=i?function(n){return"symbol"==typeof n}:function(n){var e=r("Symbol");return o(e)&&a(e.prototype,s(n))}},function(n,e,t){var r=t(1);n.exports=r({}.isPrototypeOf)},function(n,e,t){var r=t(56);n.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(n,e,t){var r=t(57),o=t(3);n.exports=!!Object.getOwnPropertySymbols&&!o((function(){var n=Symbol();return!String(n)||!(Object(n)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(n,e,t){var r,o,a=t(2),i=t(104),s=a.process,l=a.Deno,c=s&&s.versions||l&&l.version,p=c&&c.v8;p&&(o=(r=p.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&i&&(!(r=i.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=i.match(/Chrome\/(\d+)/))&&(o=+r[1]),n.exports=o},function(n,e,t){var r=t(59),o=t(31);(n.exports=function(n,e){return o[n]||(o[n]=void 0!==e?e:{})})("versions",[]).push({version:"3.23.3",mode:r?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.23.3/LICENSE",source:"https://github.com/zloirock/core-js"})},function(n,e){n.exports=!1},function(n,e,t){var r=t(1),o=0,a=Math.random(),i=r(1..toString);n.exports=function(n){return"Symbol("+(void 0===n?"":n)+")_"+i(++o+a,36)}},function(n,e,t){var r=t(7),o=t(3),a=t(95);n.exports=!r&&!o((function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},function(n,e,t){var r=t(1),o=t(0),a=t(31),i=r(Function.toString);o(a.inspectSource)||(a.inspectSource=function(n){return i(n)}),n.exports=a.inspectSource},function(n,e,t){var r=t(8),o=t(113),a=t(50),i=t(15);n.exports=function(n,e,t){for(var s=o(e),l=i.f,c=a.f,p=0;pp))return!1;var d=l.get(n),m=l.get(e);if(d&&m)return d==e&&m==n;var h=-1,f=!0,g=2&t?new r:void 0;for(l.set(n,e),l.set(e,n);++h-1&&n%1==0&&n]/;n.exports=function(n){var e,t=""+n,o=r.exec(t);if(!o)return t;var a="",i=0,s=0;for(i=o.index;i({codeTabs:[],activeCodeTabIndex:-1}),watch:{activeCodeTabIndex(n){this.codeTabs.forEach(n=>{n.elm.classList.remove("theme-code-block__active")}),this.codeTabs[n].elm.classList.add("theme-code-block__active")}},mounted(){this.codeTabs=(this.$slots.default||[]).filter(n=>Boolean(n.componentOptions)).map((n,e)=>(""===n.componentOptions.propsData.active&&(this.activeCodeTabIndex=e),{title:n.componentOptions.propsData.title,elm:n.elm})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0)},methods:{changeCodeTab(n){this.activeCodeTabIndex=n}}},o=(t(234),t(6)),a=Object(o.a)(r,(function(){var n=this,e=n.$createElement,t=n._self._c||e;return t("div",{staticClass:"theme-code-group"},[t("div",{staticClass:"theme-code-group__nav"},[t("ul",{staticClass:"theme-code-group__ul"},n._l(n.codeTabs,(function(e,r){return t("li",{key:e.title,staticClass:"theme-code-group__li"},[t("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":r===n.activeCodeTabIndex},on:{click:function(e){return n.changeCodeTab(r)}}},[n._v("\n "+n._s(e.title)+"\n ")])])})),0)]),n._v(" "),n._t("default"),n._v(" "),n.codeTabs.length<1?t("pre",{staticClass:"pre-blank"},[n._v("// Make sure to add code blocks to your code group")]):n._e()],2)}),[],!1,null,"2f5f1757",null);e.default=a.exports},function(n,e){n.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(n,e,t){var r=t(2),o=t(9),a=r.document,i=o(a)&&o(a.createElement);n.exports=function(n){return i?a.createElement(n):{}}},function(n,e,t){var r=t(7),o=t(3);n.exports=r&&o((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},function(n,e,t){var r=t(58),o=t(60),a=r("keys");n.exports=function(n){return a[n]||(a[n]=o(n))}},function(n,e,t){var r=t(1),o=t(8),a=t(26),i=t(115).indexOf,s=t(46),l=r([].push);n.exports=function(n,e){var t,r=a(n),c=0,p=[];for(t in r)!o(s,t)&&o(r,t)&&l(p,t);for(;e.length>c;)o(r,t=e[c++])&&(~i(p,t)||l(p,t));return p}},function(n,e){n.exports=function(n){var e=null==n?0:n.length;return e?n[e-1]:void 0}},function(n,e,t){n.exports=t(239)},function(n,e,t){"use strict";var r=t(42),o=t(121).left,a=t(122),i=t(57),s=t(123);r({target:"Array",proto:!0,forced:!a("reduce")||!s&&i>79&&i<83},{reduce:function(n){var e=arguments.length;return o(this,n,e,e>1?arguments[1]:void 0)}})},function(n,e,t){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,a=o&&!r.call({1:2},1);e.f=a?function(n){var e=o(this,n);return!!e&&e.enumerable}:r},function(n,e,t){var r=t(28),o=t(9),a=t(53),i=t(105),s=t(107),l=t(27),c=TypeError,p=l("toPrimitive");n.exports=function(n,e){if(!o(n)||a(n))return n;var t,l=i(n,p);if(l){if(void 0===e&&(e="default"),t=r(l,n,e),!o(t)||a(t))return t;throw c("Can't convert object to primitive value")}return void 0===e&&(e="number"),s(n,e)}},function(n,e,t){var r=t(16);n.exports=r("navigator","userAgent")||""},function(n,e,t){var r=t(44);n.exports=function(n,e){var t=n[e];return null==t?void 0:r(t)}},function(n,e){var t=String;n.exports=function(n){try{return t(n)}catch(n){return"Object"}}},function(n,e,t){var r=t(28),o=t(0),a=t(9),i=TypeError;n.exports=function(n,e){var t,s;if("string"===e&&o(t=n.toString)&&!a(s=r(t,n)))return s;if(o(t=n.valueOf)&&!a(s=r(t,n)))return s;if("string"!==e&&o(t=n.toString)&&!a(s=r(t,n)))return s;throw i("Can't convert object to primitive value")}},function(n,e,t){var r=t(0),o=t(15),a=t(109),i=t(32);n.exports=function(n,e,t,s){s||(s={});var l=s.enumerable,c=void 0!==s.name?s.name:e;if(r(t)&&a(t,c,s),s.global)l?n[e]=t:i(e,t);else{try{s.unsafe?n[e]&&(l=!0):delete n[e]}catch(n){}l?n[e]=t:o.f(n,e,{value:t,enumerable:!1,configurable:!s.nonConfigurable,writable:!s.nonWritable})}return n}},function(n,e,t){var r=t(3),o=t(0),a=t(8),i=t(7),s=t(110).CONFIGURABLE,l=t(62),c=t(111),p=c.enforce,u=c.get,d=Object.defineProperty,m=i&&!r((function(){return 8!==d((function(){}),"length",{value:8}).length})),h=String(String).split("String"),f=n.exports=function(n,e,t){"Symbol("===String(e).slice(0,7)&&(e="["+String(e).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),t&&t.getter&&(e="get "+e),t&&t.setter&&(e="set "+e),(!a(n,"name")||s&&n.name!==e)&&(i?d(n,"name",{value:e,configurable:!0}):n.name=e),m&&t&&a(t,"arity")&&n.length!==t.arity&&d(n,"length",{value:t.arity});try{t&&a(t,"constructor")&&t.constructor?i&&d(n,"prototype",{writable:!1}):n.prototype&&(n.prototype=void 0)}catch(n){}var r=p(n);return a(r,"source")||(r.source=h.join("string"==typeof e?e:"")),n};Function.prototype.toString=f((function(){return o(this)&&u(this).source||l(this)}),"toString")},function(n,e,t){var r=t(7),o=t(8),a=Function.prototype,i=r&&Object.getOwnPropertyDescriptor,s=o(a,"name"),l=s&&"something"===function(){}.name,c=s&&(!r||r&&i(a,"name").configurable);n.exports={EXISTS:s,PROPER:l,CONFIGURABLE:c}},function(n,e,t){var r,o,a,i=t(112),s=t(2),l=t(1),c=t(9),p=t(17),u=t(8),d=t(31),m=t(97),h=t(46),f=s.TypeError,g=s.WeakMap;if(i||d.state){var v=d.state||(d.state=new g),y=l(v.get),b=l(v.has),w=l(v.set);r=function(n,e){if(b(v,n))throw new f("Object already initialized");return e.facade=n,w(v,n,e),e},o=function(n){return y(v,n)||{}},a=function(n){return b(v,n)}}else{var x=m("state");h[x]=!0,r=function(n,e){if(u(n,x))throw new f("Object already initialized");return e.facade=n,p(n,x,e),e},o=function(n){return u(n,x)?n[x]:{}},a=function(n){return u(n,x)}}n.exports={set:r,get:o,has:a,enforce:function(n){return a(n)?o(n):r(n,{})},getterFor:function(n){return function(e){var t;if(!c(e)||(t=o(e)).type!==n)throw f("Incompatible receiver, "+n+" required");return t}}}},function(n,e,t){var r=t(2),o=t(0),a=t(62),i=r.WeakMap;n.exports=o(i)&&/native code/.test(a(i))},function(n,e,t){var r=t(16),o=t(1),a=t(114),i=t(119),s=t(24),l=o([].concat);n.exports=r("Reflect","ownKeys")||function(n){var e=a.f(s(n)),t=i.f;return t?l(e,t(n)):e}},function(n,e,t){var r=t(98),o=t(94).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(n){return r(n,o)}},function(n,e,t){var r=t(26),o=t(116),a=t(47),i=function(n){return function(e,t,i){var s,l=r(e),c=a(l),p=o(i,c);if(n&&t!=t){for(;c>p;)if((s=l[p++])!=s)return!0}else for(;c>p;p++)if((n||p in l)&&l[p]===t)return n||p||0;return!n&&-1}};n.exports={includes:i(!0),indexOf:i(!1)}},function(n,e,t){var r=t(64),o=Math.max,a=Math.min;n.exports=function(n,e){var t=r(n);return t<0?o(t+e,0):a(t,e)}},function(n,e){var t=Math.ceil,r=Math.floor;n.exports=Math.trunc||function(n){var e=+n;return(e>0?r:t)(e)}},function(n,e,t){var r=t(64),o=Math.min;n.exports=function(n){return n>0?o(r(n),9007199254740991):0}},function(n,e){e.f=Object.getOwnPropertySymbols},function(n,e,t){var r=t(3),o=t(0),a=/#|\.prototype\./,i=function(n,e){var t=l[s(n)];return t==p||t!=c&&(o(e)?r(e):!!e)},s=i.normalize=function(n){return String(n).replace(a,".").toLowerCase()},l=i.data={},c=i.NATIVE="N",p=i.POLYFILL="P";n.exports=i},function(n,e,t){var r=t(44),o=t(45),a=t(43),i=t(47),s=TypeError,l=function(n){return function(e,t,l,c){r(t);var p=o(e),u=a(p),d=i(p),m=n?d-1:0,h=n?-1:1;if(l<2)for(;;){if(m in u){c=u[m],m+=h;break}if(m+=h,n?m<0:d<=m)throw s("Reduce of empty array with no initial value")}for(;n?m>=0:d>m;m+=h)m in u&&(c=t(c,u[m],m,p));return c}};n.exports={left:l(!1),right:l(!0)}},function(n,e,t){"use strict";var r=t(3);n.exports=function(n,e){var t=[][n];return!!t&&r((function(){t.call(null,e||function(){return 1},1)}))}},function(n,e,t){var r=t(30),o=t(2);n.exports="process"==r(o.process)},function(n,e,t){var r=t(42),o=t(2),a=t(125),i=t(126),s=o.WebAssembly,l=7!==Error("e",{cause:7}).cause,c=function(n,e){var t={};t[n]=i(n,e,l),r({global:!0,constructor:!0,arity:1,forced:l},t)},p=function(n,e){if(s&&s[n]){var t={};t[n]=i("WebAssembly."+n,e,l),r({target:"WebAssembly",stat:!0,constructor:!0,arity:1,forced:l},t)}};c("Error",(function(n){return function(e){return a(n,this,arguments)}})),c("EvalError",(function(n){return function(e){return a(n,this,arguments)}})),c("RangeError",(function(n){return function(e){return a(n,this,arguments)}})),c("ReferenceError",(function(n){return function(e){return a(n,this,arguments)}})),c("SyntaxError",(function(n){return function(e){return a(n,this,arguments)}})),c("TypeError",(function(n){return function(e){return a(n,this,arguments)}})),c("URIError",(function(n){return function(e){return a(n,this,arguments)}})),p("CompileError",(function(n){return function(e){return a(n,this,arguments)}})),p("LinkError",(function(n){return function(e){return a(n,this,arguments)}})),p("RuntimeError",(function(n){return function(e){return a(n,this,arguments)}}))},function(n,e,t){var r=t(25),o=Function.prototype,a=o.apply,i=o.call;n.exports="object"==typeof Reflect&&Reflect.apply||(r?i.bind(a):function(){return i.apply(a,arguments)})},function(n,e,t){"use strict";var r=t(16),o=t(8),a=t(17),i=t(54),s=t(65),l=t(63),c=t(128),p=t(129),u=t(130),d=t(134),m=t(135),h=t(136),f=t(7),g=t(59);n.exports=function(n,e,t,v){var y=v?2:1,b=n.split("."),w=b[b.length-1],x=r.apply(null,b);if(x){var E=x.prototype;if(!g&&o(E,"cause")&&delete E.cause,!t)return x;var _=r("Error"),k=e((function(n,e){var t=u(v?e:n,void 0),r=v?new x(n):new x;return void 0!==t&&a(r,"message",t),h&&a(r,"stack",m(r.stack,2)),this&&i(E,this)&&p(r,this,k),arguments.length>y&&d(r,arguments[y]),r}));if(k.prototype=E,"Error"!==w?s?s(k,_):l(k,_,{name:!0}):f&&"stackTraceLimit"in x&&(c(k,x,"stackTraceLimit"),c(k,x,"prepareStackTrace")),l(k,x),!g)try{E.name!==w&&a(E,"name",w),E.constructor=k}catch(n){}return k}}},function(n,e,t){var r=t(0),o=String,a=TypeError;n.exports=function(n){if("object"==typeof n||r(n))return n;throw a("Can't set "+o(n)+" as a prototype")}},function(n,e,t){var r=t(15).f;n.exports=function(n,e,t){t in n||r(n,t,{configurable:!0,get:function(){return e[t]},set:function(n){e[t]=n}})}},function(n,e,t){var r=t(0),o=t(9),a=t(65);n.exports=function(n,e,t){var i,s;return a&&r(i=e.constructor)&&i!==t&&o(s=i.prototype)&&s!==t.prototype&&a(n,s),n}},function(n,e,t){var r=t(131);n.exports=function(n,e){return void 0===n?arguments.length<2?"":e:r(n)}},function(n,e,t){var r=t(132),o=String;n.exports=function(n){if("Symbol"===r(n))throw TypeError("Cannot convert a Symbol value to a string");return o(n)}},function(n,e,t){var r=t(133),o=t(0),a=t(30),i=t(27)("toStringTag"),s=Object,l="Arguments"==a(function(){return arguments}());n.exports=r?a:function(n){var e,t,r;return void 0===n?"Undefined":null===n?"Null":"string"==typeof(t=function(n,e){try{return n[e]}catch(n){}}(e=s(n),i))?t:l?a(e):"Object"==(r=a(e))&&o(e.callee)?"Arguments":r}},function(n,e,t){var r={};r[t(27)("toStringTag")]="z",n.exports="[object z]"===String(r)},function(n,e,t){var r=t(9),o=t(17);n.exports=function(n,e){r(e)&&"cause"in e&&o(n,"cause",e.cause)}},function(n,e,t){var r=t(1),o=Error,a=r("".replace),i=String(o("zxcasd").stack),s=/\n\s*at [^:]*:[^\n]*/,l=s.test(i);n.exports=function(n,e){if(l&&"string"==typeof n&&!o.prepareStackTrace)for(;e--;)n=a(n,s,"");return n}},function(n,e,t){var r=t(3),o=t(29);n.exports=!r((function(){var n=Error("a");return!("stack"in n)||(Object.defineProperty(n,"stack",o(1,7)),7!==n.stack)}))},function(n,e,t){var r=t(66),o=t(138);n.exports=function n(e,t,a,i,s){var l=-1,c=e.length;for(a||(a=o),s||(s=[]);++l0&&a(p)?t>1?n(p,t-1,a,i,s):r(s,p):i||(s[s.length]=p)}return s}},function(n,e,t){var r=t(14),o=t(33),a=t(4),i=r?r.isConcatSpreadable:void 0;n.exports=function(n){return a(n)||o(n)||!!(i&&n&&n[i])}},function(n,e,t){var r=t(13),o=t(12);n.exports=function(n){return o(n)&&"[object Arguments]"==r(n)}},function(n,e,t){var r=t(14),o=Object.prototype,a=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;n.exports=function(n){var e=a.call(n,s),t=n[s];try{n[s]=void 0;var r=!0}catch(n){}var o=i.call(n);return r&&(e?n[s]=t:delete n[s]),o}},function(n,e){var t=Object.prototype.toString;n.exports=function(n){return t.call(n)}},function(n,e,t){var r=t(143),o=t(199),a=t(41),i=t(4),s=t(210);n.exports=function(n){return"function"==typeof n?n:null==n?a:"object"==typeof n?i(n)?o(n[0],n[1]):r(n):s(n)}},function(n,e,t){var r=t(144),o=t(198),a=t(83);n.exports=function(n){var e=o(n);return 1==e.length&&e[0][2]?a(e[0][0],e[0][1]):function(t){return t===n||r(t,n,e)}}},function(n,e,t){var r=t(68),o=t(72);n.exports=function(n,e,t,a){var i=t.length,s=i,l=!a;if(null==n)return!s;for(n=Object(n);i--;){var c=t[i];if(l&&c[2]?c[1]!==n[c[0]]:!(c[0]in n))return!1}for(;++i-1}},function(n,e,t){var r=t(19);n.exports=function(n,e){var t=this.__data__,o=r(t,n);return o<0?(++this.size,t.push([n,e])):t[o][1]=e,this}},function(n,e,t){var r=t(18);n.exports=function(){this.__data__=new r,this.size=0}},function(n,e){n.exports=function(n){var e=this.__data__,t=e.delete(n);return this.size=e.size,t}},function(n,e){n.exports=function(n){return this.__data__.get(n)}},function(n,e){n.exports=function(n){return this.__data__.has(n)}},function(n,e,t){var r=t(18),o=t(34),a=t(36);n.exports=function(n,e){var t=this.__data__;if(t instanceof r){var i=t.__data__;if(!o||i.length<199)return i.push([n,e]),this.size=++t.size,this;t=this.__data__=new a(i)}return t.set(n,e),this.size=t.size,this}},function(n,e,t){var r=t(70),o=t(156),a=t(35),i=t(71),s=/^\[object .+?Constructor\]$/,l=Function.prototype,c=Object.prototype,p=l.toString,u=c.hasOwnProperty,d=RegExp("^"+p.call(u).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");n.exports=function(n){return!(!a(n)||o(n))&&(r(n)?d:s).test(i(n))}},function(n,e,t){var r,o=t(157),a=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";n.exports=function(n){return!!a&&a in n}},function(n,e,t){var r=t(5)["__core-js_shared__"];n.exports=r},function(n,e){n.exports=function(n,e){return null==n?void 0:n[e]}},function(n,e,t){var r=t(160),o=t(18),a=t(34);n.exports=function(){this.size=0,this.__data__={hash:new r,map:new(a||o),string:new r}}},function(n,e,t){var r=t(161),o=t(162),a=t(163),i=t(164),s=t(165);function l(n){var e=-1,t=null==n?0:n.length;for(this.clear();++e0){if(++e>=800)return arguments[0]}else e=0;return n.apply(void 0,arguments)}}},function(n,e,t){var r=t(74),o=t(222),a=t(227),i=t(75),s=t(228),l=t(37);n.exports=function(n,e,t){var c=-1,p=o,u=n.length,d=!0,m=[],h=m;if(t)d=!1,p=a;else if(u>=200){var f=e?null:s(n);if(f)return l(f);d=!1,p=i,h=new r}else h=e?[]:m;n:for(;++c-1}},function(n,e,t){var r=t(224),o=t(225),a=t(226);n.exports=function(n,e,t){return e==e?a(n,e,t):r(n,o,t)}},function(n,e){n.exports=function(n,e,t,r){for(var o=n.length,a=t+(r?1:-1);r?a--:++a=0&&Math.floor(e)===e&&isFinite(n)}function m(n){return a(n)&&"function"==typeof n.then&&"function"==typeof n.catch}function h(n){return null==n?"":Array.isArray(n)||p(n)&&n.toString===c?JSON.stringify(n,null,2):String(n)}function f(n){var e=parseFloat(n);return isNaN(e)?n:e}function g(n,e){for(var t=Object.create(null),r=n.split(","),o=0;o-1)return n.splice(t,1)}}var b=Object.prototype.hasOwnProperty;function w(n,e){return b.call(n,e)}function x(n){var e=Object.create(null);return function(t){return e[t]||(e[t]=n(t))}}var E=/-(\w)/g,_=x((function(n){return n.replace(E,(function(n,e){return e?e.toUpperCase():""}))})),k=x((function(n){return n.charAt(0).toUpperCase()+n.slice(1)})),S=/\B([A-Z])/g,T=x((function(n){return n.replace(S,"-$1").toLowerCase()}));var C=Function.prototype.bind?function(n,e){return n.bind(e)}:function(n,e){function t(t){var r=arguments.length;return r?r>1?n.apply(e,arguments):n.call(e,t):n.call(e)}return t._length=n.length,t};function I(n,e){e=e||0;for(var t=n.length-e,r=new Array(t);t--;)r[t]=n[t+e];return r}function L(n,e){for(var t in e)n[t]=e[t];return n}function A(n){for(var e={},t=0;t0,J=V&&V.indexOf("edge/")>0,X=(V&&V.indexOf("android"),V&&/iphone|ipad|ipod|ios/.test(V)||"ios"===H),Y=(V&&/chrome\/\d+/.test(V),V&&/phantomjs/.test(V),V&&V.match(/firefox\/(\d+)/)),nn={}.watch,en=!1;if(Q)try{var tn={};Object.defineProperty(tn,"passive",{get:function(){en=!0}}),window.addEventListener("test-passive",null,tn)}catch(n){}var rn=function(){return void 0===U&&(U=!Q&&!G&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),U},on=Q&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function an(n){return"function"==typeof n&&/native code/.test(n.toString())}var sn,ln="undefined"!=typeof Symbol&&an(Symbol)&&"undefined"!=typeof Reflect&&an(Reflect.ownKeys);sn="undefined"!=typeof Set&&an(Set)?Set:function(){function n(){this.set=Object.create(null)}return n.prototype.has=function(n){return!0===this.set[n]},n.prototype.add=function(n){this.set[n]=!0},n.prototype.clear=function(){this.set=Object.create(null)},n}();var cn=P,pn=0,un=function(){this.id=pn++,this.subs=[]};un.prototype.addSub=function(n){this.subs.push(n)},un.prototype.removeSub=function(n){y(this.subs,n)},un.prototype.depend=function(){un.target&&un.target.addDep(this)},un.prototype.notify=function(){var n=this.subs.slice();for(var e=0,t=n.length;e-1)if(a&&!w(o,"default"))i=!1;else if(""===i||i===T(n)){var l=Un(String,o.type);(l<0||s0&&(de((l=n(l,(t||"")+"_"+r))[0])&&de(p)&&(u[c]=yn(p.text+l[0].text),l.shift()),u.push.apply(u,l)):s(l)?de(p)?u[c]=yn(p.text+l):""!==l&&u.push(yn(l)):de(l)&&de(p)?u[c]=yn(p.text+l.text):(i(e._isVList)&&a(l.tag)&&o(l.key)&&a(t)&&(l.key="__vlist"+t+"_"+r+"__"),u.push(l)));return u}(n):void 0}function de(n){return a(n)&&a(n.text)&&!1===n.isComment}function me(n,e){if(n){for(var t=Object.create(null),r=ln?Reflect.ownKeys(n):Object.keys(n),o=0;o0,i=n?!!n.$stable:!a,s=n&&n.$key;if(n){if(n._normalized)return n._normalized;if(i&&t&&t!==r&&s===t.$key&&!a&&!t.$hasNormal)return t;for(var l in o={},n)n[l]&&"$"!==l[0]&&(o[l]=ye(e,l,n[l]))}else o={};for(var c in e)c in o||(o[c]=be(e,c));return n&&Object.isExtensible(n)&&(n._normalized=o),N(o,"$stable",i),N(o,"$key",s),N(o,"$hasNormal",a),o}function ye(n,e,t){var r=function(){var n=arguments.length?t.apply(null,arguments):t({}),e=(n=n&&"object"==typeof n&&!Array.isArray(n)?[n]:ue(n))&&n[0];return n&&(!e||1===n.length&&e.isComment&&!ge(e))?void 0:n};return t.proxy&&Object.defineProperty(n,e,{get:r,enumerable:!0,configurable:!0}),r}function be(n,e){return function(){return n[e]}}function we(n,e){var t,r,o,i,s;if(Array.isArray(n)||"string"==typeof n)for(t=new Array(n.length),r=0,o=n.length;rdocument.createEvent("Event").timeStamp&&(ct=function(){return pt.now()})}function ut(){var n,e;for(lt=ct(),it=!0,tt.sort((function(n,e){return n.id-e.id})),st=0;stst&&tt[t].id>n.id;)t--;tt.splice(t+1,0,n)}else tt.push(n);at||(at=!0,re(ut))}}(this)},mt.prototype.run=function(){if(this.active){var n=this.get();if(n!==this.value||l(n)||this.deep){var e=this.value;if(this.value=n,this.user){var t='callback for watcher "'+this.expression+'"';Qn(this.cb,this.vm,[n,e],this.vm,t)}else this.cb.call(this.vm,n,e)}}},mt.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},mt.prototype.depend=function(){for(var n=this.deps.length;n--;)this.deps[n].depend()},mt.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);for(var n=this.deps.length;n--;)this.deps[n].removeSub(this);this.active=!1}};var ht={enumerable:!0,configurable:!0,get:P,set:P};function ft(n,e,t){ht.get=function(){return this[e][t]},ht.set=function(n){this[e][t]=n},Object.defineProperty(n,t,ht)}function gt(n){n._watchers=[];var e=n.$options;e.props&&function(n,e){var t=n.$options.propsData||{},r=n._props={},o=n.$options._propKeys=[];n.$parent&&kn(!1);var a=function(a){o.push(a);var i=Rn(a,e,t,n);Cn(r,a,i),a in n||ft(n,"_props",a)};for(var i in e)a(i);kn(!0)}(n,e.props),e.methods&&function(n,e){n.$options.props;for(var t in e)n[t]="function"!=typeof e[t]?P:C(e[t],n)}(n,e.methods),e.data?function(n){var e=n.$options.data;p(e=n._data="function"==typeof e?function(n,e){mn();try{return n.call(e,e)}catch(n){return Wn(n,e,"data()"),{}}finally{hn()}}(e,n):e||{})||(e={});var t=Object.keys(e),r=n.$options.props,o=(n.$options.methods,t.length);for(;o--;){var a=t[o];0,r&&w(r,a)||(i=void 0,36!==(i=(a+"").charCodeAt(0))&&95!==i&&ft(n,"_data",a))}var i;Tn(e,!0)}(n):Tn(n._data={},!0),e.computed&&function(n,e){var t=n._computedWatchers=Object.create(null),r=rn();for(var o in e){var a=e[o],i="function"==typeof a?a:a.get;0,r||(t[o]=new mt(n,i||P,P,vt)),o in n||yt(n,o,a)}}(n,e.computed),e.watch&&e.watch!==nn&&function(n,e){for(var t in e){var r=e[t];if(Array.isArray(r))for(var o=0;o-1:"string"==typeof n?n.split(",").indexOf(e)>-1:!!u(n)&&n.test(e)}function It(n,e){var t=n.cache,r=n.keys,o=n._vnode;for(var a in t){var i=t[a];if(i){var s=i.name;s&&!e(s)&&Lt(t,a,r,o)}}}function Lt(n,e,t,r){var o=n[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),n[e]=null,y(t,e)}!function(n){n.prototype._init=function(n){var e=this;e._uid=Et++,e._isVue=!0,n&&n._isComponent?function(n,e){var t=n.$options=Object.create(n.constructor.options),r=e._parentVnode;t.parent=e.parent,t._parentVnode=r;var o=r.componentOptions;t.propsData=o.propsData,t._parentListeners=o.listeners,t._renderChildren=o.children,t._componentTag=o.tag,e.render&&(t.render=e.render,t.staticRenderFns=e.staticRenderFns)}(e,n):e.$options=zn(_t(e.constructor),n||{},e),e._renderProxy=e,e._self=e,function(n){var e=n.$options,t=e.parent;if(t&&!e.abstract){for(;t.$options.abstract&&t.$parent;)t=t.$parent;t.$children.push(n)}n.$parent=t,n.$root=t?t.$root:n,n.$children=[],n.$refs={},n._watcher=null,n._inactive=null,n._directInactive=!1,n._isMounted=!1,n._isDestroyed=!1,n._isBeingDestroyed=!1}(e),function(n){n._events=Object.create(null),n._hasHookEvent=!1;var e=n.$options._parentListeners;e&&Ze(n,e)}(e),function(n){n._vnode=null,n._staticTrees=null;var e=n.$options,t=n.$vnode=e._parentVnode,o=t&&t.context;n.$slots=he(e._renderChildren,o),n.$scopedSlots=r,n._c=function(e,t,r,o){return Fe(n,e,t,r,o,!1)},n.$createElement=function(e,t,r,o){return Fe(n,e,t,r,o,!0)};var a=t&&t.data;Cn(n,"$attrs",a&&a.attrs||r,null,!0),Cn(n,"$listeners",e._parentListeners||r,null,!0)}(e),et(e,"beforeCreate"),function(n){var e=me(n.$options.inject,n);e&&(kn(!1),Object.keys(e).forEach((function(t){Cn(n,t,e[t])})),kn(!0))}(e),gt(e),function(n){var e=n.$options.provide;e&&(n._provided="function"==typeof e?e.call(n):e)}(e),et(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}(kt),function(n){var e={get:function(){return this._data}},t={get:function(){return this._props}};Object.defineProperty(n.prototype,"$data",e),Object.defineProperty(n.prototype,"$props",t),n.prototype.$set=In,n.prototype.$delete=Ln,n.prototype.$watch=function(n,e,t){if(p(e))return xt(this,n,e,t);(t=t||{}).user=!0;var r=new mt(this,n,e,t);if(t.immediate){var o='callback for immediate watcher "'+r.expression+'"';mn(),Qn(e,this,[r.value],this,o),hn()}return function(){r.teardown()}}}(kt),function(n){var e=/^hook:/;n.prototype.$on=function(n,t){var r=this;if(Array.isArray(n))for(var o=0,a=n.length;o1?I(t):t;for(var r=I(arguments,1),o='event handler for "'+n+'"',a=0,i=t.length;aparseInt(this.max)&&Lt(n,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var n in this.cache)Lt(this.cache,n,this.keys)},mounted:function(){var n=this;this.cacheVNode(),this.$watch("include",(function(e){It(n,(function(n){return Ct(e,n)}))})),this.$watch("exclude",(function(e){It(n,(function(n){return!Ct(e,n)}))}))},updated:function(){this.cacheVNode()},render:function(){var n=this.$slots.default,e=Ge(n),t=e&&e.componentOptions;if(t){var r=Tt(t),o=this.include,a=this.exclude;if(o&&(!r||!Ct(o,r))||a&&r&&Ct(a,r))return e;var i=this.cache,s=this.keys,l=null==e.key?t.Ctor.cid+(t.tag?"::"+t.tag:""):e.key;i[l]?(e.componentInstance=i[l].componentInstance,y(s,l),s.push(l)):(this.vnodeToCache=e,this.keyToCache=l),e.data.keepAlive=!0}return e||n&&n[0]}}};!function(n){var e={get:function(){return R}};Object.defineProperty(n,"config",e),n.util={warn:cn,extend:L,mergeOptions:zn,defineReactive:Cn},n.set=In,n.delete=Ln,n.nextTick=re,n.observable=function(n){return Tn(n),n},n.options=Object.create(null),z.forEach((function(e){n.options[e+"s"]=Object.create(null)})),n.options._base=n,L(n.options.components,Pt),function(n){n.use=function(n){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(n)>-1)return this;var t=I(arguments,1);return t.unshift(this),"function"==typeof n.install?n.install.apply(n,t):"function"==typeof n&&n.apply(null,t),e.push(n),this}}(n),function(n){n.mixin=function(n){return this.options=zn(this.options,n),this}}(n),St(n),function(n){z.forEach((function(e){n[e]=function(n,t){return t?("component"===e&&p(t)&&(t.name=t.name||n,t=this.options._base.extend(t)),"directive"===e&&"function"==typeof t&&(t={bind:t,update:t}),this.options[e+"s"][n]=t,t):this.options[e+"s"][n]}}))}(n)}(kt),Object.defineProperty(kt.prototype,"$isServer",{get:rn}),Object.defineProperty(kt.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(kt,"FunctionalRenderContext",{value:Me}),kt.version="2.6.14";var jt=g("style,class"),Ot=g("input,textarea,option,select,progress"),Dt=g("contenteditable,draggable,spellcheck"),Mt=g("events,caret,typing,plaintext-only"),qt=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),zt="http://www.w3.org/1999/xlink",Bt=function(n){return":"===n.charAt(5)&&"xlink"===n.slice(0,5)},Rt=function(n){return Bt(n)?n.slice(6,n.length):""},$t=function(n){return null==n||!1===n};function Nt(n){for(var e=n.data,t=n,r=n;a(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=Ft(r.data,e));for(;a(t=t.parent);)t&&t.data&&(e=Ft(e,t.data));return function(n,e){if(a(n)||a(e))return Ut(n,Wt(e));return""}(e.staticClass,e.class)}function Ft(n,e){return{staticClass:Ut(n.staticClass,e.staticClass),class:a(n.class)?[n.class,e.class]:e.class}}function Ut(n,e){return n?e?n+" "+e:n:e||""}function Wt(n){return Array.isArray(n)?function(n){for(var e,t="",r=0,o=n.length;r-1?mr(n,e,t):qt(e)?$t(t)?n.removeAttribute(e):(t="allowfullscreen"===e&&"EMBED"===n.tagName?"true":e,n.setAttribute(e,t)):Dt(e)?n.setAttribute(e,function(n,e){return $t(e)||"false"===e?"false":"contenteditable"===n&&Mt(e)?e:"true"}(e,t)):Bt(e)?$t(t)?n.removeAttributeNS(zt,Rt(e)):n.setAttributeNS(zt,e,t):mr(n,e,t)}function mr(n,e,t){if($t(t))n.removeAttribute(e);else{if(K&&!Z&&"TEXTAREA"===n.tagName&&"placeholder"===e&&""!==t&&!n.__ieph){var r=function(e){e.stopImmediatePropagation(),n.removeEventListener("input",r)};n.addEventListener("input",r),n.__ieph=!0}n.setAttribute(e,t)}}var hr={create:ur,update:ur};function fr(n,e){var t=e.elm,r=e.data,i=n.data;if(!(o(r.staticClass)&&o(r.class)&&(o(i)||o(i.staticClass)&&o(i.class)))){var s=Nt(e),l=t._transitionClasses;a(l)&&(s=Ut(s,Wt(l))),s!==t._prevClass&&(t.setAttribute("class",s),t._prevClass=s)}}var gr,vr={create:fr,update:fr};function yr(n,e,t){var r=gr;return function o(){var a=e.apply(null,arguments);null!==a&&xr(n,o,t,r)}}var br=Kn&&!(Y&&Number(Y[1])<=53);function wr(n,e,t,r){if(br){var o=lt,a=e;e=a._wrapper=function(n){if(n.target===n.currentTarget||n.timeStamp>=o||n.timeStamp<=0||n.target.ownerDocument!==document)return a.apply(this,arguments)}}gr.addEventListener(n,e,en?{capture:t,passive:r}:t)}function xr(n,e,t,r){(r||gr).removeEventListener(n,e._wrapper||e,t)}function Er(n,e){if(!o(n.data.on)||!o(e.data.on)){var t=e.data.on||{},r=n.data.on||{};gr=e.elm,function(n){if(a(n.__r)){var e=K?"change":"input";n[e]=[].concat(n.__r,n[e]||[]),delete n.__r}a(n.__c)&&(n.change=[].concat(n.__c,n.change||[]),delete n.__c)}(t),le(t,r,wr,xr,yr,e.context),gr=void 0}}var _r,kr={create:Er,update:Er};function Sr(n,e){if(!o(n.data.domProps)||!o(e.data.domProps)){var t,r,i=e.elm,s=n.data.domProps||{},l=e.data.domProps||{};for(t in a(l.__ob__)&&(l=e.data.domProps=L({},l)),s)t in l||(i[t]="");for(t in l){if(r=l[t],"textContent"===t||"innerHTML"===t){if(e.children&&(e.children.length=0),r===s[t])continue;1===i.childNodes.length&&i.removeChild(i.childNodes[0])}if("value"===t&&"PROGRESS"!==i.tagName){i._value=r;var c=o(r)?"":String(r);Tr(i,c)&&(i.value=c)}else if("innerHTML"===t&&Ht(i.tagName)&&o(i.innerHTML)){(_r=_r||document.createElement("div")).innerHTML=""+r+"";for(var p=_r.firstChild;i.firstChild;)i.removeChild(i.firstChild);for(;p.firstChild;)i.appendChild(p.firstChild)}else if(r!==s[t])try{i[t]=r}catch(n){}}}}function Tr(n,e){return!n.composing&&("OPTION"===n.tagName||function(n,e){var t=!0;try{t=document.activeElement!==n}catch(n){}return t&&n.value!==e}(n,e)||function(n,e){var t=n.value,r=n._vModifiers;if(a(r)){if(r.number)return f(t)!==f(e);if(r.trim)return t.trim()!==e.trim()}return t!==e}(n,e))}var Cr={create:Sr,update:Sr},Ir=x((function(n){var e={},t=/:(.+)/;return n.split(/;(?![^(]*\))/g).forEach((function(n){if(n){var r=n.split(t);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function Lr(n){var e=Ar(n.style);return n.staticStyle?L(n.staticStyle,e):e}function Ar(n){return Array.isArray(n)?A(n):"string"==typeof n?Ir(n):n}var Pr,jr=/^--/,Or=/\s*!important$/,Dr=function(n,e,t){if(jr.test(e))n.style.setProperty(e,t);else if(Or.test(t))n.style.setProperty(T(e),t.replace(Or,""),"important");else{var r=qr(e);if(Array.isArray(t))for(var o=0,a=t.length;o-1?e.split(Rr).forEach((function(e){return n.classList.add(e)})):n.classList.add(e);else{var t=" "+(n.getAttribute("class")||"")+" ";t.indexOf(" "+e+" ")<0&&n.setAttribute("class",(t+e).trim())}}function Nr(n,e){if(e&&(e=e.trim()))if(n.classList)e.indexOf(" ")>-1?e.split(Rr).forEach((function(e){return n.classList.remove(e)})):n.classList.remove(e),n.classList.length||n.removeAttribute("class");else{for(var t=" "+(n.getAttribute("class")||"")+" ",r=" "+e+" ";t.indexOf(r)>=0;)t=t.replace(r," ");(t=t.trim())?n.setAttribute("class",t):n.removeAttribute("class")}}function Fr(n){if(n){if("object"==typeof n){var e={};return!1!==n.css&&L(e,Ur(n.name||"v")),L(e,n),e}return"string"==typeof n?Ur(n):void 0}}var Ur=x((function(n){return{enterClass:n+"-enter",enterToClass:n+"-enter-to",enterActiveClass:n+"-enter-active",leaveClass:n+"-leave",leaveToClass:n+"-leave-to",leaveActiveClass:n+"-leave-active"}})),Wr=Q&&!Z,Qr="transition",Gr="transitionend",Hr="animation",Vr="animationend";Wr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Qr="WebkitTransition",Gr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Hr="WebkitAnimation",Vr="webkitAnimationEnd"));var Kr=Q?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(n){return n()};function Zr(n){Kr((function(){Kr(n)}))}function Jr(n,e){var t=n._transitionClasses||(n._transitionClasses=[]);t.indexOf(e)<0&&(t.push(e),$r(n,e))}function Xr(n,e){n._transitionClasses&&y(n._transitionClasses,e),Nr(n,e)}function Yr(n,e,t){var r=eo(n,e),o=r.type,a=r.timeout,i=r.propCount;if(!o)return t();var s="transition"===o?Gr:Vr,l=0,c=function(){n.removeEventListener(s,p),t()},p=function(e){e.target===n&&++l>=i&&c()};setTimeout((function(){l0&&(t="transition",p=i,u=a.length):"animation"===e?c>0&&(t="animation",p=c,u=l.length):u=(t=(p=Math.max(i,c))>0?i>c?"transition":"animation":null)?"transition"===t?a.length:l.length:0,{type:t,timeout:p,propCount:u,hasTransform:"transition"===t&&no.test(r[Qr+"Property"])}}function to(n,e){for(;n.length1}function lo(n,e){!0!==e.data.show&&oo(e)}var co=function(n){var e,t,r={},l=n.modules,c=n.nodeOps;for(e=0;eh?b(n,o(t[v+1])?null:t[v+1].elm,t,m,v,r):m>v&&x(e,d,h)}(d,g,v,t,p):a(v)?(a(n.text)&&c.setTextContent(d,""),b(d,null,v,0,v.length-1,t)):a(g)?x(g,0,g.length-1):a(n.text)&&c.setTextContent(d,""):n.text!==e.text&&c.setTextContent(d,e.text),a(h)&&a(m=h.hook)&&a(m=m.postpatch)&&m(n,e)}}}function S(n,e,t){if(i(t)&&a(n.parent))n.parent.data.pendingInsert=e;else for(var r=0;r-1,i.selected!==a&&(i.selected=a);else if(D(fo(i),r))return void(n.selectedIndex!==s&&(n.selectedIndex=s));o||(n.selectedIndex=-1)}}function ho(n,e){return e.every((function(e){return!D(e,n)}))}function fo(n){return"_value"in n?n._value:n.value}function go(n){n.target.composing=!0}function vo(n){n.target.composing&&(n.target.composing=!1,yo(n.target,"input"))}function yo(n,e){var t=document.createEvent("HTMLEvents");t.initEvent(e,!0,!0),n.dispatchEvent(t)}function bo(n){return!n.componentInstance||n.data&&n.data.transition?n:bo(n.componentInstance._vnode)}var wo={model:po,show:{bind:function(n,e,t){var r=e.value,o=(t=bo(t)).data&&t.data.transition,a=n.__vOriginalDisplay="none"===n.style.display?"":n.style.display;r&&o?(t.data.show=!0,oo(t,(function(){n.style.display=a}))):n.style.display=r?a:"none"},update:function(n,e,t){var r=e.value;!r!=!e.oldValue&&((t=bo(t)).data&&t.data.transition?(t.data.show=!0,r?oo(t,(function(){n.style.display=n.__vOriginalDisplay})):ao(t,(function(){n.style.display="none"}))):n.style.display=r?n.__vOriginalDisplay:"none")},unbind:function(n,e,t,r,o){o||(n.style.display=n.__vOriginalDisplay)}}},xo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Eo(n){var e=n&&n.componentOptions;return e&&e.Ctor.options.abstract?Eo(Ge(e.children)):n}function _o(n){var e={},t=n.$options;for(var r in t.propsData)e[r]=n[r];var o=t._parentListeners;for(var a in o)e[_(a)]=o[a];return e}function ko(n,e){if(/\d-keep-alive$/.test(e.tag))return n("keep-alive",{props:e.componentOptions.propsData})}var So=function(n){return n.tag||ge(n)},To=function(n){return"show"===n.name},Co={name:"transition",props:xo,abstract:!0,render:function(n){var e=this,t=this.$slots.default;if(t&&(t=t.filter(So)).length){0;var r=this.mode;0;var o=t[0];if(function(n){for(;n=n.parent;)if(n.data.transition)return!0}(this.$vnode))return o;var a=Eo(o);if(!a)return o;if(this._leaving)return ko(n,o);var i="__transition-"+this._uid+"-";a.key=null==a.key?a.isComment?i+"comment":i+a.tag:s(a.key)?0===String(a.key).indexOf(i)?a.key:i+a.key:a.key;var l=(a.data||(a.data={})).transition=_o(this),c=this._vnode,p=Eo(c);if(a.data.directives&&a.data.directives.some(To)&&(a.data.show=!0),p&&p.data&&!function(n,e){return e.key===n.key&&e.tag===n.tag}(a,p)&&!ge(p)&&(!p.componentInstance||!p.componentInstance._vnode.isComment)){var u=p.data.transition=L({},l);if("out-in"===r)return this._leaving=!0,ce(u,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),ko(n,o);if("in-out"===r){if(ge(a))return c;var d,m=function(){d()};ce(l,"afterEnter",m),ce(l,"enterCancelled",m),ce(u,"delayLeave",(function(n){d=n}))}}return o}}},Io=L({tag:String,moveClass:String},xo);function Lo(n){n.elm._moveCb&&n.elm._moveCb(),n.elm._enterCb&&n.elm._enterCb()}function Ao(n){n.data.newPos=n.elm.getBoundingClientRect()}function Po(n){var e=n.data.pos,t=n.data.newPos,r=e.left-t.left,o=e.top-t.top;if(r||o){n.data.moved=!0;var a=n.elm.style;a.transform=a.WebkitTransform="translate("+r+"px,"+o+"px)",a.transitionDuration="0s"}}delete Io.mode;var jo={Transition:Co,TransitionGroup:{props:Io,beforeMount:function(){var n=this,e=this._update;this._update=function(t,r){var o=Xe(n);n.__patch__(n._vnode,n.kept,!1,!0),n._vnode=n.kept,o(),e.call(n,t,r)}},render:function(n){for(var e=this.tag||this.$vnode.data.tag||"span",t=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],a=this.children=[],i=_o(this),s=0;s-1?Kt[n]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Kt[n]=/HTMLUnknownElement/.test(e.toString())},L(kt.options.directives,wo),L(kt.options.components,jo),kt.prototype.__patch__=Q?co:P,kt.prototype.$mount=function(n,e){return function(n,e,t){var r;return n.$el=e,n.$options.render||(n.$options.render=vn),et(n,"beforeMount"),r=function(){n._update(n._render(),t)},new mt(n,r,P,{before:function(){n._isMounted&&!n._isDestroyed&&et(n,"beforeUpdate")}},!0),t=!1,null==n.$vnode&&(n._isMounted=!0,et(n,"mounted")),n}(this,n=n&&Q?function(n){if("string"==typeof n){var e=document.querySelector(n);return e||document.createElement("div")}return n}(n):void 0,e)},Q&&setTimeout((function(){R.devtools&&on&&on.emit("init",kt)}),0);var Oo=kt; +/*! + * vue-router v3.5.4 + * (c) 2022 Evan You + * @license MIT + */function Do(n,e){for(var t in e)n[t]=e[t];return n}var Mo=/[!'()*]/g,qo=function(n){return"%"+n.charCodeAt(0).toString(16)},zo=/%2C/g,Bo=function(n){return encodeURIComponent(n).replace(Mo,qo).replace(zo,",")};function Ro(n){try{return decodeURIComponent(n)}catch(n){0}return n}var $o=function(n){return null==n||"object"==typeof n?n:String(n)};function No(n){var e={};return(n=n.trim().replace(/^(\?|#|&)/,""))?(n.split("&").forEach((function(n){var t=n.replace(/\+/g," ").split("="),r=Ro(t.shift()),o=t.length>0?Ro(t.join("=")):null;void 0===e[r]?e[r]=o:Array.isArray(e[r])?e[r].push(o):e[r]=[e[r],o]})),e):e}function Fo(n){var e=n?Object.keys(n).map((function(e){var t=n[e];if(void 0===t)return"";if(null===t)return Bo(e);if(Array.isArray(t)){var r=[];return t.forEach((function(n){void 0!==n&&(null===n?r.push(Bo(e)):r.push(Bo(e)+"="+Bo(n)))})),r.join("&")}return Bo(e)+"="+Bo(t)})).filter((function(n){return n.length>0})).join("&"):null;return e?"?"+e:""}var Uo=/\/?$/;function Wo(n,e,t,r){var o=r&&r.options.stringifyQuery,a=e.query||{};try{a=Qo(a)}catch(n){}var i={name:e.name||n&&n.name,meta:n&&n.meta||{},path:e.path||"/",hash:e.hash||"",query:a,params:e.params||{},fullPath:Vo(e,o),matched:n?Ho(n):[]};return t&&(i.redirectedFrom=Vo(t,o)),Object.freeze(i)}function Qo(n){if(Array.isArray(n))return n.map(Qo);if(n&&"object"==typeof n){var e={};for(var t in n)e[t]=Qo(n[t]);return e}return n}var Go=Wo(null,{path:"/"});function Ho(n){for(var e=[];n;)e.unshift(n),n=n.parent;return e}function Vo(n,e){var t=n.path,r=n.query;void 0===r&&(r={});var o=n.hash;return void 0===o&&(o=""),(t||"/")+(e||Fo)(r)+o}function Ko(n,e,t){return e===Go?n===e:!!e&&(n.path&&e.path?n.path.replace(Uo,"")===e.path.replace(Uo,"")&&(t||n.hash===e.hash&&Zo(n.query,e.query)):!(!n.name||!e.name)&&(n.name===e.name&&(t||n.hash===e.hash&&Zo(n.query,e.query)&&Zo(n.params,e.params))))}function Zo(n,e){if(void 0===n&&(n={}),void 0===e&&(e={}),!n||!e)return n===e;var t=Object.keys(n).sort(),r=Object.keys(e).sort();return t.length===r.length&&t.every((function(t,o){var a=n[t];if(r[o]!==t)return!1;var i=e[t];return null==a||null==i?a===i:"object"==typeof a&&"object"==typeof i?Zo(a,i):String(a)===String(i)}))}function Jo(n){for(var e=0;e=0&&(e=n.slice(r),n=n.slice(0,r));var o=n.indexOf("?");return o>=0&&(t=n.slice(o+1),n=n.slice(0,o)),{path:n,query:t,hash:e}}(o.path||""),c=e&&e.path||"/",p=l.path?na(l.path,c,t||o.append):c,u=function(n,e,t){void 0===e&&(e={});var r,o=t||No;try{r=o(n||"")}catch(n){r={}}for(var a in e){var i=e[a];r[a]=Array.isArray(i)?i.map($o):$o(i)}return r}(l.query,o.query,r&&r.options.parseQuery),d=o.hash||l.hash;return d&&"#"!==d.charAt(0)&&(d="#"+d),{_normalized:!0,path:p,query:u,hash:d}}var xa,Ea=function(){},_a={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(n){var e=this,t=this.$router,r=this.$route,o=t.resolve(this.to,r,this.append),a=o.location,i=o.route,s=o.href,l={},c=t.options.linkActiveClass,p=t.options.linkExactActiveClass,u=null==c?"router-link-active":c,d=null==p?"router-link-exact-active":p,m=null==this.activeClass?u:this.activeClass,h=null==this.exactActiveClass?d:this.exactActiveClass,f=i.redirectedFrom?Wo(null,wa(i.redirectedFrom),null,t):i;l[h]=Ko(r,f,this.exactPath),l[m]=this.exact||this.exactPath?l[h]:function(n,e){return 0===n.path.replace(Uo,"/").indexOf(e.path.replace(Uo,"/"))&&(!e.hash||n.hash===e.hash)&&function(n,e){for(var t in e)if(!(t in n))return!1;return!0}(n.query,e.query)}(r,f);var g=l[h]?this.ariaCurrentValue:null,v=function(n){ka(n)&&(e.replace?t.replace(a,Ea):t.push(a,Ea))},y={click:ka};Array.isArray(this.event)?this.event.forEach((function(n){y[n]=v})):y[this.event]=v;var b={class:l},w=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:s,route:i,navigate:v,isActive:l[m],isExactActive:l[h]});if(w){if(1===w.length)return w[0];if(w.length>1||!w.length)return 0===w.length?n():n("span",{},w)}if("a"===this.tag)b.on=y,b.attrs={href:s,"aria-current":g};else{var x=function n(e){var t;if(e)for(var r=0;r-1&&(s.params[d]=t.params[d]);return s.path=ba(p.path,s.params),l(p,s,i)}if(s.path){s.params={};for(var m=0;m=n.length?t():n[o]?e(n[o],(function(){r(o+1)})):r(o+1)};r(0)}var Za={redirected:2,aborted:4,cancelled:8,duplicated:16};function Ja(n,e){return Ya(n,e,Za.redirected,'Redirected when going from "'+n.fullPath+'" to "'+function(n){if("string"==typeof n)return n;if("path"in n)return n.path;var e={};return ni.forEach((function(t){t in n&&(e[t]=n[t])})),JSON.stringify(e,null,2)}(e)+'" via a navigation guard.')}function Xa(n,e){return Ya(n,e,Za.cancelled,'Navigation cancelled from "'+n.fullPath+'" to "'+e.fullPath+'" with a new navigation.')}function Ya(n,e,t,r){var o=new Error(r);return o._isRouter=!0,o.from=n,o.to=e,o.type=t,o}var ni=["params","query","hash"];function ei(n){return Object.prototype.toString.call(n).indexOf("Error")>-1}function ti(n,e){return ei(n)&&n._isRouter&&(null==e||n.type===e)}function ri(n){return function(e,t,r){var o=!1,a=0,i=null;oi(n,(function(n,e,t,s){if("function"==typeof n&&void 0===n.cid){o=!0,a++;var l,c=si((function(e){var o;((o=e).__esModule||ii&&"Module"===o[Symbol.toStringTag])&&(e=e.default),n.resolved="function"==typeof e?e:xa.extend(e),t.components[s]=e,--a<=0&&r()})),p=si((function(n){var e="Failed to resolve async component "+s+": "+n;i||(i=ei(n)?n:new Error(e),r(i))}));try{l=n(c,p)}catch(n){p(n)}if(l)if("function"==typeof l.then)l.then(c,p);else{var u=l.component;u&&"function"==typeof u.then&&u.then(c,p)}}})),o||r()}}function oi(n,e){return ai(n.map((function(n){return Object.keys(n.components).map((function(t){return e(n.components[t],n.instances[t],n,t)}))})))}function ai(n){return Array.prototype.concat.apply([],n)}var ii="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function si(n){var e=!1;return function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];if(!e)return e=!0,n.apply(this,t)}}var li=function(n,e){this.router=n,this.base=function(n){if(!n)if(Sa){var e=document.querySelector("base");n=(n=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else n="/";"/"!==n.charAt(0)&&(n="/"+n);return n.replace(/\/$/,"")}(e),this.current=Go,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function ci(n,e,t,r){var o=oi(n,(function(n,r,o,a){var i=function(n,e){"function"!=typeof n&&(n=xa.extend(n));return n.options[e]}(n,e);if(i)return Array.isArray(i)?i.map((function(n){return t(n,r,o,a)})):t(i,r,o,a)}));return ai(r?o.reverse():o)}function pi(n,e){if(e)return function(){return n.apply(e,arguments)}}li.prototype.listen=function(n){this.cb=n},li.prototype.onReady=function(n,e){this.ready?n():(this.readyCbs.push(n),e&&this.readyErrorCbs.push(e))},li.prototype.onError=function(n){this.errorCbs.push(n)},li.prototype.transitionTo=function(n,e,t){var r,o=this;try{r=this.router.match(n,this.current)}catch(n){throw this.errorCbs.forEach((function(e){e(n)})),n}var a=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),e&&e(r),o.ensureURL(),o.router.afterHooks.forEach((function(n){n&&n(r,a)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(n){n(r)})))}),(function(n){t&&t(n),n&&!o.ready&&(ti(n,Za.redirected)&&a===Go||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(n)}))))}))},li.prototype.confirmTransition=function(n,e,t){var r=this,o=this.current;this.pending=n;var a,i,s=function(n){!ti(n)&&ei(n)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(n)})):console.error(n)),t&&t(n)},l=n.matched.length-1,c=o.matched.length-1;if(Ko(n,o)&&l===c&&n.matched[l]===o.matched[c])return this.ensureURL(),n.hash&&za(this.router,o,n,!1),s(((i=Ya(a=o,n,Za.duplicated,'Avoided redundant navigation to current location: "'+a.fullPath+'".')).name="NavigationDuplicated",i));var p=function(n,e){var t,r=Math.max(n.length,e.length);for(t=0;t0)){var e=this.router,t=e.options.scrollBehavior,r=Ga&&t;r&&this.listeners.push(qa());var o=function(){var t=n.current,o=di(n.base);n.current===Go&&o===n._startLocation||n.transitionTo(o,(function(n){r&&za(e,n,t,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(n){window.history.go(n)},e.prototype.push=function(n,e,t){var r=this,o=this.current;this.transitionTo(n,(function(n){Ha(ea(r.base+n.fullPath)),za(r.router,n,o,!1),e&&e(n)}),t)},e.prototype.replace=function(n,e,t){var r=this,o=this.current;this.transitionTo(n,(function(n){Va(ea(r.base+n.fullPath)),za(r.router,n,o,!1),e&&e(n)}),t)},e.prototype.ensureURL=function(n){if(di(this.base)!==this.current.fullPath){var e=ea(this.base+this.current.fullPath);n?Ha(e):Va(e)}},e.prototype.getCurrentLocation=function(){return di(this.base)},e}(li);function di(n){var e=window.location.pathname,t=e.toLowerCase(),r=n.toLowerCase();return!n||t!==r&&0!==t.indexOf(ea(r+"/"))||(e=e.slice(n.length)),(e||"/")+window.location.search+window.location.hash}var mi=function(n){function e(e,t,r){n.call(this,e,t),r&&function(n){var e=di(n);if(!/^\/#/.test(e))return window.location.replace(ea(n+"/#"+e)),!0}(this.base)||hi()}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var n=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,t=Ga&&e;t&&this.listeners.push(qa());var r=function(){var e=n.current;hi()&&n.transitionTo(fi(),(function(r){t&&za(n.router,r,e,!0),Ga||yi(r.fullPath)}))},o=Ga?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},e.prototype.push=function(n,e,t){var r=this,o=this.current;this.transitionTo(n,(function(n){vi(n.fullPath),za(r.router,n,o,!1),e&&e(n)}),t)},e.prototype.replace=function(n,e,t){var r=this,o=this.current;this.transitionTo(n,(function(n){yi(n.fullPath),za(r.router,n,o,!1),e&&e(n)}),t)},e.prototype.go=function(n){window.history.go(n)},e.prototype.ensureURL=function(n){var e=this.current.fullPath;fi()!==e&&(n?vi(e):yi(e))},e.prototype.getCurrentLocation=function(){return fi()},e}(li);function hi(){var n=fi();return"/"===n.charAt(0)||(yi("/"+n),!1)}function fi(){var n=window.location.href,e=n.indexOf("#");return e<0?"":n=n.slice(e+1)}function gi(n){var e=window.location.href,t=e.indexOf("#");return(t>=0?e.slice(0,t):e)+"#"+n}function vi(n){Ga?Ha(gi(n)):window.location.hash=n}function yi(n){Ga?Va(gi(n)):window.location.replace(gi(n))}var bi=function(n){function e(e,t){n.call(this,e,t),this.stack=[],this.index=-1}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.push=function(n,e,t){var r=this;this.transitionTo(n,(function(n){r.stack=r.stack.slice(0,r.index+1).concat(n),r.index++,e&&e(n)}),t)},e.prototype.replace=function(n,e,t){var r=this;this.transitionTo(n,(function(n){r.stack=r.stack.slice(0,r.index).concat(n),e&&e(n)}),t)},e.prototype.go=function(n){var e=this,t=this.index+n;if(!(t<0||t>=this.stack.length)){var r=this.stack[t];this.confirmTransition(r,(function(){var n=e.current;e.index=t,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,n)}))}),(function(n){ti(n,Za.duplicated)&&(e.index=t)}))}},e.prototype.getCurrentLocation=function(){var n=this.stack[this.stack.length-1];return n?n.fullPath:"/"},e.prototype.ensureURL=function(){},e}(li),wi=function(n){void 0===n&&(n={}),this.app=null,this.apps=[],this.options=n,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Ia(n.routes||[],this);var e=n.mode||"hash";switch(this.fallback="history"===e&&!Ga&&!1!==n.fallback,this.fallback&&(e="hash"),Sa||(e="abstract"),this.mode=e,e){case"history":this.history=new ui(this,n.base);break;case"hash":this.history=new mi(this,n.base,this.fallback);break;case"abstract":this.history=new bi(this,n.base);break;default:0}},xi={currentRoute:{configurable:!0}};function Ei(n,e){return n.push(e),function(){var t=n.indexOf(e);t>-1&&n.splice(t,1)}}wi.prototype.match=function(n,e,t){return this.matcher.match(n,e,t)},xi.currentRoute.get=function(){return this.history&&this.history.current},wi.prototype.init=function(n){var e=this;if(this.apps.push(n),n.$once("hook:destroyed",(function(){var t=e.apps.indexOf(n);t>-1&&e.apps.splice(t,1),e.app===n&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=n;var t=this.history;if(t instanceof ui||t instanceof mi){var r=function(n){t.setupListeners(),function(n){var r=t.current,o=e.options.scrollBehavior;Ga&&o&&"fullPath"in n&&za(e,n,r,!1)}(n)};t.transitionTo(t.getCurrentLocation(),r,r)}t.listen((function(n){e.apps.forEach((function(e){e._route=n}))}))}},wi.prototype.beforeEach=function(n){return Ei(this.beforeHooks,n)},wi.prototype.beforeResolve=function(n){return Ei(this.resolveHooks,n)},wi.prototype.afterEach=function(n){return Ei(this.afterHooks,n)},wi.prototype.onReady=function(n,e){this.history.onReady(n,e)},wi.prototype.onError=function(n){this.history.onError(n)},wi.prototype.push=function(n,e,t){var r=this;if(!e&&!t&&"undefined"!=typeof Promise)return new Promise((function(e,t){r.history.push(n,e,t)}));this.history.push(n,e,t)},wi.prototype.replace=function(n,e,t){var r=this;if(!e&&!t&&"undefined"!=typeof Promise)return new Promise((function(e,t){r.history.replace(n,e,t)}));this.history.replace(n,e,t)},wi.prototype.go=function(n){this.history.go(n)},wi.prototype.back=function(){this.go(-1)},wi.prototype.forward=function(){this.go(1)},wi.prototype.getMatchedComponents=function(n){var e=n?n.matched?n:this.resolve(n).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(n){return Object.keys(n.components).map((function(e){return n.components[e]}))}))):[]},wi.prototype.resolve=function(n,e,t){var r=wa(n,e=e||this.history.current,t,this),o=this.match(r,e),a=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(n,e,t){var r="hash"===t?"#"+e:e;return n?ea(n+"/"+r):r}(this.history.base,a,this.mode),normalizedTo:r,resolved:o}},wi.prototype.getRoutes=function(){return this.matcher.getRoutes()},wi.prototype.addRoute=function(n,e){this.matcher.addRoute(n,e),this.history.current!==Go&&this.history.transitionTo(this.history.getCurrentLocation())},wi.prototype.addRoutes=function(n){this.matcher.addRoutes(n),this.history.current!==Go&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(wi.prototype,xi),wi.install=function n(e){if(!n.installed||xa!==e){n.installed=!0,xa=e;var t=function(n){return void 0!==n},r=function(n,e){var r=n.$options._parentVnode;t(r)&&t(r=r.data)&&t(r=r.registerRouteInstance)&&r(n,e)};e.mixin({beforeCreate:function(){t(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",Xo),e.component("RouterLink",_a);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},wi.version="3.5.4",wi.isNavigationFailure=ti,wi.NavigationFailureType=Za,wi.START_LOCATION=Go,Sa&&window.Vue&&window.Vue.use(wi);var _i=wi;t(101);t(124);var ki={NotFound:()=>Promise.all([t.e(0),t.e(4)]).then(t.bind(null,322)),Layout:()=>Promise.all([t.e(0),t.e(2)]).then(t.bind(null,321))},Si={"v-45ae3ba1":()=>t.e(6).then(t.bind(null,323)),"v-c95a8466":()=>Promise.all([t.e(0),t.e(5)]).then(t.bind(null,324)),"v-171e0198":()=>t.e(10).then(t.bind(null,325)),"v-004c105b":()=>t.e(11).then(t.bind(null,326)),"v-049ef550":()=>t.e(9).then(t.bind(null,327)),"v-464a21a4":()=>t.e(12).then(t.bind(null,328)),"v-15fda9dd":()=>t.e(7).then(t.bind(null,329)),"v-514ebfda":()=>t.e(14).then(t.bind(null,330)),"v-7e2d5535":()=>t.e(8).then(t.bind(null,331)),"v-366c873d":()=>t.e(13).then(t.bind(null,332)),"v-69171a4a":()=>t.e(17).then(t.bind(null,333)),"v-da0fbfe4":()=>t.e(19).then(t.bind(null,334)),"v-288054d3":()=>t.e(15).then(t.bind(null,335)),"v-7470134b":()=>t.e(18).then(t.bind(null,336)),"v-3d8b3548":()=>t.e(20).then(t.bind(null,337)),"v-7191526a":()=>t.e(16).then(t.bind(null,338)),"v-f04c882c":()=>t.e(21).then(t.bind(null,339)),"v-693db66d":()=>t.e(22).then(t.bind(null,340)),"v-48a65df4":()=>t.e(24).then(t.bind(null,341)),"v-0a0bb08f":()=>t.e(25).then(t.bind(null,342)),"v-5b90b78a":()=>t.e(29).then(t.bind(null,343)),"v-23dba453":()=>t.e(27).then(t.bind(null,344)),"v-0cee86be":()=>t.e(28).then(t.bind(null,345)),"v-ff37c92c":()=>t.e(23).then(t.bind(null,346)),"v-486924ca":()=>t.e(31).then(t.bind(null,347)),"v-7b83d27a":()=>t.e(26).then(t.bind(null,348)),"v-7814f9e3":()=>t.e(32).then(t.bind(null,349)),"v-6bd52905":()=>t.e(30).then(t.bind(null,350)),"v-57c32053":()=>t.e(34).then(t.bind(null,351)),"v-ffbd0264":()=>t.e(33).then(t.bind(null,352)),"v-1de24003":()=>t.e(41).then(t.bind(null,353)),"v-deae6af8":()=>t.e(37).then(t.bind(null,354)),"v-6b697dfa":()=>t.e(35).then(t.bind(null,355)),"v-4418951c":()=>t.e(36).then(t.bind(null,356)),"v-5a329570":()=>t.e(38).then(t.bind(null,357)),"v-7b689745":()=>t.e(42).then(t.bind(null,358)),"v-64e509e5":()=>t.e(39).then(t.bind(null,359)),"v-fb1b2cdc":()=>t.e(40).then(t.bind(null,360)),"v-3fb4db14":()=>t.e(45).then(t.bind(null,361)),"v-5b2b8848":()=>t.e(43).then(t.bind(null,362)),"v-248149e0":()=>t.e(44).then(t.bind(null,363))};function Ti(n){const e=Object.create(null);return function(t){return e[t]||(e[t]=n(t))}}const Ci=/-(\w)/g,Ii=Ti(n=>n.replace(Ci,(n,e)=>e?e.toUpperCase():"")),Li=/\B([A-Z])/g,Ai=Ti(n=>n.replace(Li,"-$1").toLowerCase()),Pi=Ti(n=>n.charAt(0).toUpperCase()+n.slice(1));function ji(n,e){if(!e)return;if(n(e))return n(e);return e.includes("-")?n(Pi(Ii(e))):n(Pi(e))||n(Ai(e))}const Oi=Object.assign({},ki,Si),Di=n=>Oi[n],Mi=n=>Si[n],qi=n=>ki[n],zi=n=>Oo.component(n);function Bi(n){return ji(Mi,n)}function Ri(n){return ji(qi,n)}function $i(n){return ji(Di,n)}function Ni(n){return ji(zi,n)}function Fi(...n){return Promise.all(n.filter(n=>n).map(async n=>{if(!Ni(n)&&$i(n)){const e=await $i(n)();Oo.component(n,e.default)}}))}function Ui(n,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[n]=e)}var Wi=t(90),Qi=t.n(Wi),Gi=t(91),Hi=t.n(Gi),Vi={created(){if(this.siteMeta=this.$site.headTags.filter(([n])=>"meta"===n).map(([n,e])=>e),this.$ssrContext){const e=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(n=e)?n.map(n=>{let e="{e+=` ${t}="${Hi()(n[t])}"`}),e+">"}).join("\n "):"",this.$ssrContext.canonicalLink=Zi(this.$canonicalUrl)}var n},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const n=this.getMergedMetaTags();this.currentMetaTags=Ji(n,this.currentMetaTags)},getMergedMetaTags(){const n=this.$page.frontmatter.meta||[];return Qi()([{name:"description",content:this.$description}],n,this.siteMeta,Xi)},updateCanonicalLink(){Ki(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",Zi(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){Ji(null,this.currentMetaTags),Ki()}};function Ki(){const n=document.querySelector("link[rel='canonical']");n&&n.remove()}function Zi(n=""){return n?``:""}function Ji(n,e){if(e&&[...e].filter(n=>n.parentNode===document.head).forEach(n=>document.head.removeChild(n)),n)return n.map(n=>{const e=document.createElement("meta");return Object.keys(n).forEach(t=>{e.setAttribute(t,n[t])}),document.head.appendChild(e),e})}function Xi(n){for(const e of["name","property","itemprop"])if(n.hasOwnProperty(e))return n[e]+e;return JSON.stringify(n)}var Yi=t(49),ns={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:t.n(Yi)()((function(){this.setActiveHash()}),300),setActiveHash(){const n=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>n.some(n=>n.hash===e.hash)),t=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+t;for(let n=0;n=a.parentElement.offsetTop+10&&(!i||t{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},es=t(23),ts=t.n(es),rs={mounted(){ts.a.configure({showSpinner:!1}),this.$router.beforeEach((n,e,t)=>{n.path===e.path||Oo.component(n.name)||ts.a.start(),t()}),this.$router.afterEach(()=>{ts.a.done(),this.isSidebarOpen=!1})}};t(231),t(232);class os{constructor(){this.containerEl=document.getElementById("message-container"),this.containerEl||(this.containerEl=document.createElement("div"),this.containerEl.id="message-container",document.body.appendChild(this.containerEl))}show({text:n="",duration:e=3e3}){let t=document.createElement("div");t.className="message move-in",t.innerHTML=`\n \n \n \n
${n}
\n `,this.containerEl.appendChild(t),e>0&&setTimeout(()=>{this.close(t)},e)}close(n){n.className=n.className.replace("move-in",""),n.className+="move-out",n.addEventListener("animationend",()=>{n.remove()})}}var as={mounted(){!!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||this.updateCopy()},updated(){!!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||this.updateCopy()},methods:{updateCopy(){setTimeout(()=>{(['div[class*="language-"] pre','div[class*="aside-code"] aside']instanceof Array||Array.isArray(['div[class*="language-"] pre','div[class*="aside-code"] aside']))&&['div[class*="language-"] pre','div[class*="aside-code"] aside'].forEach(n=>{document.querySelectorAll(n).forEach(this.generateCopyButton)})},1e3)},generateCopyButton(n){if(n.classList.contains("codecopy-enabled"))return;const e=document.createElement("i");e.className="code-copy",e.innerHTML='',e.title="Copy to clipboard",e.addEventListener("click",()=>{this.copyToClipboard(n.innerText)}),n.appendChild(e),n.classList.add("codecopy-enabled")},copyToClipboard(n){const e=document.createElement("textarea");e.value=n,e.setAttribute("readonly",""),e.style.position="absolute",e.style.left="-9999px",document.body.appendChild(e);const t=document.getSelection().rangeCount>0&&document.getSelection().getRangeAt(0);e.select(),document.execCommand("copy");(new os).show({text:"复制成功",duration:1e3}),document.body.removeChild(e),t&&(document.getSelection().removeAllRanges(),document.getSelection().addRange(t))}}};!function(n,e){void 0===e&&(e={});var t=e.insertAt;if(n&&"undefined"!=typeof document){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css","top"===t&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=n:o.appendChild(document.createTextNode(n))}}("@media (max-width: 1000px) {\n .vuepress-plugin-demo-block__h_code {\n display: none;\n }\n .vuepress-plugin-demo-block__app {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n}\n.vuepress-plugin-demo-block__wrapper {\n margin-top: 10px;\n border: 1px solid #ebebeb;\n border-radius: 4px;\n transition: all 0.2s;\n}\n.vuepress-plugin-demo-block__wrapper.vuepress-plugin-demo-block__horizontal .vuepress-plugin-demo-block__display {\n height: 400px;\n display: flex;\n}\n.vuepress-plugin-demo-block__wrapper.vuepress-plugin-demo-block__horizontal .vuepress-plugin-demo-block__display .vuepress-plugin-demo-block__app {\n width: 300px;\n border: 1px solid #ebebeb;\n box-shadow: 1px 1px 3px #ebebeb;\n margin-right: 5px;\n overflow: auto;\n}\n.vuepress-plugin-demo-block__wrapper.vuepress-plugin-demo-block__horizontal .vuepress-plugin-demo-block__display .vuepress-plugin-demo-block__h_code {\n flex: 1;\n overflow: auto;\n height: 100%;\n}\n.vuepress-plugin-demo-block__wrapper.vuepress-plugin-demo-block__horizontal .vuepress-plugin-demo-block__display .vuepress-plugin-demo-block__h_code > pre {\n overflow: visible;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__display {\n max-height: 400px;\n overflow: auto;\n}\n.vuepress-plugin-demo-block__wrapper div {\n box-sizing: border-box;\n}\n.vuepress-plugin-demo-block__wrapper:hover {\n box-shadow: 0 0 11px rgba(33, 33, 33, 0.2);\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__code {\n overflow: hidden;\n height: 0;\n padding: 0 !important;\n background-color: #282c34;\n border-radius: 0 !important;\n transition: height 0.5s;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__code pre {\n margin: 0 !important;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__display {\n padding: 20px;\n border-bottom: 1px solid #ebebeb;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer {\n position: relative;\n text-align: center;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer.vuepress-plugin-demo-block__show-link .vuepress-plugin-demo-block__jsfiddle,\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer.vuepress-plugin-demo-block__show-link .vuepress-plugin-demo-block__codepen {\n opacity: 1;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer.vuepress-plugin-demo-block__show-link .vuepress-plugin-demo-block__expand::before {\n border-top: none;\n border-right: 6px solid transparent;\n border-bottom: 6px solid #ccc;\n border-left: 6px solid transparent;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer:hover .vuepress-plugin-demo-block__jsfiddle,\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer:hover .vuepress-plugin-demo-block__codepen,\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer:hover .vuepress-plugin-demo-block__expand span,\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer:hover .vuepress-plugin-demo-block__expand {\n opacity: 1;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer:hover .vuepress-plugin-demo-block__expand::before {\n border-top-color: #3eaf7c !important;\n border-bottom-color: #3eaf7c !important;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer:hover svg {\n fill: #3eaf7c !important;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer .vuepress-plugin-demo-block__expand-text {\n transition: all 0.5s;\n opacity: 0;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer form:nth-last-child(2) {\n right: 50px;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer form:last-child {\n right: 10px;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer .vuepress-plugin-demo-block__button {\n border-color: transparent;\n background-color: transparent;\n font-size: 14px;\n color: #3eaf7c;\n cursor: pointer;\n outline: none;\n margin: 0;\n width: 46px;\n position: relative;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer .vuepress-plugin-demo-block__button:hover::before {\n content: attr(data-tip);\n white-space: nowrap;\n position: absolute;\n top: -30px;\n left: 50%;\n color: #eee;\n line-height: 1;\n z-index: 1000;\n border-radius: 4px;\n padding: 6px;\n -webkit-transform: translateX(-50%);\n transform: translateX(-50%);\n background-color: rgba(0, 0, 0, 0.8);\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer .vuepress-plugin-demo-block__button:hover::after {\n content: '' !important;\n display: block;\n position: absolute;\n left: 50%;\n top: -5px;\n -webkit-transform: translateX(-50%);\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-top-color: rgba(0, 0, 0, 0.8);\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer .vuepress-plugin-demo-block__button svg {\n width: 34px;\n height: 20px;\n fill: #ccc;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer .vuepress-plugin-demo-block__jsfiddle,\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer .vuepress-plugin-demo-block__codepen {\n position: absolute;\n top: 10px;\n transition: all 0.5s;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer .vuepress-plugin-demo-block__expand {\n position: relative;\n width: 100px;\n height: 40px;\n margin: 0;\n color: #3eaf7c;\n font-size: 14px;\n background-color: transparent;\n border-color: transparent;\n outline: none;\n transition: all 0.5s;\n cursor: pointer;\n}\n.vuepress-plugin-demo-block__wrapper .vuepress-plugin-demo-block__footer .vuepress-plugin-demo-block__expand::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n width: 0;\n height: 0;\n border-top: 6px solid #ccc;\n border-right: 6px solid transparent;\n border-left: 6px solid transparent;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n}\n");var is={jsLib:[],cssLib:[],jsfiddle:!0,codepen:!0,codepenLayout:"left",codepenJsProcessor:"babel",codepenEditors:"101",horizontal:!1,vue:"https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js",react:"https://cdn.jsdelivr.net/npm/react/umd/react.production.min.js",reactDOM:"https://cdn.jsdelivr.net/npm/react-dom/umd/react-dom.production.min.js"},ss={},ls=function(n){return'
\n'.concat(n,"\n
")},cs=function(n){return window.$VUEPRESS_DEMO_BLOCK&&void 0!==window.$VUEPRESS_DEMO_BLOCK[n]?window.$VUEPRESS_DEMO_BLOCK[n]:is[n]},ps=function n(e,t,r){var o=document.createElement(e);return t&&Object.keys(t).forEach((function(n){if(n.indexOf("data"))o[n]=t[n];else{var e=n.replace("data","");o.dataset[e]=t[n]}})),r&&r.forEach((function(e){var t=e.tag,r=e.attrs,a=e.children;o.appendChild(n(t,r,a))})),o},us=function(n,e,t){var r,o=(r=n.querySelectorAll(".".concat(e)),Array.prototype.slice.call(r));return 1!==o.length||t?o:o[0]},ds=function(n,e){var t,r,o=n.match(/',datatip:"JSFiddle"}}])}(c)),cs("codepen")&&r.appendChild(function(n){var e=n.css,t=n.htmlTpl,r=n.jsTpl,o=n.jsLib,a=n.cssLib,i=JSON.stringify({css:e,html:t,js:r,js_external:o.concat(cs("jsLib")).join(";"),css_external:a.concat(cs("cssLib")).join(";"),layout:cs("codepenLayout"),js_pre_processor:cs("codepenJsProcessor"),editors:cs("codepenEditors")});return ps("form",{className:"vuepress-plugin-demo-block__codepen",target:"_blank",action:"https://codepen.io/pen/define",method:"post"},[{tag:"input",attrs:{type:"hidden",name:"data",value:i}},{tag:"button",attrs:{type:"submit",innerHTML:'',className:"vuepress-plugin-demo-block__button",datatip:"Codepen"}}])}(c)),void 0!==i.horizontal?i.horizontal:cs("horizontal")){n.classList.add("vuepress-plugin-demo-block__horizontal");var u=e.firstChild.cloneNode(!0);u.classList.add("vuepress-plugin-demo-block__h_code"),t.appendChild(u)}if(c.css&&function(n){if(!ss[n]){var e=ps("style",{innerHTML:n});document.body.appendChild(e),ss[n]=!0}}(c.css),"react"===s)ReactDOM.render(React.createElement(c.js),o);else if("vue"===s){var d=(new(Vue.extend(c.script))).$mount();o.appendChild(d.$el)}else"vanilla"===s&&(o.innerHTML=c.html,new Function("return (function(){".concat(c.script,"})()"))());n.dataset.created="true"}})):setTimeout((function(n){fs()}),300)}function gs(n,e,t,r){var o="1"!==n.dataset.isExpand;t.style.height=o?"".concat(e,"px"):0,o?r.classList.add("vuepress-plugin-demo-block__show-link"):r.classList.remove("vuepress-plugin-demo-block__show-link"),n.dataset.isExpand=o?"1":"0"}var vs={mounted:function(){window.$VUEPRESS_DEMO_BLOCK={jsfiddle:!1,codepen:!0,horizontal:!1},fs()},updated:function(){fs()}},ys="auto",bs="zoom-in",ws="zoom-out",xs="grab",Es="move";function _s(n,e,t){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o={passive:!1};r?n.addEventListener(e,t,o):n.removeEventListener(e,t,o)}function ks(n,e){if(n){var t=new Image;t.onload=function(){e&&e(t)},t.src=n}}function Ss(n){return n.dataset.original?n.dataset.original:"A"===n.parentNode.tagName?n.parentNode.getAttribute("href"):null}function Ts(n,e,t){!function(n){var e=Cs,t=Is;if(n.transition){var r=n.transition;delete n.transition,n[e]=r}if(n.transform){var o=n.transform;delete n.transform,n[t]=o}}(e);var r=n.style,o={};for(var a in e)t&&(o[a]=r[a]||""),r[a]=e[a];return o}var Cs="transition",Is="transform",Ls="transform",As="transitionend";var Ps=function(){},js={enableGrab:!0,preloadImage:!1,closeOnWindowResize:!0,transitionDuration:.4,transitionTimingFunction:"cubic-bezier(0.4, 0, 0, 1)",bgColor:"rgb(255, 255, 255)",bgOpacity:1,scaleBase:1,scaleExtra:.5,scrollThreshold:40,zIndex:998,customSize:null,onOpen:Ps,onClose:Ps,onGrab:Ps,onMove:Ps,onRelease:Ps,onBeforeOpen:Ps,onBeforeClose:Ps,onBeforeGrab:Ps,onBeforeRelease:Ps,onImageLoading:Ps,onImageLoaded:Ps},Os={init:function(n){var e,t;e=this,t=n,Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach((function(n){e[n]=e[n].bind(t)}))},click:function(n){if(n.preventDefault(),Ms(n))return window.open(this.target.srcOriginal||n.currentTarget.src,"_blank");this.shown?this.released?this.close():this.release():this.open(n.currentTarget)},scroll:function(){var n=document.documentElement||document.body.parentNode||document.body,e=window.pageXOffset||n.scrollLeft,t=window.pageYOffset||n.scrollTop;null===this.lastScrollPosition&&(this.lastScrollPosition={x:e,y:t});var r=this.lastScrollPosition.x-e,o=this.lastScrollPosition.y-t,a=this.options.scrollThreshold;(Math.abs(o)>=a||Math.abs(r)>=a)&&(this.lastScrollPosition=null,this.close())},keydown:function(n){(function(n){return"Escape"===(n.key||n.code)||27===n.keyCode})(n)&&(this.released?this.close():this.release(this.close))},mousedown:function(n){if(Ds(n)&&!Ms(n)){n.preventDefault();var e=n.clientX,t=n.clientY;this.pressTimer=setTimeout(function(){this.grab(e,t)}.bind(this),200)}},mousemove:function(n){this.released||this.move(n.clientX,n.clientY)},mouseup:function(n){Ds(n)&&!Ms(n)&&(clearTimeout(this.pressTimer),this.released?this.close():this.release())},touchstart:function(n){n.preventDefault();var e=n.touches[0],t=e.clientX,r=e.clientY;this.pressTimer=setTimeout(function(){this.grab(t,r)}.bind(this),200)},touchmove:function(n){if(!this.released){var e=n.touches[0],t=e.clientX,r=e.clientY;this.move(t,r)}},touchend:function(n){(function(n){n.targetTouches.length})(n)||(clearTimeout(this.pressTimer),this.released?this.close():this.release())},clickOverlay:function(){this.close()},resizeWindow:function(){this.close()}};function Ds(n){return 0===n.button}function Ms(n){return n.metaKey||n.ctrlKey}var qs={init:function(n){this.el=document.createElement("div"),this.instance=n,this.parent=document.body,Ts(this.el,{position:"fixed",top:0,left:0,right:0,bottom:0,opacity:0}),this.updateStyle(n.options),_s(this.el,"click",n.handler.clickOverlay.bind(n))},updateStyle:function(n){Ts(this.el,{zIndex:n.zIndex,backgroundColor:n.bgColor,transition:"opacity\n "+n.transitionDuration+"s\n "+n.transitionTimingFunction})},insert:function(){this.parent.appendChild(this.el)},remove:function(){this.parent.removeChild(this.el)},fadeIn:function(){this.el.offsetWidth,this.el.style.opacity=this.instance.options.bgOpacity},fadeOut:function(){this.el.style.opacity=0}},zs="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},Bs=function(){function n(n,e){for(var t=0;tf||d>g)return{x:f,y:g}}return{x:d,y:d}}};function Ns(){var n=document.documentElement;return{x:Math.min(n.clientWidth,window.innerWidth)/2,y:Math.min(n.clientHeight,window.innerHeight)/2}}function Fs(n,e,t){["mousedown","mousemove","mouseup","touchstart","touchmove","touchend"].forEach((function(r){_s(n,r,e[r],t)}))}var Us=function(){function n(e){!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.target=Object.create($s),this.overlay=Object.create(qs),this.handler=Object.create(Os),this.body=document.body,this.shown=!1,this.lock=!1,this.released=!0,this.lastScrollPosition=null,this.pressTimer=null,this.options=Rs({},js,e),this.overlay.init(this),this.handler.init(this)}return Bs(n,[{key:"listen",value:function(n){if("string"==typeof n)for(var e=document.querySelectorAll(n),t=e.length;t--;)this.listen(e[t]);else"IMG"===n.tagName&&(n.style.cursor=bs,_s(n,"click",this.handler.click),this.options.preloadImage&&ks(Ss(n)));return this}},{key:"config",value:function(n){return n?(Rs(this.options,n),this.overlay.updateStyle(this.options),this):this.options}},{key:"open",value:function(n){var e=this,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.onOpen;if(!this.shown&&!this.lock){var r="string"==typeof n?document.querySelector(n):n;if("IMG"===r.tagName){if(this.options.onBeforeOpen(r),this.target.init(r,this),!this.options.preloadImage){var o=this.target.srcOriginal;null!=o&&(this.options.onImageLoading(r),ks(o,this.options.onImageLoaded))}this.shown=!0,this.lock=!0,this.target.zoomIn(),this.overlay.insert(),this.overlay.fadeIn(),_s(document,"scroll",this.handler.scroll),_s(document,"keydown",this.handler.keydown),this.options.closeOnWindowResize&&_s(window,"resize",this.handler.resizeWindow);var a=function n(){_s(r,As,n,!1),e.lock=!1,e.target.upgradeSource(),e.options.enableGrab&&Fs(document,e.handler,!0),t(r)};return _s(r,As,a),this}}}},{key:"close",value:function(){var n=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.onClose;if(this.shown&&!this.lock){var t=this.target.el;this.options.onBeforeClose(t),this.lock=!0,this.body.style.cursor=ys,this.overlay.fadeOut(),this.target.zoomOut(),_s(document,"scroll",this.handler.scroll,!1),_s(document,"keydown",this.handler.keydown,!1),this.options.closeOnWindowResize&&_s(window,"resize",this.handler.resizeWindow,!1);var r=function r(){_s(t,As,r,!1),n.shown=!1,n.lock=!1,n.target.downgradeSource(),n.options.enableGrab&&Fs(document,n.handler,!1),n.target.restoreCloseStyle(),n.overlay.remove(),e(t)};return _s(t,As,r),this}}},{key:"grab",value:function(n,e){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.options.scaleExtra,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.options.onGrab;if(this.shown&&!this.lock){var o=this.target.el;this.options.onBeforeGrab(o),this.released=!1,this.target.grab(n,e,t);var a=function n(){_s(o,As,n,!1),r(o)};return _s(o,As,a),this}}},{key:"move",value:function(n,e){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.options.scaleExtra,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.options.onMove;if(this.shown&&!this.lock){this.released=!1,this.body.style.cursor=Es,this.target.move(n,e,t);var o=this.target.el,a=function n(){_s(o,As,n,!1),r(o)};return _s(o,As,a),this}}},{key:"release",value:function(){var n=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.onRelease;if(this.shown&&!this.lock){var t=this.target.el;this.options.onBeforeRelease(t),this.lock=!0,this.body.style.cursor=ys,this.target.restoreOpenStyle();var r=function r(){_s(t,As,r,!1),n.lock=!1,n.released=!0,e(t)};return _s(t,As,r),this}}}]),n}();const Ws=JSON.parse('{"bgColor":"rgba(0,0,0,0.6)"}'),Qs=Number("500");class Gs{constructor(){this.instance=new Us(Ws)}update(n=".theme-vdoing-content img:not(.no-zoom)"){"undefined"!=typeof window&&this.instance.listen(n)}updateDelay(n=".theme-vdoing-content img:not(.no-zoom)",e=Qs){setTimeout(()=>this.update(n),e)}}var Hs=[Vi,ns,rs,as,vs,{watch:{"$page.path"(){void 0!==this.$vuepress.zooming&&this.$vuepress.zooming.updateDelay()}},mounted(){this.$vuepress.zooming=new Gs,this.$vuepress.zooming.updateDelay()}}],Vs={name:"GlobalLayout",computed:{layout(){const n=this.getLayout();return Ui("layout",n),Oo.component(n)}},methods:{getLayout(){if(this.$page.path){const n=this.$page.frontmatter.layout;return n&&(this.$vuepress.getLayoutAsyncComponent(n)||this.$vuepress.getVueComponent(n))?n:"Layout"}return"NotFound"}}},Ks=t(6),Zs=Object(Ks.a)(Vs,(function(){var n=this.$createElement;return(this._self._c||n)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(n,e,t){switch(e){case"components":n[e]||(n[e]={}),Object.assign(n[e],t);break;case"mixins":n[e]||(n[e]=[]),n[e].push(...t);break;default:throw new Error("Unknown option name.")}}(Zs,"mixins",Hs);const Js=[{name:"v-45ae3ba1",path:"/archives/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-45ae3ba1").then(t)}},{path:"/archives/index.html",redirect:"/archives/"},{path:"/@pages/archivesPage.html",redirect:"/archives/"},{name:"v-c95a8466",path:"/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-c95a8466").then(t)}},{path:"/index.html",redirect:"/"},{name:"v-171e0198",path:"/pages/0867bd/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-171e0198").then(t)}},{path:"/pages/0867bd/index.html",redirect:"/pages/0867bd/"},{path:"/v1.0.0/010.快速入门/040.避坑指南.html",redirect:"/pages/0867bd/"},{name:"v-004c105b",path:"/pages/949ac4/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-004c105b").then(t)}},{path:"/pages/949ac4/index.html",redirect:"/pages/949ac4/"},{path:"/v1.0.0/010.快速入门/050.快速开始.html",redirect:"/pages/949ac4/"},{name:"v-049ef550",path:"/pages/6e2197/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-049ef550").then(t)}},{path:"/pages/6e2197/index.html",redirect:"/pages/6e2197/"},{path:"/v1.0.0/010.快速入门/030.顾虑粉碎.html",redirect:"/pages/6e2197/"},{name:"v-464a21a4",path:"/pages/12283a/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-464a21a4").then(t)}},{path:"/pages/12283a/index.html",redirect:"/pages/12283a/"},{path:"/v1.0.0/010.快速入门/060.springboot集成demo.html",redirect:"/pages/12283a/"},{name:"v-15fda9dd",path:"/pages/ec7460/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-15fda9dd").then(t)}},{path:"/pages/ec7460/index.html",redirect:"/pages/ec7460/"},{path:"/v1.0.0/010.快速入门/010.简介.html",redirect:"/pages/ec7460/"},{name:"v-514ebfda",path:"/pages/4eb7db/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-514ebfda").then(t)}},{path:"/pages/4eb7db/index.html",redirect:"/pages/4eb7db/"},{path:"/v1.0.0/010.快速入门/080.注解.html",redirect:"/pages/4eb7db/"},{name:"v-7e2d5535",path:"/pages/258e80/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-7e2d5535").then(t)}},{path:"/pages/258e80/index.html",redirect:"/pages/258e80/"},{path:"/v1.0.0/010.快速入门/020.适用场景.html",redirect:"/pages/258e80/"},{name:"v-366c873d",path:"/pages/9a3e4c/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-366c873d").then(t)}},{path:"/pages/9a3e4c/index.html",redirect:"/pages/9a3e4c/"},{path:"/v1.0.0/010.快速入门/070.配置.html",redirect:"/pages/9a3e4c/"},{name:"v-69171a4a",path:"/pages/1cebb8/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-69171a4a").then(t)}},{path:"/pages/1cebb8/index.html",redirect:"/pages/1cebb8/"},{path:"/v1.0.0/020.核心功能/030.条件构造器.html",redirect:"/pages/1cebb8/"},{name:"v-da0fbfe4",path:"/pages/4446a5/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-da0fbfe4").then(t)}},{path:"/pages/4446a5/index.html",redirect:"/pages/4446a5/"},{path:"/v1.0.0/030.拓展功能/020.原生查询.html",redirect:"/pages/4446a5/"},{name:"v-288054d3",path:"/pages/06b5d9/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-288054d3").then(t)}},{path:"/pages/06b5d9/index.html",redirect:"/pages/06b5d9/"},{path:"/v1.0.0/020.核心功能/010.索引处理.html",redirect:"/pages/06b5d9/"},{name:"v-7470134b",path:"/pages/a19563/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-7470134b").then(t)}},{path:"/pages/a19563/index.html",redirect:"/pages/a19563/"},{path:"/v1.0.0/030.拓展功能/010.混合查询.html",redirect:"/pages/a19563/"},{name:"v-3d8b3548",path:"/pages/0cf11e/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-3d8b3548").then(t)}},{path:"/pages/0cf11e/index.html",redirect:"/pages/0cf11e/"},{path:"/v1.0.0/030.拓展功能/030.分页查询.html",redirect:"/pages/0cf11e/"},{name:"v-7191526a",path:"/pages/c5999a/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-7191526a").then(t)}},{path:"/pages/c5999a/index.html",redirect:"/pages/c5999a/"},{path:"/v1.0.0/020.核心功能/020.CRUD接口.html",redirect:"/pages/c5999a/"},{name:"v-f04c882c",path:"/pages/05702c/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-f04c882c").then(t)}},{path:"/pages/05702c/index.html",redirect:"/pages/05702c/"},{path:"/v1.0.0/030.拓展功能/040.嵌套类型.html",redirect:"/pages/05702c/"},{name:"v-693db66d",path:"/pages/0bbd7e/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-693db66d").then(t)}},{path:"/pages/0bbd7e/index.html",redirect:"/pages/0bbd7e/"},{path:"/v1.0.0/030.拓展功能/050.父子类型.html",redirect:"/pages/0bbd7e/"},{name:"v-48a65df4",path:"/pages/c9c57f/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-48a65df4").then(t)}},{path:"/pages/c9c57f/index.html",redirect:"/pages/c9c57f/"},{path:"/v1.0.0/040.高阶语法/010.查询字段过滤.html",redirect:"/pages/c9c57f/"},{name:"v-0a0bb08f",path:"/pages/274da8/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-0a0bb08f").then(t)}},{path:"/pages/274da8/index.html",redirect:"/pages/274da8/"},{path:"/v1.0.0/040.高阶语法/020.排序.html",redirect:"/pages/274da8/"},{name:"v-5b90b78a",path:"/pages/899c12/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-5b90b78a").then(t)}},{path:"/pages/899c12/index.html",redirect:"/pages/899c12/"},{path:"/v1.0.0/040.高阶语法/060.高亮查询.html",redirect:"/pages/899c12/"},{name:"v-23dba453",path:"/pages/2688d1/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-23dba453").then(t)}},{path:"/pages/2688d1/index.html",redirect:"/pages/2688d1/"},{path:"/v1.0.0/040.高阶语法/040.分词查询.html",redirect:"/pages/2688d1/"},{name:"v-0cee86be",path:"/pages/e6fc8d/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-0cee86be").then(t)}},{path:"/pages/e6fc8d/index.html",redirect:"/pages/e6fc8d/"},{path:"/v1.0.0/040.高阶语法/050.权重.html",redirect:"/pages/e6fc8d/"},{name:"v-ff37c92c",path:"/pages/981130/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-ff37c92c").then(t)}},{path:"/pages/981130/index.html",redirect:"/pages/981130/"},{path:"/v1.0.0/030.拓展功能/060.获取DSL语句.html",redirect:"/pages/981130/"},{name:"v-486924ca",path:"/pages/6431d1/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-486924ca").then(t)}},{path:"/pages/6431d1/index.html",redirect:"/pages/6431d1/"},{path:"/v1.0.0/050.插件/010.插件.html",redirect:"/pages/6431d1/"},{name:"v-7b83d27a",path:"/pages/b508b3/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-7b83d27a").then(t)}},{path:"/pages/b508b3/index.html",redirect:"/pages/b508b3/"},{path:"/v1.0.0/040.高阶语法/030.聚合查询.html",redirect:"/pages/b508b3/"},{name:"v-7814f9e3",path:"/pages/453119/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-7814f9e3").then(t)}},{path:"/pages/453119/index.html",redirect:"/pages/453119/"},{path:"/v1.0.0/060.其它/010.问答.html",redirect:"/pages/453119/"},{name:"v-6bd52905",path:"/pages/39b41e/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-6bd52905").then(t)}},{path:"/pages/39b41e/index.html",redirect:"/pages/39b41e/"},{path:"/v1.0.0/040.高阶语法/070.GEO地理位置查询.html",redirect:"/pages/39b41e/"},{name:"v-57c32053",path:"/pages/6fea40/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-57c32053").then(t)}},{path:"/pages/6fea40/index.html",redirect:"/pages/6fea40/"},{path:"/v1.0.0/060.其它/030.MySQL和EE语法对比.html",redirect:"/pages/6fea40/"},{name:"v-ffbd0264",path:"/pages/98d3d3/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-ffbd0264").then(t)}},{path:"/pages/98d3d3/index.html",redirect:"/pages/98d3d3/"},{path:"/v1.0.0/060.其它/020.与MP差异.html",redirect:"/pages/98d3d3/"},{name:"v-1de24003",path:"/pages/7d828w/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-1de24003").then(t)}},{path:"/pages/7d828w/index.html",redirect:"/pages/7d828w/"},{path:"/参与贡献.html",redirect:"/pages/7d828w/"},{name:"v-deae6af8",path:"/pages/796d01/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-deae6af8").then(t)}},{path:"/pages/796d01/index.html",redirect:"/pages/796d01/"},{path:"/v1.0.0/060.其它/060.版权.html",redirect:"/pages/796d01/"},{name:"v-6b697dfa",path:"/pages/b65406/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-6b697dfa").then(t)}},{path:"/pages/b65406/index.html",redirect:"/pages/b65406/"},{path:"/v1.0.0/060.其它/040.更新日志.html",redirect:"/pages/b65406/"},{name:"v-4418951c",path:"/pages/e14b42/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-4418951c").then(t)}},{path:"/pages/e14b42/index.html",redirect:"/pages/e14b42/"},{path:"/v1.0.0/060.其它/050.更新计划.html",redirect:"/pages/e14b42/"},{name:"v-5a329570",path:"/pages/4d7703/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-5a329570").then(t)}},{path:"/pages/4d7703/index.html",redirect:"/pages/4d7703/"},{path:"/v1.0.0/060.其它/070.鸣谢.html",redirect:"/pages/4d7703/"},{name:"v-7b689745",path:"/pages/fb599d/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-7b689745").then(t)}},{path:"/pages/fb599d/index.html",redirect:"/pages/fb599d/"},{path:"/支持/01.支持.html",redirect:"/pages/fb599d/"},{name:"v-64e509e5",path:"/pages/55wa9d/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-64e509e5").then(t)}},{path:"/pages/55wa9d/index.html",redirect:"/pages/55wa9d/"},{path:"/关于项目.html",redirect:"/pages/55wa9d/"},{name:"v-fb1b2cdc",path:"/pages/kd129d/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-fb1b2cdc").then(t)}},{path:"/pages/kd129d/index.html",redirect:"/pages/kd129d/"},{path:"/加入社区讨论.html",redirect:"/pages/kd129d/"},{name:"v-3fb4db14",path:"/pages/6f829d/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-3fb4db14").then(t)}},{path:"/pages/6f829d/index.html",redirect:"/pages/6f829d/"},{path:"/谁在使用.html",redirect:"/pages/6f829d/"},{name:"v-5b2b8848",path:"/pages/b52ac5/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-5b2b8848").then(t)}},{path:"/pages/b52ac5/index.html",redirect:"/pages/b52ac5/"},{path:"/支持/02.赞助者列表.html",redirect:"/pages/b52ac5/"},{name:"v-248149e0",path:"/pages/1a819d/",component:Zs,beforeEnter:(n,e,t)=>{Fi("Layout","v-248149e0").then(t)}},{path:"/pages/1a819d/index.html",redirect:"/pages/1a819d/"},{path:"/生态.html",redirect:"/pages/1a819d/"},{path:"*",component:Zs}],Xs={title:"Easy-Es",description:"傻瓜级ElasticSearch搜索引擎ORM框架",base:"/",headTags:[["link",{rel:"icon",href:"/img/logo.svg"}],["meta",{name:"keywords",content:"liteflow,liteflow官网,规则引擎,流程引擎,开源,java规则引擎,rule engine,open source"}],["meta",{name:"theme-color",content:"#11a8cd"}],["meta",{name:"wwads-cn-verify",content:"6c4b761a28b734fe93831e3fb400ce87"}],["script",{async:!0,src:"https://cdn.wwads.cn/js/makemoney.js",type:"text/javascript"}],["script",{},'\n // 万维广告“禁止”广告拦截\n // function called if wwads is blocked\n // https://github.com/bytegravity/whitelist-wwads\n function ABDetected() {\n var adBlockDetected_div = document.createElement("div");\n document.body.appendChild(adBlockDetected_div);\n var navbar = document.querySelector(".navbar");\n navbar.style.cssText="transition:top 300ms;top:33px";\n adBlockDetected_div.style.cssText = "position: fixed; top: 0; left: 0; width: 100%; background: #E01E5A; color: #fff; z-index: 9999999999; font-size: 14px; text-align: center; line-height: 1.5; font-weight: bold; padding-top: 6px; padding-bottom: 6px;";\n adBlockDetected_div.innerHTML = "我们的广告服务商 并不跟踪您的隐私,为了支持本站的长期运营,请将我们的网站 加入广告拦截器的白名单。";\n document.getElementsByTagName("body")[0].appendChild(adBlockDetected_div);\n // add a close button to the right side of the div\n var adBlockDetected_close = document.createElement("div");\n adBlockDetected_close.style.cssText = "position: absolute; top: 0; right: 10px; width: 30px; height: 30px; background: #E01E5A; color: #fff; z-index: 9999999999; line-height: 30px; cursor: pointer;";\n adBlockDetected_close.innerHTML = "×";\n adBlockDetected_div.appendChild(adBlockDetected_close);\n // add a click event to the close button\n adBlockDetected_close.onclick = function() {\n this.parentNode.parentNode.removeChild(this.parentNode);\n navbar.style.cssText="transition:top 300ms;top:0";\n };\n }\n\n function vote() {\n var voteDetected_div = document.createElement("div");\n voteDetected_div.style.cssText = "position: absolute; top: 0; left: 0; width: 100%; background: #7bbfea; color: #fff; z-index: 9999999999; font-size: 14px; text-align: center; line-height: 1.5; font-weight: bold; padding-top: 6px; padding-bottom: 6px;";\n voteDetected_div.innerHTML = "LiteFlow 正在参与“2021年度 OSC 中国开源项目”评选,请为我们投上宝贵的一票,谢谢!";\n document.getElementsByTagName("body")[0].appendChild(voteDetected_div);\n voteDetected_div.onclick = function() {\n this.remove();\n };\n }\n\n function docReady(t) {\n "complete" === document.readyState ||\n "interactive" === document.readyState\n ? setTimeout(t, 1)\n : document.addEventListener("DOMContentLoaded", t);\n }\n\n //check if wwads\' fire function was blocked after document is ready with 3s timeout (waiting the ad loading)\n docReady(function () {\n setTimeout(function () {\n if( window._AdBlockInit === undefined ){\n ABDetected();\n }\n }, 3000);\n });\n ']],pages:[{title:"归档",frontmatter:{archivesPage:!0,title:"归档",permalink:"/archives/",article:!1},regularPath:"/@pages/archivesPage.html",relativePath:"@pages/archivesPage.md",key:"v-45ae3ba1",path:"/archives/",headersStr:null,content:"",normalizedContent:"",charsets:{},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"Home",frontmatter:{home:!0,heroImage:"/img/logo.svg",tagline:"🚀傻瓜级ElasticSearch搜索引擎ORM框架",actionText:"开始使用 →",actionLink:"/pages/ec7460/",bannerBg:"/img/back.png",features:[{title:"轻巧强大",details:"小身躯蕴藏着大能量,几乎零学习成本,几分钟就能上手。却可以完成复杂的ES功能。"},{title:"简单高效",details:"先进的设计理念,简单至上,即便是不懂ES的小白,也能轻松驾驭,并节省3-8倍代码量。"},{title:"功能丰富",details:"自动索引托管,自动分页,傻瓜级CRUD,高亮,权重,聚合,IP,GEO地理位置,父子嵌套,应有尽有。"}],postList:"none"},regularPath:"/",relativePath:"index.md",key:"v-c95a8466",path:"/",headers:[{level:2,title:"🍬特性",slug:"🍬特性",normalizedTitle:"🍬特性",charIndex:16},{level:2,title:"✨最新版本 Latest Version: ![Maven Central](https://search.maven.org/search?q=g:io.github.xpc1024%20a:easy-*)",slug:"✨最新版本-latest-version",normalizedTitle:'✨最新版本 latest version: maven central',charIndex:null},{level:2,title:"🎉致谢",slug:"🎉致谢",normalizedTitle:"🎉致谢",charIndex:1276},{level:2,title:"🏡代码托管",slug:"🏡代码托管",normalizedTitle:"🏡代码托管",charIndex:1479},{level:2,title:"💪🏻参与开发",slug:"💪🏻参与开发",normalizedTitle:"💪🏻参与开发",charIndex:1491},{level:2,title:"🍭架构图",slug:"🍭架构图",normalizedTitle:"🍭架构图",charIndex:1557},{level:2,title:"🧲友情链接",slug:"🧲友情链接",normalizedTitle:"🧲友情链接",charIndex:1568}],headersStr:"🍬特性 ✨最新版本 Latest Version: ![Maven Central](https://search.maven.org/search?q=g:io.github.xpc1024%20a:easy-*) 🎉致谢 🏡代码托管 💪🏻参与开发 🍭架构图 🧲友情链接",content:"\n\n\n\n支持这个项目\n\n\n\n# 🍬特性\n\n * 零侵入:针对ES官方提供的RestHighLevelClient只做增强不做改变,引入EE不会对现有工程产生影响,使用体验如丝般顺滑。\n * 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作。\n * 自动化: 全球领先的哥哥你不用动,索引我全自动模式,帮助开发者和运维杜绝索引困扰。\n * 强大的 CRUD 操作:内置通用 Mapper,仅仅通过少量配置即可实现大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求。\n * 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错段。\n * 支持主键自动生成:支持多种主键策略,可自由配置,完美解决主键问题。\n * 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作。\n * 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )。\n * 内置分页插件:基于RestHighLevelClient 物理分页,开发者无需关心具体操作,且无需额外配置插件,写分页等同于普通 List 查询,比MP的PageHelper插件用起来更简单,且保持与其同样的分页返回字段,无需担心命名影响。\n * MySQL功能全覆盖:MySQL中支持的功能通过EE都可以轻松实现。\n * 支持ES高阶语法:支持聚合,嵌套,父子类型,高亮搜索,分词查询,权重查询,Geo地理位置查询,IP查询等高阶语法,应有尽有。\n * 良好的拓展性:底层仍使用RestHighLevelClient,可保持其拓展性,开发者在使用EE的同时,仍可使用RestHighLevelClient的所有功能。\n\n\n\n# ✨最新版本 Latest Version:\n\nMaven:\n\n\n cn.easy-es\n easy-es-boot-starter\n Latest Version\n\n\n\n1\n2\n3\n4\n5\n\n\nGradle:\n\ncompile group: 'cn.easy-es', name: 'easy-es-boot-starter', version: 'Latest Version'\n\n\n1\n\n\n版本稳定吗?\n\n在1.0正式稳定版本发布前,我们所有功能已经面向全球开发者长期试用, 而且针对每项功能我们都有测试用例覆盖.\n\n另外我们针对整个框架的性能,安全等方面都做了理论分析+实际测试,确保每位用户用得放心.\n\n我们由Star总数超10万的Dromara社区孵化,并有良好的社区答疑群。基本上有问必答,如出现bug,通常2个工作日内必解决。\n\n所以,请放心使用!\n\n\n\n# 🎉致谢\n\nEasy-Es自从2021年开源以来,获得了很多人的支持。目前社区群答疑总计超500人,收获Star超2K, 尽管这算不上很多,但对于ES这种高门槛,低频使用的工具,已经算得上优秀了,而且开源至今时间不超半年,\n\n这离不开社区小伙伴的支持和意见以及PR,感谢你们!我们会秉承\"把简单,易用,方便留给用户,把复杂留给框架\"的理念,致力于实现\"让天下没有难用的ES\"愿景,继续砥砺前行!\n\n\n\n# 🏡代码托管\n\n\n\n# 💪🏻参与开发\n\n欢迎各路好汉一起来参与完善 Easy-Es,我们期待您的 PR!\n\n如果您想贡献,请先查看参与开发。\n\n\n\n# 🍭架构图\n\n\n\n# 🧲友情链接",normalizedContent:"\n\n\n\n支持这个项目\n\n\n\n# 🍬特性\n\n * 零侵入:针对es官方提供的resthighlevelclient只做增强不做改变,引入ee不会对现有工程产生影响,使用体验如丝般顺滑。\n * 损耗小:启动即会自动注入基本 curd,性能基本无损耗,直接面向对象操作。\n * 自动化: 全球领先的哥哥你不用动,索引我全自动模式,帮助开发者和运维杜绝索引困扰。\n * 强大的 crud 操作:内置通用 mapper,仅仅通过少量配置即可实现大部分 crud 操作,更有强大的条件构造器,满足各类使用需求。\n * 支持 lambda 形式调用:通过 lambda 表达式,方便的编写各类查询条件,无需再担心字段写错段。\n * 支持主键自动生成:支持多种主键策略,可自由配置,完美解决主键问题。\n * 支持 activerecord 模式:支持 activerecord 形式调用,实体类只需继承 model 类即可进行强大的 crud 操作。\n * 支持自定义全局通用操作:支持全局通用方法注入( write once, use anywhere )。\n * 内置分页插件:基于resthighlevelclient 物理分页,开发者无需关心具体操作,且无需额外配置插件,写分页等同于普通 list 查询,比mp的pagehelper插件用起来更简单,且保持与其同样的分页返回字段,无需担心命名影响。\n * mysql功能全覆盖:mysql中支持的功能通过ee都可以轻松实现。\n * 支持es高阶语法:支持聚合,嵌套,父子类型,高亮搜索,分词查询,权重查询,geo地理位置查询,ip查询等高阶语法,应有尽有。\n * 良好的拓展性:底层仍使用resthighlevelclient,可保持其拓展性,开发者在使用ee的同时,仍可使用resthighlevelclient的所有功能。\n\n\n\n# ✨最新版本 latest version:\n\nmaven:\n\n\n cn.easy-es\n easy-es-boot-starter\n latest version\n\n\n\n1\n2\n3\n4\n5\n\n\ngradle:\n\ncompile group: 'cn.easy-es', name: 'easy-es-boot-starter', version: 'latest version'\n\n\n1\n\n\n版本稳定吗?\n\n在1.0正式稳定版本发布前,我们所有功能已经面向全球开发者长期试用, 而且针对每项功能我们都有测试用例覆盖.\n\n另外我们针对整个框架的性能,安全等方面都做了理论分析+实际测试,确保每位用户用得放心.\n\n我们由star总数超10万的dromara社区孵化,并有良好的社区答疑群。基本上有问必答,如出现bug,通常2个工作日内必解决。\n\n所以,请放心使用!\n\n\n\n# 🎉致谢\n\neasy-es自从2021年开源以来,获得了很多人的支持。目前社区群答疑总计超500人,收获star超2k, 尽管这算不上很多,但对于es这种高门槛,低频使用的工具,已经算得上优秀了,而且开源至今时间不超半年,\n\n这离不开社区小伙伴的支持和意见以及pr,感谢你们!我们会秉承\"把简单,易用,方便留给用户,把复杂留给框架\"的理念,致力于实现\"让天下没有难用的es\"愿景,继续砥砺前行!\n\n\n\n# 🏡代码托管\n\n\n\n# 💪🏻参与开发\n\n欢迎各路好汉一起来参与完善 easy-es,我们期待您的 pr!\n\n如果您想贡献,请先查看参与开发。\n\n\n\n# 🍭架构图\n\n\n\n# 🧲友情链接",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"避坑指南",frontmatter:{title:"避坑指南",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/0867bd/"},regularPath:"/v1.0.0/010.%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/040.%E9%81%BF%E5%9D%91%E6%8C%87%E5%8D%97.html",relativePath:"v1.0.0/010.快速入门/040.避坑指南.md",key:"v-171e0198",path:"/pages/0867bd/",headers:[{level:2,title:"1.ES版本及SpringBoot版本",slug:"_1-es版本及springboot版本",normalizedTitle:"1.es版本及springboot版本",charIndex:124},{level:2,title:"2.ES索引的keyword类型和text类型",slug:"_2-es索引的keyword类型和text类型",normalizedTitle:"2.es索引的keyword类型和text类型",charIndex:456},{level:2,title:"3.字段id",slug:"_3-字段id",normalizedTitle:"3.字段id",charIndex:1242},{level:2,title:"4.项目中同时使用Mybatis-Plus和Easy-Es",slug:"_4-项目中同时使用mybatis-plus和easy-es",normalizedTitle:"4.项目中同时使用mybatis-plus和easy-es",charIndex:1734},{level:2,title:"5.and和or的使用",slug:"_5-and和or的使用",normalizedTitle:"5.and和or的使用",charIndex:1932}],headersStr:"1.ES版本及SpringBoot版本 2.ES索引的keyword类型和text类型 3.字段id 4.项目中同时使用Mybatis-Plus和Easy-Es 5.and和or的使用",content:'提示\n\n古语有云"工欲善其事,必先利器","磨刀不误砍柴工"...\n\n为了让每位用户(尤其是小白)尽量避免踩坑,节省更多时间,特此总结一篇避坑指南,在正式使用EE之前,不妨花三五分钟学习一下,可以帮各位在使用中避免踩坑,从而节省大量时间.\n\n\n# 1.ES版本及SpringBoot版本\n\n由于我们底层用了ES官方的RestHighLevelClient,所以对ES版本有要求,底层用的RestHighLevelClient版本为7.10,所以对7.10的es兼容性最好,目前实测下来ES版本为7.x 都可以完美兼容.\n底层使用的Springboot版本为2.5.4,所以我们推荐用户springboot版本也用2.5.4,由于我们对Springboot的依赖模块比较少,目前实测下来2.3.x-2.6.x的Springboot都可以完美兼容,更低或者更高的版本没有实测,用户可自行测试,我们也不清楚springboot2.5.4具体能向下和向上兼容到什么版本,总之还是推荐尽量和框架内置版本保持一致.\n\n\n# 2.ES索引的keyword类型和text类型\n\n> 对ES索引类型已经了解的可直接跳过此段介绍.\n\nES中的keyword类型,和MySQL中的字段基本上差不多,当我们需要对查询字段进行精确匹配,左模糊,右模糊,全模糊,排序聚合等操作时,需要该字段的索引类型为keyword类型,否则你会发现查询没有查出想要的结果,甚至报错. 比如EE中常用的API eq(),like(),distinct()等都需要字段类型为keyword类型.\n\n当我们需要对字段进行分词查询时,需要该字段的类型为text类型,并且指定分词器(不指定就用ES默认分词器,效果通常不理想). 比如EE中常用的API match()等都需要字段类型为text类型. 当使用match查询时未查询到预期结果时,可以先检查索引类型,然后再检查分词器,因为如果一个词没被分词器分出来,那结果也是查询不出来的.\n\n当同一个字段,我们既需要把它当keyword类型使用,又需要把它当text类型使用时,此时我们的索引类型为keyword_text类型,EE中可以对字段添加注解@TableField(fieldType = FieldType.KEYWORD_TEXT),如此该字段就会被创建为keyword+text双类型如下图所示,值得注意的是,当我们把该字段当做keyword类型查询时,ES要求传入的字段名称为"字段名.keyword",当把该字段当text类型查询时,直接使用原字段名即可.\n\n\n\n另一种做法是,可以冗余一个字段,值用相同的,一个注解标记为keyword类型,另一个标记为text类型,查询时按规则选择对应字段进行查询.\n\n还需要注意的是,如果一个字段的索引类型被创建为仅为keyword类型(如下图所示)查询时,则不需要在其名称后面追加.keyword,直接查询就行.\n\n\n\n\n# 3.字段id\n\n由于框架很多功能都是借助id实现的,比如selectById,update,deleteById...,而且ES中也必须有一列作为数据id,因此我们强制要求用户封装的实体类中包含字段id列,否则框架不少功能无法正常使用.\n\npublic class Document {\n /**\n * es中的唯一id,如果你想自定义es中的id为你提供的id,比如MySQL中的id,请将注解中的type指定为customize或直接在全局配置文件中指定,如此id便支持任意数据类型)\n */\n @TableId(type = IdType.CUSTOMIZE)\n private String id;\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n\n\n如果不添加@TableId注解或者添加了注解但未指定type,则id默认为es自动生成的id.\n\n在调用insert方法时,如果该id数据在es中不存在,则新增该数据,如果已有该id数据,则即便你调用的是insert方法,实际上的效果也是更新该id对应的数据,这点需要区别于MP和MySQL.\n\n\n# 4.项目中同时使用Mybatis-Plus和Easy-Es\n\n在此场景下,您需要将MP的mapper和EE的mapper分别放在不同的目录下,并在配置扫描路径时各自配各自的扫描路径,如此便可共存使用了,否则两者在SpringBoot启动时都去扫描同一路径,并尝试注册为自己的bean,由于底层实现依赖的类完全不一样,所以会导致其中之一注册失败,整个项目无法正常启动.可参考下图:\n\n\n\n\n\n\n# 5.and和or的使用\n\n需要区别于MySQL和MP,因为ES的查询参数是树形数据结构,和MySQL平铺的不一样,具体可参考条件构造器-and&or章节,有详细节省\n\n关于避坑暂时先讲这么多,后续如果有补充再追加,祝各位主公使用愉快,使用过程中有任何疑问及建议,可添加我微信252645816反馈,我们也有专门的答疑群为各位主公们免费服务.',normalizedContent:'提示\n\n古语有云"工欲善其事,必先利器","磨刀不误砍柴工"...\n\n为了让每位用户(尤其是小白)尽量避免踩坑,节省更多时间,特此总结一篇避坑指南,在正式使用ee之前,不妨花三五分钟学习一下,可以帮各位在使用中避免踩坑,从而节省大量时间.\n\n\n# 1.es版本及springboot版本\n\n由于我们底层用了es官方的resthighlevelclient,所以对es版本有要求,底层用的resthighlevelclient版本为7.10,所以对7.10的es兼容性最好,目前实测下来es版本为7.x 都可以完美兼容.\n底层使用的springboot版本为2.5.4,所以我们推荐用户springboot版本也用2.5.4,由于我们对springboot的依赖模块比较少,目前实测下来2.3.x-2.6.x的springboot都可以完美兼容,更低或者更高的版本没有实测,用户可自行测试,我们也不清楚springboot2.5.4具体能向下和向上兼容到什么版本,总之还是推荐尽量和框架内置版本保持一致.\n\n\n# 2.es索引的keyword类型和text类型\n\n> 对es索引类型已经了解的可直接跳过此段介绍.\n\nes中的keyword类型,和mysql中的字段基本上差不多,当我们需要对查询字段进行精确匹配,左模糊,右模糊,全模糊,排序聚合等操作时,需要该字段的索引类型为keyword类型,否则你会发现查询没有查出想要的结果,甚至报错. 比如ee中常用的api eq(),like(),distinct()等都需要字段类型为keyword类型.\n\n当我们需要对字段进行分词查询时,需要该字段的类型为text类型,并且指定分词器(不指定就用es默认分词器,效果通常不理想). 比如ee中常用的api match()等都需要字段类型为text类型. 当使用match查询时未查询到预期结果时,可以先检查索引类型,然后再检查分词器,因为如果一个词没被分词器分出来,那结果也是查询不出来的.\n\n当同一个字段,我们既需要把它当keyword类型使用,又需要把它当text类型使用时,此时我们的索引类型为keyword_text类型,ee中可以对字段添加注解@tablefield(fieldtype = fieldtype.keyword_text),如此该字段就会被创建为keyword+text双类型如下图所示,值得注意的是,当我们把该字段当做keyword类型查询时,es要求传入的字段名称为"字段名.keyword",当把该字段当text类型查询时,直接使用原字段名即可.\n\n\n\n另一种做法是,可以冗余一个字段,值用相同的,一个注解标记为keyword类型,另一个标记为text类型,查询时按规则选择对应字段进行查询.\n\n还需要注意的是,如果一个字段的索引类型被创建为仅为keyword类型(如下图所示)查询时,则不需要在其名称后面追加.keyword,直接查询就行.\n\n\n\n\n# 3.字段id\n\n由于框架很多功能都是借助id实现的,比如selectbyid,update,deletebyid...,而且es中也必须有一列作为数据id,因此我们强制要求用户封装的实体类中包含字段id列,否则框架不少功能无法正常使用.\n\npublic class document {\n /**\n * es中的唯一id,如果你想自定义es中的id为你提供的id,比如mysql中的id,请将注解中的type指定为customize或直接在全局配置文件中指定,如此id便支持任意数据类型)\n */\n @tableid(type = idtype.customize)\n private string id;\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n\n\n如果不添加@tableid注解或者添加了注解但未指定type,则id默认为es自动生成的id.\n\n在调用insert方法时,如果该id数据在es中不存在,则新增该数据,如果已有该id数据,则即便你调用的是insert方法,实际上的效果也是更新该id对应的数据,这点需要区别于mp和mysql.\n\n\n# 4.项目中同时使用mybatis-plus和easy-es\n\n在此场景下,您需要将mp的mapper和ee的mapper分别放在不同的目录下,并在配置扫描路径时各自配各自的扫描路径,如此便可共存使用了,否则两者在springboot启动时都去扫描同一路径,并尝试注册为自己的bean,由于底层实现依赖的类完全不一样,所以会导致其中之一注册失败,整个项目无法正常启动.可参考下图:\n\n\n\n\n\n\n# 5.and和or的使用\n\n需要区别于mysql和mp,因为es的查询参数是树形数据结构,和mysql平铺的不一样,具体可参考条件构造器-and&or章节,有详细节省\n\n关于避坑暂时先讲这么多,后续如果有补充再追加,祝各位主公使用愉快,使用过程中有任何疑问及建议,可添加我微信252645816反馈,我们也有专门的答疑群为各位主公们免费服务.',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"快速开始",frontmatter:{title:"快速开始",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/949ac4/"},regularPath:"/v1.0.0/010.%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/050.%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B.html",relativePath:"v1.0.0/010.快速入门/050.快速开始.md",key:"v-004c105b",path:"/pages/949ac4/",headers:[{level:2,title:"初始化工程",slug:"初始化工程",normalizedTitle:"初始化工程",charIndex:429},{level:2,title:"添加依赖",slug:"添加依赖",normalizedTitle:"添加依赖",charIndex:513},{level:2,title:"配置",slug:"配置",normalizedTitle:"配置",charIndex:859},{level:2,title:"背景",slug:"背景",normalizedTitle:"背景",charIndex:1452},{level:2,title:"编码",slug:"编码",normalizedTitle:"编码",charIndex:1571},{level:2,title:"开始使用(CRUD)",slug:"开始使用-crud",normalizedTitle:"开始使用(crud)",charIndex:2470},{level:2,title:"小结",slug:"小结",normalizedTitle:"小结",charIndex:4679}],headersStr:"初始化工程 添加依赖 配置 背景 编码 开始使用(CRUD) 小结",content:'提示\n\n如果您用过Mybatis-Plus的话,您基本上可以无需多看此文档即可直接上手使用 Easy-Es是Mybatis-Plus在Elastic Search的平替版.\n\n我们将通过一个简单的 Demo 来阐述 Easy-Es 的强大功能,在此之前,我们假设您已经:\n\n * 拥有 Java 开发环境以及相应 IDE\n * 熟悉MySQL\n * 熟悉 Spring Boot (推荐版本2.5.x +)\n * 熟悉 Maven\n * 了解Es基本概念或已读避坑指南 (强烈推荐)\n * 已安装Es 推荐7.x+版本(没有安装的可自行百度教程,建议再装一个es-head插件,便于可视化验证),低版本可能存在API不兼容或其它未知情况,因为底层采用RestHighLevelClient而非RestLowLevelClient,本Demo采用Es版本为7.10.0\n\n推荐\n\n推荐您参考这篇Springboo集成demo,可帮助您节省您更多时间.\n\n\n# 初始化工程\n\n创建一个空的 Spring Boot 工程\n\n提示\n\n可以使用 Spring Initializer快速初始化一个 Spring Boot 工程\n\n\n# 添加依赖\n\nMaven:\n\n \n cn.easy-es\n easy-es-boot-starter\n Latest Version\n \n\n\n1\n2\n3\n4\n5\n\n\nGradle:\n\ncompile group: \'cn.easy-es\', name: \'easy-es-boot-starter\', version: \'Latest Version\'\n\n\n1\n\n\n提示\n\nLatest Version: 点此获取\n\n\n# 配置\n\n在 application.yml 配置文件中添加EasyEs必须的相关配置:\n\neasy-es:\n enable: true #默认为true,若为false则认为不启用本框架\n address : 127.0.0.1:9200 # es的连接地址,必须含端口 若为集群,则可以用逗号隔开 例如:127.0.0.1:9200,127.0.0.2:9200\n username: elastic #若无 则可省略此行配置\n password: WG7WVmuNMtM4GwNYkyWH #若无 则可省略此行配置\n\n\n1\n2\n3\n4\n5\n\n\n其它配置暂可省略,后面有章节详细介绍EasyEs的配置\n\n在 Spring Boot 启动类中添加 @EsMapperScan 注解,扫描 Mapper 文件夹:\n\n@SpringBootApplication\n@EsMapperScan("com.xpc.easyes.sample.mapper")\npublic class Application {\n\n public static void main(String[] args) {\n SpringApplication.run(Application.class, args);\n }\n\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n\n# 背景\n\n现有一张Document文档表,随着数据量膨胀,其查询效率已经无法满足产品需求,其表结构如下,我们打算将此表内容迁移至Es搜索引擎,提高查询效率\n\nID TITLE CONTENT\n主键 标题 内容\n\n\n# 编码\n\n编写实体类Document.java(此处使用了 Lombok简化代码)\n\n@Data\npublic class Document {\n /**\n * es中的唯一id\n */\t\n private String id;\n /**\n * 文档标题\n */\n private String title;\n /**\n * 文档内容\n */\n private String content;\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n\n\n温馨提示\n\n * 上面字段名称以及下划线转自动驼峰,字段在ES中的存储类型,分词器等均可配置,在后续章节会有介绍.\n * String类型默认会被EE创建为keyword类型,keyword类型支持精确查询等\n * 如需分词查询,可像上面content一样,在字段上加上@TableField注解并指明字段类型为text,并指定分词器.\n\n编写Mapper类 DocumentMapper.java\n\npublic interface DocumentMapper extends BaseEsMapper {\n}\n\n\n1\n2\n\n\n##前置操作\n\n启动项目,由Easy-Es自动帮您创建索引(相当于MySQL等数据库中的表),有了索引才能进行后续CRUD操作.索引托管成功后,您可在控制台看到:===> Congratulations auto process index by Easy-Es is done !\n\n温馨提示\n\n * 后续如若索引有更新,索引重建,更新,数据迁移等工作默认都由EE自动帮您完成,当然您也可以通过配置关闭索引自动托管,可通过EE提供的API手动维护或es-head等插件维护.\n * 自动托管模式(0.9.9+版本支持),相关配置及详细介绍可在后面章节中看到,此处您只管将这些烦人的步骤交给EE去自动处理即可.\n * 若您EE版本低于该版本,可通过EE提供的API手动维护索引\n\n\n# 开始使用(CRUD)\n\n添加测试类,进行功能测试:\n\n> 测试新增: 新增一条数据(相当于MySQL中的Insert操作)\n\n @Test\n public void testInsert() {\n // 测试插入数据\n Document document = new Document();\n document.setTitle("老汉");\n document.setContent("推*技术过硬");\n String id = documentMapper.insert(document);\n System.out.println(id);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n> 测试查询:根据条件查询指定数据(相当于MySQL中的Select操作)\n\n @Test\n public void testSelect() {\n // 测试查询\n String title = "老汉";\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.eq(Document::getTitle,title);\n Document document = documentMapper.selectOne(wrapper);\n System.out.println(document);\n Assert.assertEquals(title,document.getTitle());\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n> 测试更新:更新数据(相当于MySQL中的Update操作)\n\n @Test\n public void testUpdate() {\n // 测试更新 更新有两种情况 分别演示如下:\n // case1: 已知id, 根据id更新 (为了演示方便,此id是从上一步查询中复制过来的,实际业务可以自行查询)\n String id = "krkvN30BUP1SGucenZQ9";\n String title1 = "隔壁老王";\n Document document1 = new Document();\n document1.setId(id);\n document1.setTitle(title1);\n documentMapper.updateById(document1);\n\n // case2: id未知, 根据条件更新\n LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>();\n wrapper.eq(Document::getTitle,title1);\n Document document2 = new Document();\n document2.setTitle("隔壁老李");\n document2.setContent("推*技术过软");\n documentMapper.update(document2,wrapper);\n\n // 关于case2 还有另一种省略实体的简单写法,这里不演示,后面章节有介绍,语法与MP一致\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n\n\n经过一顿猛如虎的更新操作 我们来看看标题最终变成了什么?\n\n\n\n查询结果证实了我们更新没有问题,这里无意冒犯"老李",仅供演示,如有得罪,请海涵.\n\n> 测试删除:删除数据(相当于MySQL中的Delete操作)\n\n @Test\n public void testDelete() {\n // 测试删除数据 删除有两种情况:根据id删或根据条件删\n // 鉴于根据id删过于简单,这里仅演示根据条件删,以老李的名义删,让老李心理平衡些\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n String title = "隔壁老李";\n wrapper.eq(Document::getTitle,title);\n int successCount = documentMapper.delete(wrapper);\n System.out.println(successCount);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n提示\n\n上面完整的代码示例请移步:Easy-Es-Sample\n\n\n# 小结\n\n通过以上几个简单的步骤,我们就实现了 Document的索引创建及CRUD 功能,最终也帮老李洗白了. 从以上步骤中,我们可以看到集成Easy-Es非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。 但Easy-Es 的强大远不止这些功能,想要详细了解 Easy-Es 的强大功能?那就继续往下看吧!',normalizedContent:'提示\n\n如果您用过mybatis-plus的话,您基本上可以无需多看此文档即可直接上手使用 easy-es是mybatis-plus在elastic search的平替版.\n\n我们将通过一个简单的 demo 来阐述 easy-es 的强大功能,在此之前,我们假设您已经:\n\n * 拥有 java 开发环境以及相应 ide\n * 熟悉mysql\n * 熟悉 spring boot (推荐版本2.5.x +)\n * 熟悉 maven\n * 了解es基本概念或已读避坑指南 (强烈推荐)\n * 已安装es 推荐7.x+版本(没有安装的可自行百度教程,建议再装一个es-head插件,便于可视化验证),低版本可能存在api不兼容或其它未知情况,因为底层采用resthighlevelclient而非restlowlevelclient,本demo采用es版本为7.10.0\n\n推荐\n\n推荐您参考这篇springboo集成demo,可帮助您节省您更多时间.\n\n\n# 初始化工程\n\n创建一个空的 spring boot 工程\n\n提示\n\n可以使用 spring initializer快速初始化一个 spring boot 工程\n\n\n# 添加依赖\n\nmaven:\n\n \n cn.easy-es\n easy-es-boot-starter\n latest version\n \n\n\n1\n2\n3\n4\n5\n\n\ngradle:\n\ncompile group: \'cn.easy-es\', name: \'easy-es-boot-starter\', version: \'latest version\'\n\n\n1\n\n\n提示\n\nlatest version: 点此获取\n\n\n# 配置\n\n在 application.yml 配置文件中添加easyes必须的相关配置:\n\neasy-es:\n enable: true #默认为true,若为false则认为不启用本框架\n address : 127.0.0.1:9200 # es的连接地址,必须含端口 若为集群,则可以用逗号隔开 例如:127.0.0.1:9200,127.0.0.2:9200\n username: elastic #若无 则可省略此行配置\n password: wg7wvmunmtm4gwnykywh #若无 则可省略此行配置\n\n\n1\n2\n3\n4\n5\n\n\n其它配置暂可省略,后面有章节详细介绍easyes的配置\n\n在 spring boot 启动类中添加 @esmapperscan 注解,扫描 mapper 文件夹:\n\n@springbootapplication\n@esmapperscan("com.xpc.easyes.sample.mapper")\npublic class application {\n\n public static void main(string[] args) {\n springapplication.run(application.class, args);\n }\n\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n\n# 背景\n\n现有一张document文档表,随着数据量膨胀,其查询效率已经无法满足产品需求,其表结构如下,我们打算将此表内容迁移至es搜索引擎,提高查询效率\n\nid title content\n主键 标题 内容\n\n\n# 编码\n\n编写实体类document.java(此处使用了 lombok简化代码)\n\n@data\npublic class document {\n /**\n * es中的唯一id\n */\t\n private string id;\n /**\n * 文档标题\n */\n private string title;\n /**\n * 文档内容\n */\n private string content;\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n\n\n温馨提示\n\n * 上面字段名称以及下划线转自动驼峰,字段在es中的存储类型,分词器等均可配置,在后续章节会有介绍.\n * string类型默认会被ee创建为keyword类型,keyword类型支持精确查询等\n * 如需分词查询,可像上面content一样,在字段上加上@tablefield注解并指明字段类型为text,并指定分词器.\n\n编写mapper类 documentmapper.java\n\npublic interface documentmapper extends baseesmapper {\n}\n\n\n1\n2\n\n\n##前置操作\n\n启动项目,由easy-es自动帮您创建索引(相当于mysql等数据库中的表),有了索引才能进行后续crud操作.索引托管成功后,您可在控制台看到:===> congratulations auto process index by easy-es is done !\n\n温馨提示\n\n * 后续如若索引有更新,索引重建,更新,数据迁移等工作默认都由ee自动帮您完成,当然您也可以通过配置关闭索引自动托管,可通过ee提供的api手动维护或es-head等插件维护.\n * 自动托管模式(0.9.9+版本支持),相关配置及详细介绍可在后面章节中看到,此处您只管将这些烦人的步骤交给ee去自动处理即可.\n * 若您ee版本低于该版本,可通过ee提供的api手动维护索引\n\n\n# 开始使用(crud)\n\n添加测试类,进行功能测试:\n\n> 测试新增: 新增一条数据(相当于mysql中的insert操作)\n\n @test\n public void testinsert() {\n // 测试插入数据\n document document = new document();\n document.settitle("老汉");\n document.setcontent("推*技术过硬");\n string id = documentmapper.insert(document);\n system.out.println(id);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n> 测试查询:根据条件查询指定数据(相当于mysql中的select操作)\n\n @test\n public void testselect() {\n // 测试查询\n string title = "老汉";\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.eq(document::gettitle,title);\n document document = documentmapper.selectone(wrapper);\n system.out.println(document);\n assert.assertequals(title,document.gettitle());\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n> 测试更新:更新数据(相当于mysql中的update操作)\n\n @test\n public void testupdate() {\n // 测试更新 更新有两种情况 分别演示如下:\n // case1: 已知id, 根据id更新 (为了演示方便,此id是从上一步查询中复制过来的,实际业务可以自行查询)\n string id = "krkvn30bup1sgucenzq9";\n string title1 = "隔壁老王";\n document document1 = new document();\n document1.setid(id);\n document1.settitle(title1);\n documentmapper.updatebyid(document1);\n\n // case2: id未知, 根据条件更新\n lambdaesupdatewrapper wrapper = new lambdaesupdatewrapper<>();\n wrapper.eq(document::gettitle,title1);\n document document2 = new document();\n document2.settitle("隔壁老李");\n document2.setcontent("推*技术过软");\n documentmapper.update(document2,wrapper);\n\n // 关于case2 还有另一种省略实体的简单写法,这里不演示,后面章节有介绍,语法与mp一致\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n\n\n经过一顿猛如虎的更新操作 我们来看看标题最终变成了什么?\n\n\n\n查询结果证实了我们更新没有问题,这里无意冒犯"老李",仅供演示,如有得罪,请海涵.\n\n> 测试删除:删除数据(相当于mysql中的delete操作)\n\n @test\n public void testdelete() {\n // 测试删除数据 删除有两种情况:根据id删或根据条件删\n // 鉴于根据id删过于简单,这里仅演示根据条件删,以老李的名义删,让老李心理平衡些\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n string title = "隔壁老李";\n wrapper.eq(document::gettitle,title);\n int successcount = documentmapper.delete(wrapper);\n system.out.println(successcount);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n提示\n\n上面完整的代码示例请移步:easy-es-sample\n\n\n# 小结\n\n通过以上几个简单的步骤,我们就实现了 document的索引创建及crud 功能,最终也帮老李洗白了. 从以上步骤中,我们可以看到集成easy-es非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。 但easy-es 的强大远不止这些功能,想要详细了解 easy-es 的强大功能?那就继续往下看吧!',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"顾虑粉碎",frontmatter:{title:"顾虑粉碎",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/6e2197/"},regularPath:"/v1.0.0/010.%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/030.%E9%A1%BE%E8%99%91%E7%B2%89%E7%A2%8E.html",relativePath:"v1.0.0/010.快速入门/030.顾虑粉碎.md",key:"v-049ef550",path:"/pages/6e2197/",headers:[{level:2,title:"1.性能",slug:"_1-性能",normalizedTitle:"1.性能",charIndex:2},{level:2,title:"2.安全",slug:"_2-安全",normalizedTitle:"2.安全",charIndex:1090},{level:2,title:"3.拓展性",slug:"_3-拓展性",normalizedTitle:"3.拓展性",charIndex:1823},{level:2,title:"4.团队及社区活跃度",slug:"_4-团队及社区活跃度",normalizedTitle:"4.团队及社区活跃度",charIndex:2544},{level:2,title:"5.接入优势",slug:"_5-接入优势",normalizedTitle:"5.接入优势",charIndex:2714},{level:2,title:"6.结语",slug:"_6-结语",normalizedTitle:"6.结语",charIndex:2884}],headersStr:"1.性能 2.安全 3.拓展性 4.团队及社区活跃度 5.接入优势 6.结语",content:'# 1.性能\n\n在正式接入Easy-Es至生产环境之前,您肯定会担心一个问题,就是使用此框架后,系统的查询效率是否会变低?系统资源开销是否会变大?负面影响到底有多少? 这些问题关乎到一个框架的存活,作为EE作者,这些问题我在开发前就考虑到了,但用户并不知晓,所以我再此一一帮您粉碎这些顾虑.\n\n\n\n我们先来看EE在整个查询过程中做了什么事? 总结起来就2件:\n\n 1. 把用户输入的MySQL语法(Mybatis-Plus语法)转换成RestHighLevel语法,然后调用RestHighLevelClient执行本次查询\n\n 2. 把查询结果转换成用户想要的格式:如List并返回.\n\n * 其中,语法转换是按照MySQL和EE语法对比的关系进行转换.这种转换其实耗费的性能非常低,因为即使你直接使用RestHighLevelClient进行查询,你依旧需要创建出termQueryBuilder和BoolQueryBuilder. 唯一的区别就是我把用户输入的查询条件eq放入了队列,然后通过队里FIFO(除查询条件中有or的情况)的顺序逐一进行转换,对于绝大多数查询语句,查询条件都不会太多,所以队里中的元素数大多数情况下都会小于10,而且队列中我只存了枚举和参数,既不会占用过多内存,也不会因为队列的遍历消耗多少性能. 对于现代计算机而言,别说遍历10条小数据,就是成百上千条也是毫秒级的,所以这点性能损耗基本可以忽略不计\n\n * 再说结果解析,结果解析其实就是把调用RestHighLevelClient返回的SearchResponse中的hits取出并用fastJson转换成数组,这个过程就算不用EE,你直接用RestHighLevelClient也是会有这一步,所以这一步并没有过多的损耗,即便是我用了反射,字段的反射和注解信息,都在框架启动时加载进内存中了,做了jvm的缓存,所以这点损耗可忽略不计.\n\n当然如上都是基于理论分析,在test模块的Performance测试类中,大家可以看到我针对CURD分别作了不同维度的性能测试,实际测试的结果也很好的印证了我上面的理论分析,EE除了查询会比直接使用RestHighLevelClient平均慢10-15毫秒,增删改API并无差异,而且随着查询数据量的增大,实体字段缓存生效后,查询差异会进一步降低,几乎可以忽略不计. 牺牲10毫秒,对用户而言是无感知的,但对开发而言,可以节省大量代码和时间,我认为这是值得的,基本上没有哪款ORM框架是不会损耗性能的,权衡利弊,主公们心理应该都会有答案.\n\n\n# 2.安全\n\n本框架所有三方依赖有elastic search官方提供的es操作套件和RestHighLevelClient,阿里的fastJson,Spring官方的SpringbootAutoConfig,Apache的commons-codec以及Lombok,无二方依赖,空口黄牙,口说无凭,大家可以点开maven中央仓库,亲自查看一番:maven中央仓库 以上套件即使不使用EE,你在实际开发中也会用到,且都是官方出品,所以您无需担心. 那么EE有没有可能有安全问题?毕竟是个人开发者写的,没有前面提到的框架那么强的背书.首先我认为任何框架都有可能有安全风险,即便是有强大的公司背书,比如前阵子阿里FastJson的安全漏洞. 对于EE,我个人认为目前不会有特别严重的安全问题,EE框架的核心原理上面的图中已经列出来了,EE的核心原理只是转换,相当于一个翻译或者中介,并无其它涉及安全类的操作,加上EE框架本身十分轻量,没有引入任何多余的类库,所有工具类都是自己封装,封装的时候也参照了apache工具类,所以有理由认为使用EE是相对安全的,除非下游的官方依赖本身有安全漏洞. 如质疑框架本身存在安全问题的,大可以下载源码阅读一番,看看有无漏洞. 另外关于FastJson其实一直争议不断,其性能确实是目前市面上当之无愧的一哥,确实够快,安全方面的话之前因为AutoType问题和黑客上演的魔高一尺道高一丈故事,让很多人误以为它漏洞百出,其实它没有那么不堪,之前的漏洞频繁本质上都是一个问题.阿里内部尚且那么多项目在使用FastJson,只要其社区活跃,并有积极处理,都是可以考虑使用的,毕竟没有哪个框架可以保证完全没有漏洞,只不过还没被发现罢了.\n\n\n# 3.拓展性\n\nEE底层用的就是Es官方提供的RestHighLevelClient,我们只是对RestHighLevelClient做了增强,并没有改变减少或是削弱它原有的功能,所以您无需担心拓展性. 任何框架的使用都会降低系统的灵活性,因为框架是死的,使用了以后不可避免的会碰到一些场景框架无法满足,需要定制化开发,或是短期内您不了解框架本身,不敢贸然使用,不然以后遇到问题怎么办? 为了解决上述问题,我特地在框架中留了混合查询和原生查询 目前EE提供的所有API可以覆盖实际开发中99%的需求,当极小概率下1%的需求无法覆盖时,您可以通过使用混合查询,也就是能支持的语句用EE生成,不能支持的语句就直接用RestHighLevelClient的语法,然后通过原生接口去完成查询,既简单有省事.当然如果您不喜欢这种"油电混动"的方式,您也可以直接用原生查询接口去完成查询,和直接使用RestHighLevelClient一样. 当然如果您实在不想用EE提供的任何方法,EE仍可以作为一个自动配置版的RestHighLevelClient使用,直接在需要的地方注入RestHighLevelClient进行使用即可,EE已经帮您把RestHighLevelClient按照您在配置文件中指定配置,自动装配成SpringBean了,所以在任何情况下,您都可以很自信很从容,就像直接使用官方的RestHighLevelClient一样,根本不需要担心有一天出问题了怎么办,大不了不用EE,只把它当成一个引入依赖和自动配置的工具.而且这种可能性也非常的低,我们还有专门的答疑群无偿在线给予您支持,对您的合理需求也会第一时间响应并安排落地.\n\n\n# 4.团队及社区活跃度\n\n团队目前招募到了5人,我称之为"五虎上将",从0.9.5+的版本之后开始TeamWork,未来随着项目发展还会招募更多有志之士加入,社区目前活跃,每年会发很多个版本,不断提升用户体验,对于用户提的需求会在一周内响应,合理的会在一个月内立项,三个月内完成开发上线.Issue类问题确认后会在两周内解决并上线.\n\n\n# 5.接入优势\n\n * 简单易用高效不用我多说了吧,MyBatis-Plus用户懂的都懂! 大把的时间节省出来,做...爱做的事情,真香!\n * 使用门槛降低,就算是刚不懂Es的小白,也可以用EE开发各种功能\n * 大幅减少代码量,提升代码可读性,降低重复代码量,提升代码质量\n * 专业答疑团队,无忧售后\n * 永久免费\n\n...\n\n\n# 6.结语\n\n新能源汽车刚出来的时候,油车车主还在观望,先上车的已经体验到甜头了,好不好用了就知道,至于那些所谓的问题,都会随着时间被解决,多尝试新鲜事物,拥抱变化,不因循守旧,不用一成不变的观念来看瞬息万变的世界,才能立于不败之地.',normalizedContent:'# 1.性能\n\n在正式接入easy-es至生产环境之前,您肯定会担心一个问题,就是使用此框架后,系统的查询效率是否会变低?系统资源开销是否会变大?负面影响到底有多少? 这些问题关乎到一个框架的存活,作为ee作者,这些问题我在开发前就考虑到了,但用户并不知晓,所以我再此一一帮您粉碎这些顾虑.\n\n\n\n我们先来看ee在整个查询过程中做了什么事? 总结起来就2件:\n\n 1. 把用户输入的mysql语法(mybatis-plus语法)转换成resthighlevel语法,然后调用resthighlevelclient执行本次查询\n\n 2. 把查询结果转换成用户想要的格式:如list并返回.\n\n * 其中,语法转换是按照mysql和ee语法对比的关系进行转换.这种转换其实耗费的性能非常低,因为即使你直接使用resthighlevelclient进行查询,你依旧需要创建出termquerybuilder和boolquerybuilder. 唯一的区别就是我把用户输入的查询条件eq放入了队列,然后通过队里fifo(除查询条件中有or的情况)的顺序逐一进行转换,对于绝大多数查询语句,查询条件都不会太多,所以队里中的元素数大多数情况下都会小于10,而且队列中我只存了枚举和参数,既不会占用过多内存,也不会因为队列的遍历消耗多少性能. 对于现代计算机而言,别说遍历10条小数据,就是成百上千条也是毫秒级的,所以这点性能损耗基本可以忽略不计\n\n * 再说结果解析,结果解析其实就是把调用resthighlevelclient返回的searchresponse中的hits取出并用fastjson转换成数组,这个过程就算不用ee,你直接用resthighlevelclient也是会有这一步,所以这一步并没有过多的损耗,即便是我用了反射,字段的反射和注解信息,都在框架启动时加载进内存中了,做了jvm的缓存,所以这点损耗可忽略不计.\n\n当然如上都是基于理论分析,在test模块的performance测试类中,大家可以看到我针对curd分别作了不同维度的性能测试,实际测试的结果也很好的印证了我上面的理论分析,ee除了查询会比直接使用resthighlevelclient平均慢10-15毫秒,增删改api并无差异,而且随着查询数据量的增大,实体字段缓存生效后,查询差异会进一步降低,几乎可以忽略不计. 牺牲10毫秒,对用户而言是无感知的,但对开发而言,可以节省大量代码和时间,我认为这是值得的,基本上没有哪款orm框架是不会损耗性能的,权衡利弊,主公们心理应该都会有答案.\n\n\n# 2.安全\n\n本框架所有三方依赖有elastic search官方提供的es操作套件和resthighlevelclient,阿里的fastjson,spring官方的springbootautoconfig,apache的commons-codec以及lombok,无二方依赖,空口黄牙,口说无凭,大家可以点开maven中央仓库,亲自查看一番:maven中央仓库 以上套件即使不使用ee,你在实际开发中也会用到,且都是官方出品,所以您无需担心. 那么ee有没有可能有安全问题?毕竟是个人开发者写的,没有前面提到的框架那么强的背书.首先我认为任何框架都有可能有安全风险,即便是有强大的公司背书,比如前阵子阿里fastjson的安全漏洞. 对于ee,我个人认为目前不会有特别严重的安全问题,ee框架的核心原理上面的图中已经列出来了,ee的核心原理只是转换,相当于一个翻译或者中介,并无其它涉及安全类的操作,加上ee框架本身十分轻量,没有引入任何多余的类库,所有工具类都是自己封装,封装的时候也参照了apache工具类,所以有理由认为使用ee是相对安全的,除非下游的官方依赖本身有安全漏洞. 如质疑框架本身存在安全问题的,大可以下载源码阅读一番,看看有无漏洞. 另外关于fastjson其实一直争议不断,其性能确实是目前市面上当之无愧的一哥,确实够快,安全方面的话之前因为autotype问题和黑客上演的魔高一尺道高一丈故事,让很多人误以为它漏洞百出,其实它没有那么不堪,之前的漏洞频繁本质上都是一个问题.阿里内部尚且那么多项目在使用fastjson,只要其社区活跃,并有积极处理,都是可以考虑使用的,毕竟没有哪个框架可以保证完全没有漏洞,只不过还没被发现罢了.\n\n\n# 3.拓展性\n\nee底层用的就是es官方提供的resthighlevelclient,我们只是对resthighlevelclient做了增强,并没有改变减少或是削弱它原有的功能,所以您无需担心拓展性. 任何框架的使用都会降低系统的灵活性,因为框架是死的,使用了以后不可避免的会碰到一些场景框架无法满足,需要定制化开发,或是短期内您不了解框架本身,不敢贸然使用,不然以后遇到问题怎么办? 为了解决上述问题,我特地在框架中留了混合查询和原生查询 目前ee提供的所有api可以覆盖实际开发中99%的需求,当极小概率下1%的需求无法覆盖时,您可以通过使用混合查询,也就是能支持的语句用ee生成,不能支持的语句就直接用resthighlevelclient的语法,然后通过原生接口去完成查询,既简单有省事.当然如果您不喜欢这种"油电混动"的方式,您也可以直接用原生查询接口去完成查询,和直接使用resthighlevelclient一样. 当然如果您实在不想用ee提供的任何方法,ee仍可以作为一个自动配置版的resthighlevelclient使用,直接在需要的地方注入resthighlevelclient进行使用即可,ee已经帮您把resthighlevelclient按照您在配置文件中指定配置,自动装配成springbean了,所以在任何情况下,您都可以很自信很从容,就像直接使用官方的resthighlevelclient一样,根本不需要担心有一天出问题了怎么办,大不了不用ee,只把它当成一个引入依赖和自动配置的工具.而且这种可能性也非常的低,我们还有专门的答疑群无偿在线给予您支持,对您的合理需求也会第一时间响应并安排落地.\n\n\n# 4.团队及社区活跃度\n\n团队目前招募到了5人,我称之为"五虎上将",从0.9.5+的版本之后开始teamwork,未来随着项目发展还会招募更多有志之士加入,社区目前活跃,每年会发很多个版本,不断提升用户体验,对于用户提的需求会在一周内响应,合理的会在一个月内立项,三个月内完成开发上线.issue类问题确认后会在两周内解决并上线.\n\n\n# 5.接入优势\n\n * 简单易用高效不用我多说了吧,mybatis-plus用户懂的都懂! 大把的时间节省出来,做...爱做的事情,真香!\n * 使用门槛降低,就算是刚不懂es的小白,也可以用ee开发各种功能\n * 大幅减少代码量,提升代码可读性,降低重复代码量,提升代码质量\n * 专业答疑团队,无忧售后\n * 永久免费\n\n...\n\n\n# 6.结语\n\n新能源汽车刚出来的时候,油车车主还在观望,先上车的已经体验到甜头了,好不好用了就知道,至于那些所谓的问题,都会随着时间被解决,多尝试新鲜事物,拥抱变化,不因循守旧,不用一成不变的观念来看瞬息万变的世界,才能立于不败之地.',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"springboot集成demo",frontmatter:{title:"springboot集成demo",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/12283a/"},regularPath:"/v1.0.0/010.%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/060.springboot%E9%9B%86%E6%88%90demo.html",relativePath:"v1.0.0/010.快速入门/060.springboot集成demo.md",key:"v-464a21a4",path:"/pages/12283a/",headers:[{level:2,title:"1.项目结构",slug:"_1-项目结构",normalizedTitle:"1.项目结构",charIndex:128},{level:2,title:"2.Pom",slug:"_2-pom",normalizedTitle:"2.pom",charIndex:166},{level:2,title:"3.核心代码",slug:"_3-核心代码",normalizedTitle:"3.核心代码",charIndex:1947},{level:2,title:"4.启动及使用",slug:"_4-启动及使用",normalizedTitle:"4.启动及使用",charIndex:2707},{level:3,title:"a.添加配置信息",slug:"a-添加配置信息",normalizedTitle:"a.添加配置信息",charIndex:2719},{level:3,title:"b.启动项目",slug:"b-启动项目",normalizedTitle:"b.启动项目",charIndex:2888},{level:3,title:"c.使用",slug:"c-使用",normalizedTitle:"c.使用",charIndex:3032},{level:2,title:"5.结语",slug:"_5-结语",normalizedTitle:"5.结语",charIndex:3123}],headersStr:"1.项目结构 2.Pom 3.核心代码 4.启动及使用 a.添加配置信息 b.启动项目 c.使用 5.结语",content:'强烈推荐\n\n本Demo演示Easy-Es与Springboot项目无缝集成,强烈建议先下载,直接在您本地运行,避免自己集成时因springboot等版本兼容问题踩坑.\n\nDemo下载地址: ✔Gitee | ✔ Github\n\n\n# Demo介绍\n\n\n# 1.项目结构\n\n\n\n\n为了演示方便,本demo省略service层\n\n\n# 2.Pom\n\n\n\n 4.0.0\n \n org.springframework.boot\n spring-boot-starter-parent\n 2.6.0\n \x3c!-- lookup parent from repository --\x3e\n \n com.example\n ee-use\n 0.0.1-SNAPSHOT\n ee-use\n Demo project for Spring Boot\n \n 1.8\n \n \n \n org.springframework.boot\n spring-boot-starter-web\n \n\n \n io.github.xpc1024\n easy-es-boot-starter\n Latest version\n \n\n \n org.springframework.boot\n spring-boot-starter-test\n test\n \n \n\n \n \n \n org.springframework.boot\n spring-boot-maven-plugin\n \n \n \n\n\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n\n\n\n# 3.核心代码\n\n@RestController\n@RequiredArgsConstructor(onConstructor = @__(@Autowired))\npublic class TestUseEeController {\n private final DocumentMapper documentMapper;\n \n @GetMapping("/insert")\n public Integer insert() {\n // 初始化-> 新增数据\n Document document = new Document();\n document.setTitle("老汉");\n document.setContent("推*技术过硬");\n return documentMapper.insert(document);\n }\n\n @GetMapping("/search")\n public List search() {\n // 查询出所有标题为老汉的文档列表\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.eq(Document::getTitle, "老汉");\n return documentMapper.selectList(wrapper);\n }\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n\n\n\n# 4.启动及使用\n\n\n# a.添加配置信息\n\neasy-es:\n enable: true # 默认为true,若为false时,则认为不启用本框架\n address : 127.0.0.0:9200 #填你的es连接地址\n # username: 有设置才填写,非必须\n # password: 有设置才填写,非必须\n\n\n1\n2\n3\n4\n5\n\n\n\n# b.启动项目\n\n使用你的IDE启动项目\n\n\n\n\n如果你的配置正确,ES版本及Springboot版本均兼容,你将看到ES索引被框架自动创建,并在控制台输出: ===> Congratulations auto process index by Easy-Es is done !\n\n\n# c.使用\n\nhttp://localhost:8080/insert (插入数据)\n\nhttp://localhost:8080/search (查询)\n\n效果图:\n\n\n\n\n\n\n# 5.结语\n\n至此,您已初步体验Easy-Es的基本功能,如果你感觉使用起来体验还不错,想进一步体验更多强大功能,那就继续往下看吧!',normalizedContent:'强烈推荐\n\n本demo演示easy-es与springboot项目无缝集成,强烈建议先下载,直接在您本地运行,避免自己集成时因springboot等版本兼容问题踩坑.\n\ndemo下载地址: ✔gitee | ✔ github\n\n\n# demo介绍\n\n\n# 1.项目结构\n\n\n\n\n为了演示方便,本demo省略service层\n\n\n# 2.pom\n\n\n\n 4.0.0\n \n org.springframework.boot\n spring-boot-starter-parent\n 2.6.0\n \x3c!-- lookup parent from repository --\x3e\n \n com.example\n ee-use\n 0.0.1-snapshot\n ee-use\n demo project for spring boot\n \n 1.8\n \n \n \n org.springframework.boot\n spring-boot-starter-web\n \n\n \n io.github.xpc1024\n easy-es-boot-starter\n latest version\n \n\n \n org.springframework.boot\n spring-boot-starter-test\n test\n \n \n\n \n \n \n org.springframework.boot\n spring-boot-maven-plugin\n \n \n \n\n\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n\n\n\n# 3.核心代码\n\n@restcontroller\n@requiredargsconstructor(onconstructor = @__(@autowired))\npublic class testuseeecontroller {\n private final documentmapper documentmapper;\n \n @getmapping("/insert")\n public integer insert() {\n // 初始化-> 新增数据\n document document = new document();\n document.settitle("老汉");\n document.setcontent("推*技术过硬");\n return documentmapper.insert(document);\n }\n\n @getmapping("/search")\n public list search() {\n // 查询出所有标题为老汉的文档列表\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.eq(document::gettitle, "老汉");\n return documentmapper.selectlist(wrapper);\n }\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n\n\n\n# 4.启动及使用\n\n\n# a.添加配置信息\n\neasy-es:\n enable: true # 默认为true,若为false时,则认为不启用本框架\n address : 127.0.0.0:9200 #填你的es连接地址\n # username: 有设置才填写,非必须\n # password: 有设置才填写,非必须\n\n\n1\n2\n3\n4\n5\n\n\n\n# b.启动项目\n\n使用你的ide启动项目\n\n\n\n\n如果你的配置正确,es版本及springboot版本均兼容,你将看到es索引被框架自动创建,并在控制台输出: ===> congratulations auto process index by easy-es is done !\n\n\n# c.使用\n\nhttp://localhost:8080/insert (插入数据)\n\nhttp://localhost:8080/search (查询)\n\n效果图:\n\n\n\n\n\n\n# 5.结语\n\n至此,您已初步体验easy-es的基本功能,如果你感觉使用起来体验还不错,想进一步体验更多强大功能,那就继续往下看吧!',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"简介",frontmatter:{title:"简介",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/ec7460/"},regularPath:"/v1.0.0/010.%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/010.%E7%AE%80%E4%BB%8B.html",relativePath:"v1.0.0/010.快速入门/010.简介.md",key:"v-15fda9dd",path:"/pages/ec7460/",headers:[{level:2,title:"优势",slug:"优势",normalizedTitle:"优势",charIndex:318},{level:2,title:"特性",slug:"特性",normalizedTitle:"特性",charIndex:845},{level:2,title:"框架架构",slug:"框架架构",normalizedTitle:"框架架构",charIndex:1510},{level:2,title:"代码托管",slug:"代码托管",normalizedTitle:"代码托管",charIndex:1521},{level:2,title:"参与贡献",slug:"参与贡献",normalizedTitle:"参与贡献",charIndex:1552}],headersStr:"优势 特性 框架架构 代码托管 参与贡献",content:"# 简介\n\nEasy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发.\n\n> 理念 把简单,易用,方便留给用户,把复杂留给框架.\n\n> 愿景 让天下没有难用的Es, 致力于成为全球最受欢迎的ElasticSearch搜索引擎开发框架.\n\n\n\n\n# 优势\n\n * 全自动索引托管: 全球开源首创的索引托管模式,开发者无需关心索引的创建更新及数据迁移等繁琐步骤,索引全生命周期皆可托管给框架,由框架自动完成,过程零停机,用户无感知,彻底解放开发者\n * 屏蔽语言差异: 开发者只需要会MySQL语法即可使用Es,真正做到一通百通,无需学习枯燥易忘的Es语法,Es使用相对MySQL较低频,学了长期不用也会忘,没必要浪费这时间.开发就应该专注于业务,省下的时间去撸铁,去陪女朋友陪家人,不做资本家的韭菜\n * 代码量极少: 与直接使用RestHighLevelClient相比,相同的查询平均可以节省3-5倍左右的代码量\n * 零魔法值: 字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值,提高代码可读性,杜绝因字段名称修改而代码漏改带来的Bug\n * 零额外学习成本: 开发者只要会国内最受欢迎的Mybatis-Plus语法,即可无缝迁移至EE,EE采用和前者相同的语法,消除使用者额外学习成本,直接上手,爽\n * 降低开发者门槛: Es通常需要中高级开发者才能驾驭,但通过接入EE,即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发,可以提高人员利用率,降低企业成本\n\n\n# 特性\n\n * 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑\n * 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作\n * 强大的 CRUD 操作:内置通用 Mapper,仅仅通过少量配置即可实现大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求\n * 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错段\n * 支持主键自动生成:支持2 种主键策略,可自由配置,完美解决主键问题\n * 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作\n * 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )\n * 内置分页插件:基于RestHighLevelClient 物理分页,开发者无需关心具体操作,且无需额外配置插件,写分页等同于普通 List 查询,且保持和PageHelper插件同样的分页返回字段,无需担心命名影响\n * MySQL功能全覆盖:MySQL中支持的功能通过EE都可以轻松实现\n * 支持ES高阶语法:支持高亮搜索,分词查询,权重查询,Geo地理位置查询,IP查询,聚合查询等高阶语法\n * 良好的拓展性:底层仍使用RestHighLevelClient,可保持其拓展性,开发者在使用EE的同时,仍可使用RestHighLevelClient的功能\n\n...\n\n\n# 框架架构\n\n\n\n\n# 代码托管\n\n> 码云Gitee✔ | Github✔\n\n\n# 参与贡献\n\n尽管目前Easy-Es诞生不算太久,但由于站在巨人的肩膀上(RestHighLevelClient和Mybatis-Plus),这是一款出道即巅峰的框架,这么说并不是说它写得有多好,而是它融合了两款目前非常优秀框架的优点,以及MP的用户习惯和用户生态,这决定了它起点的高度,未来可期,所以在此欢迎各路好汉一起来参与完善 Easy-Es,我们期待你的 PR!\n\n * 贡献代码:代码地址 Easy-ES,欢迎提交 Issue 或者 Pull Requests\n * 维护文档:文档地址 Easy-ES,欢迎参与翻译和修订",normalizedContent:"# 简介\n\neasy-es(简称ee)是一款基于elasticsearch(简称es)官方提供的resthighlevelclient打造的orm开发框架,在 resthighlevelclient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过mybatis-plus(简称mp),那么您基本可以零学习成本直接上手ee,ee是mp的es平替版,在有些些方面甚至比mp更简单,同时也融入了更多es独有的功能,助力您快速实现各种场景的开发.\n\n> 理念 把简单,易用,方便留给用户,把复杂留给框架.\n\n> 愿景 让天下没有难用的es, 致力于成为全球最受欢迎的elasticsearch搜索引擎开发框架.\n\n\n\n\n# 优势\n\n * 全自动索引托管: 全球开源首创的索引托管模式,开发者无需关心索引的创建更新及数据迁移等繁琐步骤,索引全生命周期皆可托管给框架,由框架自动完成,过程零停机,用户无感知,彻底解放开发者\n * 屏蔽语言差异: 开发者只需要会mysql语法即可使用es,真正做到一通百通,无需学习枯燥易忘的es语法,es使用相对mysql较低频,学了长期不用也会忘,没必要浪费这时间.开发就应该专注于业务,省下的时间去撸铁,去陪女朋友陪家人,不做资本家的韭菜\n * 代码量极少: 与直接使用resthighlevelclient相比,相同的查询平均可以节省3-5倍左右的代码量\n * 零魔法值: 字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值,提高代码可读性,杜绝因字段名称修改而代码漏改带来的bug\n * 零额外学习成本: 开发者只要会国内最受欢迎的mybatis-plus语法,即可无缝迁移至ee,ee采用和前者相同的语法,消除使用者额外学习成本,直接上手,爽\n * 降低开发者门槛: es通常需要中高级开发者才能驾驭,但通过接入ee,即便是只了解es基础的初学者也可以轻松驾驭es完成绝大多数需求的开发,可以提高人员利用率,降低企业成本\n\n\n# 特性\n\n * 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑\n * 损耗小:启动即会自动注入基本 curd,性能基本无损耗,直接面向对象操作\n * 强大的 crud 操作:内置通用 mapper,仅仅通过少量配置即可实现大部分 crud 操作,更有强大的条件构造器,满足各类使用需求\n * 支持 lambda 形式调用:通过 lambda 表达式,方便的编写各类查询条件,无需再担心字段写错段\n * 支持主键自动生成:支持2 种主键策略,可自由配置,完美解决主键问题\n * 支持 activerecord 模式:支持 activerecord 形式调用,实体类只需继承 model 类即可进行强大的 crud 操作\n * 支持自定义全局通用操作:支持全局通用方法注入( write once, use anywhere )\n * 内置分页插件:基于resthighlevelclient 物理分页,开发者无需关心具体操作,且无需额外配置插件,写分页等同于普通 list 查询,且保持和pagehelper插件同样的分页返回字段,无需担心命名影响\n * mysql功能全覆盖:mysql中支持的功能通过ee都可以轻松实现\n * 支持es高阶语法:支持高亮搜索,分词查询,权重查询,geo地理位置查询,ip查询,聚合查询等高阶语法\n * 良好的拓展性:底层仍使用resthighlevelclient,可保持其拓展性,开发者在使用ee的同时,仍可使用resthighlevelclient的功能\n\n...\n\n\n# 框架架构\n\n\n\n\n# 代码托管\n\n> 码云gitee✔ | github✔\n\n\n# 参与贡献\n\n尽管目前easy-es诞生不算太久,但由于站在巨人的肩膀上(resthighlevelclient和mybatis-plus),这是一款出道即巅峰的框架,这么说并不是说它写得有多好,而是它融合了两款目前非常优秀框架的优点,以及mp的用户习惯和用户生态,这决定了它起点的高度,未来可期,所以在此欢迎各路好汉一起来参与完善 easy-es,我们期待你的 pr!\n\n * 贡献代码:代码地址 easy-es,欢迎提交 issue 或者 pull requests\n * 维护文档:文档地址 easy-es,欢迎参与翻译和修订",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"注解",frontmatter:{title:"注解",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/4eb7db/"},regularPath:"/v1.0.0/010.%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/080.%E6%B3%A8%E8%A7%A3.html",relativePath:"v1.0.0/010.快速入门/080.注解.md",key:"v-514ebfda",path:"/pages/4eb7db/",headers:[{level:2,title:"@EsMapperScan",slug:"esmapperscan",normalizedTitle:"@esmapperscan",charIndex:76},{level:2,title:"@IndexName",slug:"indexname",normalizedTitle:"@indexname",charIndex:462},{level:2,title:"@IndexId",slug:"indexid",normalizedTitle:"@indexid",charIndex:1861},{level:2,title:"@IndexField",slug:"indexfield",normalizedTitle:"@indexfield",charIndex:2546},{level:2,title:"其它注解",slug:"其它注解",normalizedTitle:"其它注解",charIndex:4773}],headersStr:"@EsMapperScan @IndexName @IndexId @IndexField 其它注解",content:'本文将介绍 Easy-Es 注解包相关类详解(更多详细描述可点击查看源码注释)\n\n> 注解类包源码:👉 easy-es-annotation\n\n\n# @EsMapperScan\n\n * 描述:mapper扫描注解,功能与MP的@MapperScan一致\n\n * 使用位置:Springboot启动类\n\n@EsMapperScan("cn.easy-es-mapper")\npublic class Application{\n // 省略其它...\n}\n\n\n1\n2\n3\n4\n\n\n属性 类型 必须指定 默认值 描述\nvalue String 是 "" 自定义mapper所在包全路径\n\n温馨提示\n\n由于EE和MP对Mapper的扫描都是采用Springboot的doScan,而且两套系统互相独立,所以在扫描的时候没有办法互相隔离,因此如果您的项目同时有用到EE和MP,您需要将EE的Mapper和MP的Mapper放在不同的包下,否则项目将无法正常启动。\n\n\n# @IndexName\n\n * 描述:索引名注解,标识实体类对应的索引 对应MP的@TableName注解,在v0.9.40之前此注解为@TableName.\n\n * 使用位置:实体类\n\n@IndexName\npublic class Document {\n // 省略其它字段\n}\n\n\n1\n2\n3\n4\n\n\n属性 类型 必须指定 默认值 描述\nvalue String 否 "" 索引名,可简单理解为MySQL表名\nshardsNum int 否 1 索引分片数\nreplicasNum int 否 1 索引副本数\naliasName String 否 "" 索引别名\nkeepGlobalPrefix boolean 否 false 是否保持使用全局的 tablePrefix 的值,与MP用法一致\nchild boolean 否 false 是否子文档\nchildClass Class 否 DefaultChildClass.class 父子文档-子文档类\n\n> 动态索引名称支持 如果你的索引名称是不固定的,我们提供了两种方式可修改CRUD时的索引名称\n> \n> * 调用mapper.setCurrentActiveIndex(String indexName)方法,此处的mapper为你自定义的mapper,如documentMapper,通过此API修改索引名称后,全局生效.\n> * 在对应的参数中指定当前操作作用的索引,例如 wrapper.index(String indexName),通过此API修改索引名称后,仅作用于该wrapper对应的操作,粒度最细.\n\n温馨提示\n\n * 当您想直接把类名当作索引名,且并不需要对索引进行其它配置时,可省略此注解\n * 通过注解指定的索引名称优先级最高,指定了注解索引,则全局配置和自动生成索引不生效,采用注解中指定的索引名称. 优先级排序: 注解索引>全局配置索引前缀>自动生成\n * keepGlobalPrefix选项,(0.9.4+版本才支持)默认值为false,是否保持使用全局的 tablePrefix 的值:\n * 既配置了全局tablePrefix,@TableName注解又指定了value值时,此注解选项才会生效,如果其值为true,则框架最终使用的索引名称为:全局tablePrefix+此注解的value,例如:dev_document.\n * 此注解选项用法和MP中保持一致.\n * 其中shardNum为分片数,replicasNum为副本数,如果不指定,默认值均为1\n\n\n# @IndexId\n\n * 描述:ES主键注解,在v0.9.40之前此注解为@TableId.\n * 使用位置:实体类中被作为ES主键的字段, 对应MP的@TableId注解\n\npublic class Document {\n @IndexId\n private String id;\n // 省略其它字段\n}\n\n\n1\n2\n3\n4\n5\n\n\n属性 类型 必须指定 默认值 描述\nvalue String 否 "_id" 主键字段名\ntype Enum 否 IdType.NONE 指定主键类型\n\n温馨提示\n\n * 当您字段命名为id且类型为String时,且不需要采用UUID及自定义ID类型时,可省略此注解\n * 由于es对id的默认名称做了处理(下划线+id):_id,所以EE已为您屏蔽这步操作,您无需在注解中指定,框架也会自动帮您完成映射.\n * Id的生成类型支持以下几种:\n * IdType.AUTO: 由ES自动生成,是默认的配置,无需您额外配置 推荐\n * IdType.UUID: 系统生成UUID,然后插入ES (不推荐)\n * IdType.CUSTOMIZE: 由用户自定义,用户自己对id值进行set,如果用户指定的id在es中不存在,则在insert时就会新增一条记录,如果用户指定的id在es中已存在记录,则自动更新该id对应的记录.\n\n优先级: 注解配置的Id生成策略>全局配置的Id生成策略\n\n\n# @IndexField\n\n * 描述:ES字段注解, 对应MP的@TableField注解,在v0.9.40之前此注解为@TableField\n * 使用位置:实体类中被作为ES索引字段的字段\n * 使用场景举例:\n\n 1. 实体类中的字段并非ES中实际的字段,比如把实体类直接当DTO用了,加了一些ES中并不存在的无关字段,此时可以标记此字段,以便让EE框架跳过此字段,对此字段不处理.\n 2. 字段的更新策略,比如在调用更新接口时,实体类的字段非Null或者非空字符串时才更新,此时可以加字段注解,对指定字段标记更新策略.\n 3. 对指定字段进行自定义命名,比如该字段在es中叫wu-la,但在实体model中叫ula,此时可以在value中指定value="wu-la".\n 4. 在自动托管索引模式下,可指定索引分词器及索引字段类型.\n 5. 在自动托管索引模式下,可指定索引中日期的format格式.\n 6. ...\n\n使用示例:\n\npublic class Document {\n // 此处省略其它字段... \n \n // 场景一:标记es中不存在的字段\n @TableField(exist = false)\n private String notExistsField;\n \n // 场景二:更新时,此字段非空字符串才会被更新\n @TableField(strategy = FieldStrategy.NOT_EMPTY)\n private String creator;\n \n // 场景三:自定义字段名\n @TableField("wu-la") \n private String ula;\n\n // 场景四:支持日期字段在es索引中的format类型\n @TableField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")\n private String gmtCreate;\n\n // 场景五:支持指定字段在es索引中的分词器类型\n @TableField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)\n private String content;\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n\n\n属性 类型 必须指定 默认值 描述\nvalue String 否 "" 字段名\nexist boolean 否 true 字段是否存在\nfieldType Enum 否 FieldType.NONE 字段在es索引中的类型\nanalyzer String 否 Analyzer.NONE 索引文档时用的分词器\nsearchAnalyzer String 否 Analyzer.NONE 查询分词器\nstrategy Enum 否 FieldStrategy.DEFAULT 字段验证策略\ndateFormat String 否 "" es索引中的日期格式,如yyyy-MM-dd\nnestedClass Class 否 DefaultNestedClass.class 嵌套类\nparentName String 否 "" 父子文档-父名称\nchildName String 否 "" 父子文档-子名称\njoinFieldClass Class 否 JoinField.class 父子文档-父子类型关系字段类\n\n温馨提示\n\n * 更新策略一共有3种:\n * NOT_NULL: 非Null判断,字段值为非Null时,才会被更新\n * NOT_EMPTY: 非空判断,字段值为非空字符串时才会被更新\n * IGNORE: 忽略判断,无论字段值为什么,都会被更新\n\n其中场景四和场景五仅在索引自动托管模式下生效,如果开启了手动处理索引模式,则需要用户通过手动调用我提供的API传入相应的分词器及日期格式化参数进行索引的创建/更新.\n\n\n# 其它注解\n\n除了上面这几个高频注解,项目中偶尔还会用到一些其它注解,比如高亮注解@HighLight,比如拦截器注解@Intercepts等注解,我们会在后面具体的章节详细介绍,此处仅列出几个必须掌握的注解,其它注解按需学习即可。',normalizedContent:'本文将介绍 easy-es 注解包相关类详解(更多详细描述可点击查看源码注释)\n\n> 注解类包源码:👉 easy-es-annotation\n\n\n# @esmapperscan\n\n * 描述:mapper扫描注解,功能与mp的@mapperscan一致\n\n * 使用位置:springboot启动类\n\n@esmapperscan("cn.easy-es-mapper")\npublic class application{\n // 省略其它...\n}\n\n\n1\n2\n3\n4\n\n\n属性 类型 必须指定 默认值 描述\nvalue string 是 "" 自定义mapper所在包全路径\n\n温馨提示\n\n由于ee和mp对mapper的扫描都是采用springboot的doscan,而且两套系统互相独立,所以在扫描的时候没有办法互相隔离,因此如果您的项目同时有用到ee和mp,您需要将ee的mapper和mp的mapper放在不同的包下,否则项目将无法正常启动。\n\n\n# @indexname\n\n * 描述:索引名注解,标识实体类对应的索引 对应mp的@tablename注解,在v0.9.40之前此注解为@tablename.\n\n * 使用位置:实体类\n\n@indexname\npublic class document {\n // 省略其它字段\n}\n\n\n1\n2\n3\n4\n\n\n属性 类型 必须指定 默认值 描述\nvalue string 否 "" 索引名,可简单理解为mysql表名\nshardsnum int 否 1 索引分片数\nreplicasnum int 否 1 索引副本数\naliasname string 否 "" 索引别名\nkeepglobalprefix boolean 否 false 是否保持使用全局的 tableprefix 的值,与mp用法一致\nchild boolean 否 false 是否子文档\nchildclass class 否 defaultchildclass.class 父子文档-子文档类\n\n> 动态索引名称支持 如果你的索引名称是不固定的,我们提供了两种方式可修改crud时的索引名称\n> \n> * 调用mapper.setcurrentactiveindex(string indexname)方法,此处的mapper为你自定义的mapper,如documentmapper,通过此api修改索引名称后,全局生效.\n> * 在对应的参数中指定当前操作作用的索引,例如 wrapper.index(string indexname),通过此api修改索引名称后,仅作用于该wrapper对应的操作,粒度最细.\n\n温馨提示\n\n * 当您想直接把类名当作索引名,且并不需要对索引进行其它配置时,可省略此注解\n * 通过注解指定的索引名称优先级最高,指定了注解索引,则全局配置和自动生成索引不生效,采用注解中指定的索引名称. 优先级排序: 注解索引>全局配置索引前缀>自动生成\n * keepglobalprefix选项,(0.9.4+版本才支持)默认值为false,是否保持使用全局的 tableprefix 的值:\n * 既配置了全局tableprefix,@tablename注解又指定了value值时,此注解选项才会生效,如果其值为true,则框架最终使用的索引名称为:全局tableprefix+此注解的value,例如:dev_document.\n * 此注解选项用法和mp中保持一致.\n * 其中shardnum为分片数,replicasnum为副本数,如果不指定,默认值均为1\n\n\n# @indexid\n\n * 描述:es主键注解,在v0.9.40之前此注解为@tableid.\n * 使用位置:实体类中被作为es主键的字段, 对应mp的@tableid注解\n\npublic class document {\n @indexid\n private string id;\n // 省略其它字段\n}\n\n\n1\n2\n3\n4\n5\n\n\n属性 类型 必须指定 默认值 描述\nvalue string 否 "_id" 主键字段名\ntype enum 否 idtype.none 指定主键类型\n\n温馨提示\n\n * 当您字段命名为id且类型为string时,且不需要采用uuid及自定义id类型时,可省略此注解\n * 由于es对id的默认名称做了处理(下划线+id):_id,所以ee已为您屏蔽这步操作,您无需在注解中指定,框架也会自动帮您完成映射.\n * id的生成类型支持以下几种:\n * idtype.auto: 由es自动生成,是默认的配置,无需您额外配置 推荐\n * idtype.uuid: 系统生成uuid,然后插入es (不推荐)\n * idtype.customize: 由用户自定义,用户自己对id值进行set,如果用户指定的id在es中不存在,则在insert时就会新增一条记录,如果用户指定的id在es中已存在记录,则自动更新该id对应的记录.\n\n优先级: 注解配置的id生成策略>全局配置的id生成策略\n\n\n# @indexfield\n\n * 描述:es字段注解, 对应mp的@tablefield注解,在v0.9.40之前此注解为@tablefield\n * 使用位置:实体类中被作为es索引字段的字段\n * 使用场景举例:\n\n 1. 实体类中的字段并非es中实际的字段,比如把实体类直接当dto用了,加了一些es中并不存在的无关字段,此时可以标记此字段,以便让ee框架跳过此字段,对此字段不处理.\n 2. 字段的更新策略,比如在调用更新接口时,实体类的字段非null或者非空字符串时才更新,此时可以加字段注解,对指定字段标记更新策略.\n 3. 对指定字段进行自定义命名,比如该字段在es中叫wu-la,但在实体model中叫ula,此时可以在value中指定value="wu-la".\n 4. 在自动托管索引模式下,可指定索引分词器及索引字段类型.\n 5. 在自动托管索引模式下,可指定索引中日期的format格式.\n 6. ...\n\n使用示例:\n\npublic class document {\n // 此处省略其它字段... \n \n // 场景一:标记es中不存在的字段\n @tablefield(exist = false)\n private string notexistsfield;\n \n // 场景二:更新时,此字段非空字符串才会被更新\n @tablefield(strategy = fieldstrategy.not_empty)\n private string creator;\n \n // 场景三:自定义字段名\n @tablefield("wu-la") \n private string ula;\n\n // 场景四:支持日期字段在es索引中的format类型\n @tablefield(fieldtype = fieldtype.date, dateformat = "yyyy-mm-dd hh:mm:ss||yyyy-mm-dd||epoch_millis")\n private string gmtcreate;\n\n // 场景五:支持指定字段在es索引中的分词器类型\n @tablefield(fieldtype = fieldtype.text, analyzer = analyzer.ik_smart, searchanalyzer = analyzer.ik_max_word)\n private string content;\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n\n\n属性 类型 必须指定 默认值 描述\nvalue string 否 "" 字段名\nexist boolean 否 true 字段是否存在\nfieldtype enum 否 fieldtype.none 字段在es索引中的类型\nanalyzer string 否 analyzer.none 索引文档时用的分词器\nsearchanalyzer string 否 analyzer.none 查询分词器\nstrategy enum 否 fieldstrategy.default 字段验证策略\ndateformat string 否 "" es索引中的日期格式,如yyyy-mm-dd\nnestedclass class 否 defaultnestedclass.class 嵌套类\nparentname string 否 "" 父子文档-父名称\nchildname string 否 "" 父子文档-子名称\njoinfieldclass class 否 joinfield.class 父子文档-父子类型关系字段类\n\n温馨提示\n\n * 更新策略一共有3种:\n * not_null: 非null判断,字段值为非null时,才会被更新\n * not_empty: 非空判断,字段值为非空字符串时才会被更新\n * ignore: 忽略判断,无论字段值为什么,都会被更新\n\n其中场景四和场景五仅在索引自动托管模式下生效,如果开启了手动处理索引模式,则需要用户通过手动调用我提供的api传入相应的分词器及日期格式化参数进行索引的创建/更新.\n\n\n# 其它注解\n\n除了上面这几个高频注解,项目中偶尔还会用到一些其它注解,比如高亮注解@highlight,比如拦截器注解@intercepts等注解,我们会在后面具体的章节详细介绍,此处仅列出几个必须掌握的注解,其它注解按需学习即可。',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"适用场景",frontmatter:{title:"适用场景",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/258e80/"},regularPath:"/v1.0.0/010.%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/020.%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF.html",relativePath:"v1.0.0/010.快速入门/020.适用场景.md",key:"v-7e2d5535",path:"/pages/258e80/",headers:[{level:2,title:"1. 检索类服务",slug:"_1-检索类服务",normalizedTitle:"1. 检索类服务",charIndex:2},{level:2,title:"2. 问答类服务(本质上也是检索类)",slug:"_2-问答类服务-本质上也是检索类",normalizedTitle:"2. 问答类服务(本质上也是检索类)",charIndex:48},{level:2,title:"3. 地图类服务",slug:"_3-地图类服务",normalizedTitle:"3. 地图类服务",charIndex:null}],headersStr:"1. 检索类服务 2. 问答类服务(本质上也是检索类) 3. 地图类服务",content:"# 1. 检索类服务\n\n * 搜索文库\n * 电商商品检索\n * 海量系统日志检索\n\n\n\n\n# 2. 问答类服务(本质上也是检索类)\n\n * 在线智能客服\n * 机器人\n\n\n\n\n# 3. 地图类服务\n\n * 打车app\n * 外卖app\n * 社区团购配送\n * 陌生人社交\n\n\n\n...\n\n以上只是我个人能想到的一些应用场景,实际上Easy-Es的API基本上覆盖了Elastic Search 90%以上的功能,99%以上的常用功能,所以您可以基于EE快速构建出各种系统,即便是十分复杂多变的查询,也可以从容应对,Trust me!",normalizedContent:"# 1. 检索类服务\n\n * 搜索文库\n * 电商商品检索\n * 海量系统日志检索\n\n\n\n\n# 2. 问答类服务(本质上也是检索类)\n\n * 在线智能客服\n * 机器人\n\n\n\n\n# 3. 地图类服务\n\n * 打车app\n * 外卖app\n * 社区团购配送\n * 陌生人社交\n\n\n\n...\n\n以上只是我个人能想到的一些应用场景,实际上easy-es的api基本上覆盖了elastic search 90%以上的功能,99%以上的常用功能,所以您可以基于ee快速构建出各种系统,即便是十分复杂多变的查询,也可以从容应对,trust me!",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"配置",frontmatter:{title:"配置",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/9a3e4c/"},regularPath:"/v1.0.0/010.%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/070.%E9%85%8D%E7%BD%AE.html",relativePath:"v1.0.0/010.快速入门/070.配置.md",key:"v-366c873d",path:"/pages/9a3e4c/",headersStr:null,content:"基础配置:\n\n如果缺失可导致项目无法正常启动,其中账号密码可缺省.\n\neasy-es:\n enable: true # 是否开启EE自动配置\n address : 127.0.0.1:9200 # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开\n schema: http # 默认为http\n username: elastic #如果无账号密码则可不配置此行\n password: WG7WVmuNMtM4GwNYkyWH #如果无账号密码则可不配置此行\n\n\n1\n2\n3\n4\n5\n6\n\n\n拓展配置:\n\n可缺省,不影响项目启动,为了提高生产环境性能,建议您按需配置\n\neasy-es:\n keep-alive-millis: 18000 # 心跳策略时间 单位:ms\n connectTimeout: 5000 # 连接超时时间 单位:ms\n socketTimeout: 5000 # 通信超时时间 单位:ms\n requestTimeout: 5000 # 请求超时时间 单位:ms\n connectionRequestTimeout: 5000 # 连接请求超时时间 单位:ms\n maxConnTotal: 100 # 最大连接数 单位:个\n maxConnPerRoute: 100 # 最大连接路由数 单位:个\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n全局配置:\n\n可缺省,不影响项目启动,若缺省则为默认值\n\neasy-es:\n global-config:\n process_index_mode: smoothly #索引处理模式,smoothly:平滑模式,默认开启此模式, not_smoothly:非平滑模式, manual:手动模式\n print-dsl: true # 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能\n distributed: false # 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁.\n db-config:\n map-underscore-to-camel-case: false # 是否开启下划线转驼峰 默认为false\n table-prefix: daily_ # 索引前缀,可用于区分环境 默认为空 用法和MP一样\n id-type: customize # id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成\n field-strategy: not_empty # 字段更新策略 默认为not_null\n enable-track-total-hits: true # 默认开启,查询若指定了size超过1w条时也会自动开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响.\n refresh-policy: immediate # 数据刷新策略,默认为不刷新\n enable-must2-filter: false # 是否全局开启must查询类型转换为filter查询类型 默认为false不转换\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n\n\n其它配置:\n\nlogging:\n level:\n tracer: trace # 开启trace级别日志,在开发时可以开启此配置,则控制台可以打印es全部请求信息及DSL语句,为了避免重复,开启此项配置后,可以将EE的print-dsl设置为false.\n\nspring:\n main:\n banner-mode: off # 有用户反馈想关闭EE打印的Banner,由于EE的banner是直接覆盖springboot默认banner的,所以如需关闭,直接关闭springboot的banner即可关闭EE的banner.\n\n\n1\n2\n3\n4\n5\n6\n7\n\n\n温馨提示\n\n * id-type支持3种类型:\n \n * auto: 由ES自动生成,是默认的配置,无需您额外配置 推荐\n * uuid: 系统生成UUID,然后插入ES (不推荐)\n * customize: 用户自定义,在此类型下,用户可以将任意数据类型的id存入es作为es中的数据id,比如将mysql自增的id作为es的id,可以开启此模式,或通过@TableId(type)注解指定.\n\n * field-strategy支持3种类型:\n \n * not_null: 非Null判断,字段值为非Null时,才会被更新\n * not_empty: 非空判断,字段值为非空字符串时才会被更新\n * ignore: 忽略判断,无论字段值为什么,都会被更新\n * 在配置了全局策略后,您仍可以通过注解针对个别类进行个性化配置,全局配置的优先级是小于注解配置的\n\n * refresh-policy支持3种策略\n \n * none: 默认策略,不刷新数据\n * immediate : 立即刷新,会损耗较多性能,对数据实时性要求高的场景下适用\n * wait_until: 请求提交数据后,等待数据完成刷新(1s),再结束请求 性能损耗适中",normalizedContent:"基础配置:\n\n如果缺失可导致项目无法正常启动,其中账号密码可缺省.\n\neasy-es:\n enable: true # 是否开启ee自动配置\n address : 127.0.0.1:9200 # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开\n schema: http # 默认为http\n username: elastic #如果无账号密码则可不配置此行\n password: wg7wvmunmtm4gwnykywh #如果无账号密码则可不配置此行\n\n\n1\n2\n3\n4\n5\n6\n\n\n拓展配置:\n\n可缺省,不影响项目启动,为了提高生产环境性能,建议您按需配置\n\neasy-es:\n keep-alive-millis: 18000 # 心跳策略时间 单位:ms\n connecttimeout: 5000 # 连接超时时间 单位:ms\n sockettimeout: 5000 # 通信超时时间 单位:ms\n requesttimeout: 5000 # 请求超时时间 单位:ms\n connectionrequesttimeout: 5000 # 连接请求超时时间 单位:ms\n maxconntotal: 100 # 最大连接数 单位:个\n maxconnperroute: 100 # 最大连接路由数 单位:个\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n全局配置:\n\n可缺省,不影响项目启动,若缺省则为默认值\n\neasy-es:\n global-config:\n process_index_mode: smoothly #索引处理模式,smoothly:平滑模式,默认开启此模式, not_smoothly:非平滑模式, manual:手动模式\n print-dsl: true # 开启控制台打印通过本框架生成的dsl语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能\n distributed: false # 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁.\n db-config:\n map-underscore-to-camel-case: false # 是否开启下划线转驼峰 默认为false\n table-prefix: daily_ # 索引前缀,可用于区分环境 默认为空 用法和mp一样\n id-type: customize # id生成策略 customize为自定义,id值由用户生成,比如取mysql中的数据id,如缺省此项配置,则id默认策略为es自动生成\n field-strategy: not_empty # 字段更新策略 默认为not_null\n enable-track-total-hits: true # 默认开启,查询若指定了size超过1w条时也会自动开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响.\n refresh-policy: immediate # 数据刷新策略,默认为不刷新\n enable-must2-filter: false # 是否全局开启must查询类型转换为filter查询类型 默认为false不转换\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n\n\n其它配置:\n\nlogging:\n level:\n tracer: trace # 开启trace级别日志,在开发时可以开启此配置,则控制台可以打印es全部请求信息及dsl语句,为了避免重复,开启此项配置后,可以将ee的print-dsl设置为false.\n\nspring:\n main:\n banner-mode: off # 有用户反馈想关闭ee打印的banner,由于ee的banner是直接覆盖springboot默认banner的,所以如需关闭,直接关闭springboot的banner即可关闭ee的banner.\n\n\n1\n2\n3\n4\n5\n6\n7\n\n\n温馨提示\n\n * id-type支持3种类型:\n \n * auto: 由es自动生成,是默认的配置,无需您额外配置 推荐\n * uuid: 系统生成uuid,然后插入es (不推荐)\n * customize: 用户自定义,在此类型下,用户可以将任意数据类型的id存入es作为es中的数据id,比如将mysql自增的id作为es的id,可以开启此模式,或通过@tableid(type)注解指定.\n\n * field-strategy支持3种类型:\n \n * not_null: 非null判断,字段值为非null时,才会被更新\n * not_empty: 非空判断,字段值为非空字符串时才会被更新\n * ignore: 忽略判断,无论字段值为什么,都会被更新\n * 在配置了全局策略后,您仍可以通过注解针对个别类进行个性化配置,全局配置的优先级是小于注解配置的\n\n * refresh-policy支持3种策略\n \n * none: 默认策略,不刷新数据\n * immediate : 立即刷新,会损耗较多性能,对数据实时性要求高的场景下适用\n * wait_until: 请求提交数据后,等待数据完成刷新(1s),再结束请求 性能损耗适中",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"条件构造器",frontmatter:{title:"条件构造器",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/1cebb8/"},regularPath:"/v1.0.0/020.%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD/030.%E6%9D%A1%E4%BB%B6%E6%9E%84%E9%80%A0%E5%99%A8.html",relativePath:"v1.0.0/020.核心功能/030.条件构造器.md",key:"v-69171a4a",path:"/pages/1cebb8/",headers:[{level:3,title:"AbstractWrapper",slug:"abstractwrapper",normalizedTitle:"abstractwrapper",charIndex:456},{level:3,title:"QueryWrapper",slug:"querywrapper",normalizedTitle:"querywrapper",charIndex:135},{level:3,title:"UpdateWrapper",slug:"updatewrapper",normalizedTitle:"updatewrapper",charIndex:1103},{level:3,title:"allEq",slug:"alleq",normalizedTitle:"alleq",charIndex:1443},{level:3,title:"eq",slug:"eq",normalizedTitle:"eq",charIndex:331},{level:3,title:"ne",slug:"ne",normalizedTitle:"ne",charIndex:116},{level:3,title:"gt",slug:"gt",normalizedTitle:"gt",charIndex:2628},{level:3,title:"ge",slug:"ge",normalizedTitle:"ge",charIndex:315},{level:3,title:"lt",slug:"lt",normalizedTitle:"lt",charIndex:61},{level:3,title:"le",slug:"le",normalizedTitle:"le",charIndex:52},{level:3,title:"between",slug:"between",normalizedTitle:"between",charIndex:3132},{level:3,title:"notBetween",slug:"notbetween",normalizedTitle:"notbetween",charIndex:3334},{level:3,title:"like",slug:"like",normalizedTitle:"like",charIndex:272},{level:3,title:"notLike",slug:"notlike",normalizedTitle:"notlike",charIndex:3703},{level:3,title:"likeLeft",slug:"likeleft",normalizedTitle:"likeleft",charIndex:3870},{level:3,title:"likeRight",slug:"likeright",normalizedTitle:"likeright",charIndex:4031},{level:3,title:"isNull",slug:"isnull",normalizedTitle:"isnull",charIndex:1604},{level:3,title:"isNotNull",slug:"isnotnull",normalizedTitle:"isnotnull",charIndex:4332},{level:3,title:"in",slug:"in",normalizedTitle:"in",charIndex:42},{level:3,title:"notIn",slug:"notin",normalizedTitle:"notin",charIndex:4830},{level:3,title:"groupBy",slug:"groupby",normalizedTitle:"groupby",charIndex:5209},{level:3,title:"orderByDesc",slug:"orderbydesc",normalizedTitle:"orderbydesc",charIndex:5386},{level:3,title:"limit",slug:"limit",normalizedTitle:"limit",charIndex:5594},{level:3,title:"from",slug:"from",normalizedTitle:"from",charIndex:5928},{level:3,title:"size",slug:"size",normalizedTitle:"size",charIndex:5923},{level:3,title:"set",slug:"set",normalizedTitle:"set",charIndex:5760},{level:3,title:"index",slug:"index",normalizedTitle:"index",charIndex:42},{level:3,title:"enableMust2Filter",slug:"enablemust2filter",normalizedTitle:"enablemust2filter",charIndex:48},{level:3,title:"and&or (重点)",slug:"and-or-重点",normalizedTitle:"and&or (重点)",charIndex:null}],headersStr:"AbstractWrapper QueryWrapper UpdateWrapper allEq eq ne gt ge lt le between notBetween like notLike likeLeft likeRight isNull isNotNull in notIn groupBy orderByDesc limit from size set index enableMust2Filter and&or (重点)",content:'温馨提示\n\n如果您之前已经有了解过MP的条件构造器,那我们建议您直接拉到文末,看一下index,enableMust2Filter,and&or这三项MP中没有的即可,其它与MP一致. Wrapper支持两种方式创建:\n\n * 直接new,例如 new LambdaEsQueryWrapper<>().\n * 通过EsWrappers.lambdaQuery()创建,可支撑链式编程的场景,对标MP的Wrappers\n\n说明\n\n * 以下出现的第一个入参boolean condition表示该条件是否加入最后生成的语句中,例如:query.like(StringUtils.isNotBlank(name), Entity::getName, name) .eq(age!=null && age >= 0, Entity::getAge, age)\n * 以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true\n * 以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)\n * 以下方法在入参中出现的R为泛型,在普通wrapper中是String,在LambdaWrapper中是函数(例:Entity::getId,Entity为实体类,getId为字段id的getMethod)\n * 以下方法入参中的R column均表示数据库字段,当R具体类型为String时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名!!!,另当R具体类型为SFunction时项目runtime不支持eclipse自家的编译器!!!\n * 以下举例均为使用普通wrapper,入参为Map和List的均以json形式表现!\n * 使用中如果入参的Map或者List为空,则不会加入最后生成的sql中!\n * 有任何疑问就点开源码看,看不懂函数的点击我学习新知识\n\n警告\n\n不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输\n\n 1. wrapper 很重\n 2. 传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)\n 3. 正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作\n 4. 我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr\n\n\n# AbstractWrapper\n\n说明\n\nQueryWrapper(LambdaEsQueryWrapper) 和 UpdateWrapper(LambdaEsUpdateWrapper) 的父类用于生成 语句 的 where 条件, entity 属性也用于生成 语句 的 where 条件注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件 没有任何关联行为\n\n\n# QueryWrapper\n\n说明\n\n继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaEsQueryWrapper\n\n\n# UpdateWrapper\n\n说明\n\n继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaEsUpdateWrapper\n\n\n# allEq\n\nallEq(Map params)\nallEq(Map params, boolean null2IsNull)\nallEq(boolean condition, Map params, boolean null2IsNull)\n\n\n\n1\n2\n3\n4\n\n\n全部eq(或个别isNull)\n\n个别参数说明\n\nparams : key为数据库字段名,value为字段值 null2IsNull : 为true则在map的value为null时调用 isNull方法,为false时则忽略value为null的\n\n * 例1: allEq({id:1,name:"老王",age:null})---\x3eid = 1 and name = \'老王\' and age is null\n * 例2: allEq({id:1,name:"老王",age:null}, false)---\x3eid = 1 and name = \'老王\'\n\nallEq(BiPredicate filter, Map params)\nallEq(BiPredicate filter, Map params, boolean null2IsNull)\nallEq(boolean condition, BiPredicate filter, Map params, boolean null2IsNull) \n\n\n\n1\n2\n3\n4\n\n\n个别参数说明\n\n> filter : 过滤函数,是否允许字段传入比对条件中 params 与 null2IsNull : 同上\n\n * 例1: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})---\x3ename = \'老王\' and age is null\n * 例2: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)---\x3ename = \'老王\'\n\n\n# eq\n\neq(R column, Object val)\neq(boolean condition, R column, Object val)\n\n\n1\n2\n\n * 等于 =\n * 例: eq("name", "老王")---\x3ename = \'老王\'\n\n\n# ne\n\nne(R column, Object val)\nne(boolean condition, R column, Object val)\n\n\n1\n2\n\n * 不等于 !=\n * 例: ne("name", "老王")---\x3ename != \'老王\'\n\n\n# gt\n\ngt(R column, Object val)\ngt(boolean condition, R column, Object val)\n\n\n1\n2\n\n * 大于 >\n * 例: gt("age", 18)---\x3eage > 18\n\n\n# ge\n\nge(R column, Object val)\nge(boolean condition, R column, Object val)\n\n\n1\n2\n\n * 大于等于 >=\n * 例: ge("age", 18)---\x3eage >= 18\n\n\n# lt\n\nlt(R column, Object val)\nlt(boolean condition, R column, Object val)\n\n\n1\n2\n\n * 小于 <\n * 例: lt("age", 18)---\x3eage < 18\n\n\n# le\n\nle(R column, Object val)\nle(boolean condition, R column, Object val)\n\n\n1\n2\n\n * 小于等于 <=\n * 例: le("age", 18)---\x3eage <= 18\n\n\n# between\n\nbetween(R column, Object val1, Object val2)\nbetween(boolean condition, R column, Object val1, Object val2)\n\n\n1\n2\n\n * BETWEEN 值1 AND 值2\n * 例: between("age", 18, 30)---\x3eage between 18 and 30\n\n\n# notBetween\n\nnotBetween(R column, Object val1, Object val2)\nnotBetween(boolean condition, R column, Object val1, Object val2)\n\n\n1\n2\n\n * NOT BETWEEN 值1 AND 值2\n * 例: notBetween("age", 18, 30)---\x3eage not between 18 and 30\n\n\n# like\n\nlike(R column, Object val)\nlike(boolean condition, R column, Object val)\n\n\n1\n2\n\n * LIKE \'%值%\'\n * 例: like("name", "王")---\x3ename like \'%王%\'\n\n\n# notLike\n\nnotLike(R column, Object val)\nnotLike(boolean condition, R column, Object val)\n\n\n1\n2\n\n * NOT LIKE \'%值%\'\n * 例: notLike("name", "王")---\x3ename not like \'%王%\'\n\n\n# likeLeft\n\nlikeLeft(R column, Object val)\nlikeLeft(boolean condition, R column, Object val)\n\n\n1\n2\n\n * LIKE \'%值\'\n * 例: likeLeft("name", "王")---\x3ename like \'%王\'\n\n\n# likeRight\n\nlikeRight(R column, Object val)\nlikeRight(boolean condition, R column, Object val)\n\n\n1\n2\n\n * LIKE \'值%\'\n * 例: likeRight("name", "王")---\x3ename like \'王%\'\n\n\n# isNull\n\nisNull(R column)\nisNull(boolean condition, R column)\n\n\n1\n2\n\n * 字段 IS NULL\n * 例: isNull(Document::getTitle)---\x3etitle is null\n\n\n# isNotNull\n\nisNotNull(R column)\nisNotNull(boolean condition, R column)\n\n\n1\n2\n\n * 字段 IS NOT NULL\n * 例: isNotNull(Document::getTitle)---\x3etitle is not null\n\n\n# in\n\nin(R column, Collection value)\nin(boolean condition, R column, Collection value)\n\n\n1\n2\n\n * 字段 in (value.get(0), value.get(1), ...)\n * 例: in("age",{1,2,3})---\x3eage in (1,2,3)\n\nin(R column, Object... values)\nin(boolean condition, R column, Object... values)\n\n\n1\n2\n\n * 字段 in (v0, v1, ...)\n * 例: in("age", 1, 2, 3)---\x3eage in (1,2,3)\n\n\n# notIn\n\nnotIn(R column, Collection value)\nnotIn(boolean condition, R column, Collection value)\n\n\n1\n2\n\n * 字段 not in (value.get(0), value.get(1), ...)\n * 例: notIn("age",{1,2,3})---\x3eage not in (1,2,3)\n\nnotIn(R column, Object... values)\nnotIn(boolean condition, R column, Object... values)\n\n\n1\n2\n\n * 字段 not in (v0, v1, ...)\n * 例: notIn("age", 1, 2, 3)---\x3eage not in (1,2,3)\n\n\n# groupBy\n\ngroupBy(R... columns)\ngroupBy(boolean condition, R... columns)\n\n\n1\n2\n\n * 分组:GROUP BY 字段, ...\n * 例: groupBy(Document::getId,Document::getTitle)---\x3egroup by id,title\n\n\n# orderByDesc\n\norderByDesc(R... columns)\norderByDesc(boolean condition, R... columns)\n\n\n1\n2\n\n * 排序:ORDER BY 字段, ... DESC\n * 例: orderByDesc(Document::getId,Document::getTitle)---\x3eorder by id DESC,title DESC\n\n\n# limit\n\nlimit(Integer n);\n\nlimit(Integer m, Integer n);\n\n\n1\n2\n3\n\n * limit n 最多返回多少条数据,相当于MySQL中limit n 中的n,用法一致.\n * limit m,n 跳过m条数据,最多返回n条数据,相当于MySQL中的limit m,n 或 offset m limit n\n * 例: limit(10)---\x3e最多只返回10条数据\n * 例: limit(2,5)---\x3e跳过前2条数据,从第3条开始查询,总共查询5条数据\n\n温馨提示\n\nn参数若不指定,则其默认值是10000 如果你单次查询,不想要太多得分较低的数据,需要手动指定n去做限制. 另外此参数作用与Es中的size,from一致,只是为了兼容MySQL语法而引入,使用者可以根据自身习惯二选一,当两种都用时,只有一种会生效,后指定的会覆盖先指定的.\n\n\n# from\n\nfrom(Integer from)\n\n\n1\n\n * 从第几条数据开始查询,相当于MySQL中limit (m,n)中的m.\n * 例: from(10)---\x3e从第10条数据开始查询\n\n\n# size\n\nsize(Integer size)\n\n\n1\n\n * 最多返回多少条数据,相当于MySQL中limit (m,n)中的n 或limit n 中的n\n * 例: size(10)---\x3e最多只返回10条数据\n\n温馨提示\n\n如果你单次查询,不想要太多得分较低的数据,需要手动指定size去做限制.\n\n\n# set\n\nset(String column, Object val)\nset(boolean condition, String column, Object val)\n\n\n1\n2\n\n * SQL SET 字段\n * 例: set("name", "老李头")\n * 例: set("name", "")---\x3e数据库字段值变为空字符串\n * 例: set("name", null)---\x3e数据库字段值变为null\n\n\n# index\n\nindex(String indexName)\neq(boolean condition, String indexName)\n\n\n1\n2\n\n\n温馨提示\n\n可通过wrapper.index(String indexName)指定本次查询作用于哪个索引,如果本次查询要从多个索引上查询,那么索引名称可以用逗号隔开,例如wrapper.eq("index1","indexes"). wrapper中指定的索引名称优先级最高,如果不指定则取实体类中配置的索引名称,如果实体类也未配置,则取实体名称小写作为当前查询的索引名 针对insert/delete/update等接口中无wrapper的情况,如果你需要指定索引名,可直接在对应接口的入参中添加索引名称,可参考下面示例:\n\n Document document = new Document();\n // 省略为document赋值的代码\n String indexName = "laohan";\n insert(document,indexName);\n\n\n1\n2\n3\n4\n\n\n\n# enableMust2Filter\n\nenableMust2Filter(boolean enable)\nenableMust2Filter(boolean condition, boolean enable)\n\n\n1\n2\n\n\n温馨提示\n\n是否将must查询条件转换成filter查询条件,可以在wrapper中直接指定本次查询的条件是否转换,如果不指定,则从全局配置文件中获取,若配置文件中也未配置,则默认不转换. must查询条件计算得分,filter不计算得分,因此在不需要计算得分的查询场景中,开启此配置可提升少许查询性能.\n\n\n# and&or (重点)\n\n致歉\n\nES的参数实际上是以树形数据结构封装的,所以在ES中的AND及OR没有办法做到和MySQL中一致,为了实现和MP几乎一致的语法,作者那糟老头子头发都想没了... 好在最后,基本上做到了99%相似度的语法,仍有1%需要各位用户学习一下.\n\nMySQL和ES语法对应关系表格如下\n\nMYSQL ES\nand(条件1,条件2...) must BoolQueryBuilder(条件1,条件2)\nor(条件1,条件2...) should BoolQueryBuilder(条件1,条件2)\n条件1.or().条件2 should条件1,should条件2\n\n> AND 介绍,EE中的AND其实就是将AND括号中的多个查询条件封装进一个BoolQueryBuilder中作为整体,然后该整体与其他参数默认以Must封装,功能类似MySQL中的 AND(条件1,条件2,条件3...)\n\nAND API\n\nand(Consumer consumer)\nand(boolean condition, Consumer consumer)\n\n\n1\n2\n\n * AND\n * 例: and(i -> i.eq(Document::getTitle, "Hello").ne(Document::getCreator, "Guy"))---\x3eand (title =\'Hello\' and creator != \'Guy\' )\n\n> OR 介绍,EE中的OR和MP中的OR一样,支持2种,一种是or(),作为连接符,另一种是or(条件1,条件2,条件3).\n\n * 第一种or():用于把or()连接符前面和后面的must条件统统重置为should查询条件\n * 第二种or(条件1,条件2,条件3...): 用于将括号中的多个查询条件封装进一个BoolQueryBuilder中作为整体,然后该整体与其它参数默认以Should封装,功能类似MySQL中的OR(条件1,条件2,条件3...)\n * 第三种特殊情况,就是第一种or()连接符出现在and(条件1.or().条件2...)或or(条件1.or().条件2...)中,此时or()将must条件重置为should条件的范围仅限于括号内,括号外面的查询条件不受影响.\n\nor()\nor(boolean condition)\n\n\n1\n2\n\n * 拼接 OR 注意事项: 主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)\n * 例: eq("Document::getId",1).or().eq(Document::getTitle,"Hello")---\x3eid = 1 or title =\'Hello\'\n\nor(Consumer consumer)\nor(boolean condition, Consumer consumer)\n\n\n1\n2\n\n\n * OR\n\n * 例: or(i -> i.eq(Document::getTitle, "Hello").ne(Document::getCreator, "Guy"))---\x3eor (title =\'Hello\' and status != \'Guy\' )\n\n * 特殊情况\n\n * 例: eq(Document::getTitle,"Hello") .and(i->i.eq(Document::getCreator,"Bob").or().eq(Document::getCreator,"Tom"))---\x3e title="Hello" and(creator="Bob" or creator="Tom")\n\n----------------------------------------\n\n除此之外,有一部分使用场景是如下图这样的,所有查询字段,查询类型,匹配规则等都是不固定的,由用户自由来选,这种情况下,采用上面的语法代码会非常难写,不妨使用queryStringQuery API来解决,用它来解决,整个语法就更像MySQL了,而且灵活性和效率都很高.\n\n\n\n前置知识学习\n\n正式进入主题前,我们先来了解下ES的索引,因为有很多小白不懂ES索引,所以这里简单说一下ES的keyword类型和text类型,以免下面踩坑,已经了解的可直接跳过此段介绍.\n\nES中的keyword类型,和MySQL中的字段基本上差不多,当我们需要对查询字段进行精确匹配,左模糊,右模糊,全模糊,排序聚合等操作时,需要该字段的索引类型为keyword类型,当我们需要对字段进行分词查询时,需要该字段的类型为text类型,并且指定分词器(不指定就用ES默认分词器,效果通常不理想).当同一个字段,我们既需要把它当keyword类型使用,又需要把它当text类型使用时,此时我们的索引类型为keyword_text类型,EE中可以对字段添加注解@TableField(fieldType = FieldType.KEYWORD_TEXT),如此该字段就会被创建为keyword+text双类型如下图所示,值得注意的是,当我们把该字段当做keyword类型查询时,ES要求传入的字段名称为"字段名.keyword",当把该字段当text类型查询时,直接使用原字段名即可.\n\n\n\n还需要注意的是,如果一个字段的索引类型被创建为仅为keyword类型(如下图所示)查询时,则不需要在其名称后面追加.keyword,直接查询就行.\n\n\n\n----------------------------------------\n\n啰嗦完了,正式进入主题,queryStringQuery API:\n\nqueryStringQuery(String queryString);\n\n\n1\n\n\n其中queryString字符串就是我们的查询条件,我们可以用StringBuilder把查询字段和值拼接进去,组装成最终的查询语句. 以上图为例,我演示一个场景,请忽略场景合理性,因为是我瞎xx选的:假设我的查询条件是:字段:创建者 等于老王,且创建者分词匹配"隔壁"(比如:隔壁老汉,隔壁老王),或者创建者包含大猪蹄子,对应的代码如下:\n\n @Test\n public void testQueryString() {\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n StringBuilder sb = new StringBuilder();\n sb.append("(")\n .append("(")\n .append("creator.keyword")\n .append(":")\n .append("老王")\n .append(")")\n .append("AND")\n .append("(")\n .append("creator")\n .append(":")\n .append("隔壁")\n .append(")")\n .append(")")\n .append("OR")\n .append("(")\n .append("creator.keyword")\n .append(":")\n .append("*大猪蹄子*")\n .append(")");\n // sb最终拼接为:((creator.keyword:老王)AND(creator:隔壁))OR(creator.keyword:*大猪蹄子*) ,可以说和MySQL语法非常相似了\n wrapper.queryStringQuery(sb.toString());\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n\n\n前端参数页面每传递一行查询参数,我们往sb中append对应参数就完事了,是不是很简单,没错,但是代码不优雅,可咋整? 老汉已经给你们想好出路了,我们提供了工具类,其全路径为:cn.easyes.core.toolkit.QueryUtils 我们用使用该工具类重构上面的代码,如下:\n\n @Test\n public void testQueryStringQueryMulti() {\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n String queryStr = QueryUtils.combine(Link.OR,\n QueryUtils.buildQueryString(Document::getCreator, "老王", Query.EQ, Link.AND),\n QueryUtils.buildQueryString(Document::getCreator, "隔壁", Query.MATCH))\n + QueryUtils.buildQueryString(Document::getCreator, "*大猪蹄子*", Query.EQ);\n wrapper.queryStringQuery(queryStr);\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\n是不是优雅了很多,其中的枚举Query和Link我也已经为你们封装好了,直接使用即可,不懂其枚举含义也可以直接点开查看,我在源码中有详细注释.',normalizedContent:'温馨提示\n\n如果您之前已经有了解过mp的条件构造器,那我们建议您直接拉到文末,看一下index,enablemust2filter,and&or这三项mp中没有的即可,其它与mp一致. wrapper支持两种方式创建:\n\n * 直接new,例如 new lambdaesquerywrapper<>().\n * 通过eswrappers.lambdaquery()创建,可支撑链式编程的场景,对标mp的wrappers\n\n说明\n\n * 以下出现的第一个入参boolean condition表示该条件是否加入最后生成的语句中,例如:query.like(stringutils.isnotblank(name), entity::getname, name) .eq(age!=null && age >= 0, entity::getage, age)\n * 以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true\n * 以下出现的泛型param均为wrapper的子类实例(均具有abstractwrapper的所有方法)\n * 以下方法在入参中出现的r为泛型,在普通wrapper中是string,在lambdawrapper中是函数(例:entity::getid,entity为实体类,getid为字段id的getmethod)\n * 以下方法入参中的r column均表示数据库字段,当r具体类型为string时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名!!!,另当r具体类型为sfunction时项目runtime不支持eclipse自家的编译器!!!\n * 以下举例均为使用普通wrapper,入参为map和list的均以json形式表现!\n * 使用中如果入参的map或者list为空,则不会加入最后生成的sql中!\n * 有任何疑问就点开源码看,看不懂函数的点击我学习新知识\n\n警告\n\n不支持以及不赞成在 rpc 调用中把 wrapper 进行传输\n\n 1. wrapper 很重\n 2. 传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)\n 3. 正确的 rpc 调用姿势是写一个 dto 进行传输,被调用方再根据 dto 执行相应的操作\n 4. 我们拒绝接受任何关于 rpc 传输 wrapper 报错相关的 issue 甚至 pr\n\n\n# abstractwrapper\n\n说明\n\nquerywrapper(lambdaesquerywrapper) 和 updatewrapper(lambdaesupdatewrapper) 的父类用于生成 语句 的 where 条件, entity 属性也用于生成 语句 的 where 条件注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件 没有任何关联行为\n\n\n# querywrapper\n\n说明\n\n继承自 abstractwrapper ,自身的内部属性 entity 也用于生成 where 条件及 lambdaesquerywrapper\n\n\n# updatewrapper\n\n说明\n\n继承自 abstractwrapper ,自身的内部属性 entity 也用于生成 where 条件及 lambdaesupdatewrapper\n\n\n# alleq\n\nalleq(map params)\nalleq(map params, boolean null2isnull)\nalleq(boolean condition, map params, boolean null2isnull)\n\n\n\n1\n2\n3\n4\n\n\n全部eq(或个别isnull)\n\n个别参数说明\n\nparams : key为数据库字段名,value为字段值 null2isnull : 为true则在map的value为null时调用 isnull方法,为false时则忽略value为null的\n\n * 例1: alleq({id:1,name:"老王",age:null})---\x3eid = 1 and name = \'老王\' and age is null\n * 例2: alleq({id:1,name:"老王",age:null}, false)---\x3eid = 1 and name = \'老王\'\n\nalleq(bipredicate filter, map params)\nalleq(bipredicate filter, map params, boolean null2isnull)\nalleq(boolean condition, bipredicate filter, map params, boolean null2isnull) \n\n\n\n1\n2\n3\n4\n\n\n个别参数说明\n\n> filter : 过滤函数,是否允许字段传入比对条件中 params 与 null2isnull : 同上\n\n * 例1: alleq((k,v) -> k.indexof("a") >= 0, {id:1,name:"老王",age:null})---\x3ename = \'老王\' and age is null\n * 例2: alleq((k,v) -> k.indexof("a") >= 0, {id:1,name:"老王",age:null}, false)---\x3ename = \'老王\'\n\n\n# eq\n\neq(r column, object val)\neq(boolean condition, r column, object val)\n\n\n1\n2\n\n * 等于 =\n * 例: eq("name", "老王")---\x3ename = \'老王\'\n\n\n# ne\n\nne(r column, object val)\nne(boolean condition, r column, object val)\n\n\n1\n2\n\n * 不等于 !=\n * 例: ne("name", "老王")---\x3ename != \'老王\'\n\n\n# gt\n\ngt(r column, object val)\ngt(boolean condition, r column, object val)\n\n\n1\n2\n\n * 大于 >\n * 例: gt("age", 18)---\x3eage > 18\n\n\n# ge\n\nge(r column, object val)\nge(boolean condition, r column, object val)\n\n\n1\n2\n\n * 大于等于 >=\n * 例: ge("age", 18)---\x3eage >= 18\n\n\n# lt\n\nlt(r column, object val)\nlt(boolean condition, r column, object val)\n\n\n1\n2\n\n * 小于 <\n * 例: lt("age", 18)---\x3eage < 18\n\n\n# le\n\nle(r column, object val)\nle(boolean condition, r column, object val)\n\n\n1\n2\n\n * 小于等于 <=\n * 例: le("age", 18)---\x3eage <= 18\n\n\n# between\n\nbetween(r column, object val1, object val2)\nbetween(boolean condition, r column, object val1, object val2)\n\n\n1\n2\n\n * between 值1 and 值2\n * 例: between("age", 18, 30)---\x3eage between 18 and 30\n\n\n# notbetween\n\nnotbetween(r column, object val1, object val2)\nnotbetween(boolean condition, r column, object val1, object val2)\n\n\n1\n2\n\n * not between 值1 and 值2\n * 例: notbetween("age", 18, 30)---\x3eage not between 18 and 30\n\n\n# like\n\nlike(r column, object val)\nlike(boolean condition, r column, object val)\n\n\n1\n2\n\n * like \'%值%\'\n * 例: like("name", "王")---\x3ename like \'%王%\'\n\n\n# notlike\n\nnotlike(r column, object val)\nnotlike(boolean condition, r column, object val)\n\n\n1\n2\n\n * not like \'%值%\'\n * 例: notlike("name", "王")---\x3ename not like \'%王%\'\n\n\n# likeleft\n\nlikeleft(r column, object val)\nlikeleft(boolean condition, r column, object val)\n\n\n1\n2\n\n * like \'%值\'\n * 例: likeleft("name", "王")---\x3ename like \'%王\'\n\n\n# likeright\n\nlikeright(r column, object val)\nlikeright(boolean condition, r column, object val)\n\n\n1\n2\n\n * like \'值%\'\n * 例: likeright("name", "王")---\x3ename like \'王%\'\n\n\n# isnull\n\nisnull(r column)\nisnull(boolean condition, r column)\n\n\n1\n2\n\n * 字段 is null\n * 例: isnull(document::gettitle)---\x3etitle is null\n\n\n# isnotnull\n\nisnotnull(r column)\nisnotnull(boolean condition, r column)\n\n\n1\n2\n\n * 字段 is not null\n * 例: isnotnull(document::gettitle)---\x3etitle is not null\n\n\n# in\n\nin(r column, collection value)\nin(boolean condition, r column, collection value)\n\n\n1\n2\n\n * 字段 in (value.get(0), value.get(1), ...)\n * 例: in("age",{1,2,3})---\x3eage in (1,2,3)\n\nin(r column, object... values)\nin(boolean condition, r column, object... values)\n\n\n1\n2\n\n * 字段 in (v0, v1, ...)\n * 例: in("age", 1, 2, 3)---\x3eage in (1,2,3)\n\n\n# notin\n\nnotin(r column, collection value)\nnotin(boolean condition, r column, collection value)\n\n\n1\n2\n\n * 字段 not in (value.get(0), value.get(1), ...)\n * 例: notin("age",{1,2,3})---\x3eage not in (1,2,3)\n\nnotin(r column, object... values)\nnotin(boolean condition, r column, object... values)\n\n\n1\n2\n\n * 字段 not in (v0, v1, ...)\n * 例: notin("age", 1, 2, 3)---\x3eage not in (1,2,3)\n\n\n# groupby\n\ngroupby(r... columns)\ngroupby(boolean condition, r... columns)\n\n\n1\n2\n\n * 分组:group by 字段, ...\n * 例: groupby(document::getid,document::gettitle)---\x3egroup by id,title\n\n\n# orderbydesc\n\norderbydesc(r... columns)\norderbydesc(boolean condition, r... columns)\n\n\n1\n2\n\n * 排序:order by 字段, ... desc\n * 例: orderbydesc(document::getid,document::gettitle)---\x3eorder by id desc,title desc\n\n\n# limit\n\nlimit(integer n);\n\nlimit(integer m, integer n);\n\n\n1\n2\n3\n\n * limit n 最多返回多少条数据,相当于mysql中limit n 中的n,用法一致.\n * limit m,n 跳过m条数据,最多返回n条数据,相当于mysql中的limit m,n 或 offset m limit n\n * 例: limit(10)---\x3e最多只返回10条数据\n * 例: limit(2,5)---\x3e跳过前2条数据,从第3条开始查询,总共查询5条数据\n\n温馨提示\n\nn参数若不指定,则其默认值是10000 如果你单次查询,不想要太多得分较低的数据,需要手动指定n去做限制. 另外此参数作用与es中的size,from一致,只是为了兼容mysql语法而引入,使用者可以根据自身习惯二选一,当两种都用时,只有一种会生效,后指定的会覆盖先指定的.\n\n\n# from\n\nfrom(integer from)\n\n\n1\n\n * 从第几条数据开始查询,相当于mysql中limit (m,n)中的m.\n * 例: from(10)---\x3e从第10条数据开始查询\n\n\n# size\n\nsize(integer size)\n\n\n1\n\n * 最多返回多少条数据,相当于mysql中limit (m,n)中的n 或limit n 中的n\n * 例: size(10)---\x3e最多只返回10条数据\n\n温馨提示\n\n如果你单次查询,不想要太多得分较低的数据,需要手动指定size去做限制.\n\n\n# set\n\nset(string column, object val)\nset(boolean condition, string column, object val)\n\n\n1\n2\n\n * sql set 字段\n * 例: set("name", "老李头")\n * 例: set("name", "")---\x3e数据库字段值变为空字符串\n * 例: set("name", null)---\x3e数据库字段值变为null\n\n\n# index\n\nindex(string indexname)\neq(boolean condition, string indexname)\n\n\n1\n2\n\n\n温馨提示\n\n可通过wrapper.index(string indexname)指定本次查询作用于哪个索引,如果本次查询要从多个索引上查询,那么索引名称可以用逗号隔开,例如wrapper.eq("index1","indexes"). wrapper中指定的索引名称优先级最高,如果不指定则取实体类中配置的索引名称,如果实体类也未配置,则取实体名称小写作为当前查询的索引名 针对insert/delete/update等接口中无wrapper的情况,如果你需要指定索引名,可直接在对应接口的入参中添加索引名称,可参考下面示例:\n\n document document = new document();\n // 省略为document赋值的代码\n string indexname = "laohan";\n insert(document,indexname);\n\n\n1\n2\n3\n4\n\n\n\n# enablemust2filter\n\nenablemust2filter(boolean enable)\nenablemust2filter(boolean condition, boolean enable)\n\n\n1\n2\n\n\n温馨提示\n\n是否将must查询条件转换成filter查询条件,可以在wrapper中直接指定本次查询的条件是否转换,如果不指定,则从全局配置文件中获取,若配置文件中也未配置,则默认不转换. must查询条件计算得分,filter不计算得分,因此在不需要计算得分的查询场景中,开启此配置可提升少许查询性能.\n\n\n# and&or (重点)\n\n致歉\n\nes的参数实际上是以树形数据结构封装的,所以在es中的and及or没有办法做到和mysql中一致,为了实现和mp几乎一致的语法,作者那糟老头子头发都想没了... 好在最后,基本上做到了99%相似度的语法,仍有1%需要各位用户学习一下.\n\nmysql和es语法对应关系表格如下\n\nmysql es\nand(条件1,条件2...) must boolquerybuilder(条件1,条件2)\nor(条件1,条件2...) should boolquerybuilder(条件1,条件2)\n条件1.or().条件2 should条件1,should条件2\n\n> and 介绍,ee中的and其实就是将and括号中的多个查询条件封装进一个boolquerybuilder中作为整体,然后该整体与其他参数默认以must封装,功能类似mysql中的 and(条件1,条件2,条件3...)\n\nand api\n\nand(consumer consumer)\nand(boolean condition, consumer consumer)\n\n\n1\n2\n\n * and\n * 例: and(i -> i.eq(document::gettitle, "hello").ne(document::getcreator, "guy"))---\x3eand (title =\'hello\' and creator != \'guy\' )\n\n> or 介绍,ee中的or和mp中的or一样,支持2种,一种是or(),作为连接符,另一种是or(条件1,条件2,条件3).\n\n * 第一种or():用于把or()连接符前面和后面的must条件统统重置为should查询条件\n * 第二种or(条件1,条件2,条件3...): 用于将括号中的多个查询条件封装进一个boolquerybuilder中作为整体,然后该整体与其它参数默认以should封装,功能类似mysql中的or(条件1,条件2,条件3...)\n * 第三种特殊情况,就是第一种or()连接符出现在and(条件1.or().条件2...)或or(条件1.or().条件2...)中,此时or()将must条件重置为should条件的范围仅限于括号内,括号外面的查询条件不受影响.\n\nor()\nor(boolean condition)\n\n\n1\n2\n\n * 拼接 or 注意事项: 主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)\n * 例: eq("document::getid",1).or().eq(document::gettitle,"hello")---\x3eid = 1 or title =\'hello\'\n\nor(consumer consumer)\nor(boolean condition, consumer consumer)\n\n\n1\n2\n\n\n * or\n\n * 例: or(i -> i.eq(document::gettitle, "hello").ne(document::getcreator, "guy"))---\x3eor (title =\'hello\' and status != \'guy\' )\n\n * 特殊情况\n\n * 例: eq(document::gettitle,"hello") .and(i->i.eq(document::getcreator,"bob").or().eq(document::getcreator,"tom"))---\x3e title="hello" and(creator="bob" or creator="tom")\n\n----------------------------------------\n\n除此之外,有一部分使用场景是如下图这样的,所有查询字段,查询类型,匹配规则等都是不固定的,由用户自由来选,这种情况下,采用上面的语法代码会非常难写,不妨使用querystringquery api来解决,用它来解决,整个语法就更像mysql了,而且灵活性和效率都很高.\n\n\n\n前置知识学习\n\n正式进入主题前,我们先来了解下es的索引,因为有很多小白不懂es索引,所以这里简单说一下es的keyword类型和text类型,以免下面踩坑,已经了解的可直接跳过此段介绍.\n\nes中的keyword类型,和mysql中的字段基本上差不多,当我们需要对查询字段进行精确匹配,左模糊,右模糊,全模糊,排序聚合等操作时,需要该字段的索引类型为keyword类型,当我们需要对字段进行分词查询时,需要该字段的类型为text类型,并且指定分词器(不指定就用es默认分词器,效果通常不理想).当同一个字段,我们既需要把它当keyword类型使用,又需要把它当text类型使用时,此时我们的索引类型为keyword_text类型,ee中可以对字段添加注解@tablefield(fieldtype = fieldtype.keyword_text),如此该字段就会被创建为keyword+text双类型如下图所示,值得注意的是,当我们把该字段当做keyword类型查询时,es要求传入的字段名称为"字段名.keyword",当把该字段当text类型查询时,直接使用原字段名即可.\n\n\n\n还需要注意的是,如果一个字段的索引类型被创建为仅为keyword类型(如下图所示)查询时,则不需要在其名称后面追加.keyword,直接查询就行.\n\n\n\n----------------------------------------\n\n啰嗦完了,正式进入主题,querystringquery api:\n\nquerystringquery(string querystring);\n\n\n1\n\n\n其中querystring字符串就是我们的查询条件,我们可以用stringbuilder把查询字段和值拼接进去,组装成最终的查询语句. 以上图为例,我演示一个场景,请忽略场景合理性,因为是我瞎xx选的:假设我的查询条件是:字段:创建者 等于老王,且创建者分词匹配"隔壁"(比如:隔壁老汉,隔壁老王),或者创建者包含大猪蹄子,对应的代码如下:\n\n @test\n public void testquerystring() {\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n stringbuilder sb = new stringbuilder();\n sb.append("(")\n .append("(")\n .append("creator.keyword")\n .append(":")\n .append("老王")\n .append(")")\n .append("and")\n .append("(")\n .append("creator")\n .append(":")\n .append("隔壁")\n .append(")")\n .append(")")\n .append("or")\n .append("(")\n .append("creator.keyword")\n .append(":")\n .append("*大猪蹄子*")\n .append(")");\n // sb最终拼接为:((creator.keyword:老王)and(creator:隔壁))or(creator.keyword:*大猪蹄子*) ,可以说和mysql语法非常相似了\n wrapper.querystringquery(sb.tostring());\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n\n\n前端参数页面每传递一行查询参数,我们往sb中append对应参数就完事了,是不是很简单,没错,但是代码不优雅,可咋整? 老汉已经给你们想好出路了,我们提供了工具类,其全路径为:cn.easyes.core.toolkit.queryutils 我们用使用该工具类重构上面的代码,如下:\n\n @test\n public void testquerystringquerymulti() {\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n string querystr = queryutils.combine(link.or,\n queryutils.buildquerystring(document::getcreator, "老王", query.eq, link.and),\n queryutils.buildquerystring(document::getcreator, "隔壁", query.match))\n + queryutils.buildquerystring(document::getcreator, "*大猪蹄子*", query.eq);\n wrapper.querystringquery(querystr);\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\n是不是优雅了很多,其中的枚举query和link我也已经为你们封装好了,直接使用即可,不懂其枚举含义也可以直接点开查看,我在源码中有详细注释.',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"原生查询",frontmatter:{title:"原生查询",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/4446a5/"},regularPath:"/v1.0.0/030.%E6%8B%93%E5%B1%95%E5%8A%9F%E8%83%BD/020.%E5%8E%9F%E7%94%9F%E6%9F%A5%E8%AF%A2.html",relativePath:"v1.0.0/030.拓展功能/020.原生查询.md",key:"v-da0fbfe4",path:"/pages/4446a5/",headers:[{level:2,title:"API",slug:"api",normalizedTitle:"api",charIndex:2}],headersStr:"API",content:"# API\n\n\t// 半原生查询\n SearchResponse search(LambdaEsQueryWrapper wrapper) throws IOException;\n\t\n\t// 标准原生查询 可指定 RequestOptions\n SearchResponse search(SearchRequest searchRequest, RequestOptions requestOptions) throws IOException;\n\n\n1\n2\n3\n4\n5\n\n\n温馨提示\n\n在一些高阶语法中,比如指定高亮字段,如果我们返回类型是实体对象本身,但实体中通常又没有高亮字段,导致高亮字段无法接收,此时可以用RestClietn原生的返回对象SearchResponse. 尽管EE覆盖了我们使用ES的绝大多场景,但仍可能存在没有覆盖到的场景,此时您仍可以通过RestClient提供的原生语法进行查询,调用标准原生查询方法即可,入参和返回均为RestClient原生 如果您需要在代码中用到RestHighLevelClient,您可以直接使用@Autowired注解注入使用,EE已经帮您自动配置了该bean,所以使用EE永远是>=RestHighLevelClient的.",normalizedContent:"# api\n\n\t// 半原生查询\n searchresponse search(lambdaesquerywrapper wrapper) throws ioexception;\n\t\n\t// 标准原生查询 可指定 requestoptions\n searchresponse search(searchrequest searchrequest, requestoptions requestoptions) throws ioexception;\n\n\n1\n2\n3\n4\n5\n\n\n温馨提示\n\n在一些高阶语法中,比如指定高亮字段,如果我们返回类型是实体对象本身,但实体中通常又没有高亮字段,导致高亮字段无法接收,此时可以用restclietn原生的返回对象searchresponse. 尽管ee覆盖了我们使用es的绝大多场景,但仍可能存在没有覆盖到的场景,此时您仍可以通过restclient提供的原生语法进行查询,调用标准原生查询方法即可,入参和返回均为restclient原生 如果您需要在代码中用到resthighlevelclient,您可以直接使用@autowired注解注入使用,ee已经帮您自动配置了该bean,所以使用ee永远是>=resthighlevelclient的.",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"索引处理",frontmatter:{title:"索引处理",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/06b5d9/"},regularPath:"/v1.0.0/020.%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD/010.%E7%B4%A2%E5%BC%95%E5%A4%84%E7%90%86.html",relativePath:"v1.0.0/020.核心功能/010.索引处理.md",key:"v-288054d3",path:"/pages/06b5d9/",headers:[{level:2,title:"模式一:自动托管之平滑模式(自动挡-雪地模式) 默认开启此模式",slug:"模式一-自动托管之平滑模式-自动挡-雪地模式-默认开启此模式",normalizedTitle:"模式一:自动托管之平滑模式(自动挡-雪地模式) 默认开启此模式",charIndex:526},{level:2,title:"模式二:自动托管之非平滑模式(自动挡-运动模式)",slug:"模式二-自动托管之非平滑模式-自动挡-运动模式",normalizedTitle:"模式二:自动托管之非平滑模式(自动挡-运动模式)",charIndex:955},{level:2,title:"模式三:手动模式(手动挡)",slug:"模式三-手动模式-手动挡",normalizedTitle:"模式三:手动模式(手动挡)",charIndex:3531},{level:2,title:"配置启用模式",slug:"配置启用模式",normalizedTitle:"配置启用模式",charIndex:6691}],headersStr:"模式一:自动托管之平滑模式(自动挡-雪地模式) 默认开启此模式 模式二:自动托管之非平滑模式(自动挡-运动模式) 模式三:手动模式(手动挡) 配置启用模式",content:'前言\n\nES难用,索引首当其冲,索引的创建不仅复杂,而且难于维护,一旦索引有变动,就必须面对索引重建带来的服务停机和数据丢失等问题... 尽管ES官方提供了索引别名机制来解决问题,但门槛依旧很高,步骤繁琐,在生产环境中由人工操作非常容易出现失误带来严重的问题. 为了解决这些痛点,Easy-Es提供了多种策略,将用户彻底从索引的维护中解放出来,我们提供了多种索引处理策略,来满足不同用户的个性化需求. 通过对索引的初体验,相信您也可以更深体会到EE的成熟度和易用性. 其中全自动平滑模式,首次采用全球领先的"哥哥你不用动,EE我全自动"的模式,索引的创建,更新,数据迁移等所有全生命周期均无需用户介入,由EE全自动完成,过程零停机,连索引类型都可智能自动推断,一条龙服务,包您满意.是全球开源首创,充分借鉴了JVM垃圾回收算法思想,史无前例,尽管网上已有平滑过渡方案,但并非全自动,过程依旧靠人工介入,我为EE代言,请放心将索引托管给EE,索引只有在彻底迁移成功才会删除旧索引,否则均不会对原有索引和数据造成影响,发生任何意外均能保留原索引和数据,所以安全系数很高.\n\n> 温馨提示:新手上路可尽量选择自动挡模式,老司机自动挡手动挡您请随意~\n\n\n# 模式一:自动托管之平滑模式(自动挡-雪地模式) 默认开启此模式\n\n> 在此模式下,索引的创建更新数据迁移等全生命周期用户均不需要任何操作即可完成,过程零停机,用户无感知,可实现在生产环境的平滑过渡,类似汽车的自动档-雪地模式,平稳舒适,彻底解放用户,尽情享受自动架势的乐趣! 需要值得特别注意的是,在自动托管模式下,系统会自动生成一条名为ee-distribute-lock的索引,该索引为框架内部使用,用户可忽略,若不幸因断电等其它因素极小概率下发生死锁,可删除该索引即可.另外,在使用时如碰到索引变更,原索引名称可能会被追加后缀_s0或_s1,不必慌张,这是全自动平滑迁移零停机的必经之路,索引后缀不影响使用,框架会自动激活该新索引.关于_s0和_s1后缀,在此模式下无法避免,因为要保留原索引数据迁移,又不能同时存在两个同名索引,凡是都是要付出代价的,如果您不认可此种处理方式,可继续往下看,总有一种适合您。\n\n其核心处理流程梳理如下图所示:\n\n\n# 模式二:自动托管之非平滑模式(自动挡-运动模式)\n\n在此模式下,索引额创建及更新由EE全自动异步完成,但不处理数据迁移工作,速度极快类似汽车的自动挡-运动模式,简单粗暴,弹射起步! 适合在开发及测试环境使用,当然如果您使用logstash等其它工具来同步数据,亦可在生产环境开启此模式,在此模式下不会出现_s0和_s1后缀,索引会保持原名称.\n\n\n\n提示\n\n以上两种自动模式中,索引信息主要依托于实体类,如果用户未对该实体类进行任何配置,EE依然能够根据字段类型智能推断出该字段在ES中的存储类型,此举可进一步减轻开发者负担,对刚接触ES的小白更是福音.\n\n当然,仅靠框架自动推断是不够的,我们仍然建议您在使用中尽量进行详细的配置,以便框架能自动创建出生产级的索引.举个例子,例如String类型字段,框架无法推断出您实际查询中对该字段是精确查询还是分词查询,所以它无法推断出该字段到底用keyword类型还是text类型,倘若是text类型,用户期望的分词器是什么? 这些都需要用户通过配置告诉框架,否则框架只能按默认值进行创建,届时将不能很好地完成您的期望.\n\n自动推断类型的优先级 < 用户通过注解指定的类型优先级\n\n自动推断映射表:\n\nJAVA ES\nbyte byte\nshort short\nint integer\nlong long\nfloat float\ndouble double\nBigDecimal keyword\nchar keyword\nString keyword\nboolean boolean\nDate date\nLocalDate date\nLocalDateTime date\nList text\n... ...\n\n> "自动挡"模式下的最佳实践示例:\n\n@Data\n@IndexName(shardsNum = 3,replicasNum = 2) // 可指定分片数,副本数,若缺省则默认均为1\npublic class Document {\n /**\n * es中的唯一id,如果你想自定义es中的id为你提供的id,比如MySQL中的id,请将注解中的type指定为customize,如此id便支持任意数据类型)\n */\n @IndexId(type = IdType.CUSTOMIZE)\n private Long id;\n /**\n * 文档标题,不指定类型默认被创建为keyword类型,可进行精确查询\n */\n private String title;\n /**\n * 文档内容,指定了类型及存储/查询分词器\n */\n @HighLight(mappingField="highlightContent")\n @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)\n private String content;\n /**\n * 作者 加@TableField注解,并指明strategy = FieldStrategy.NOT_EMPTY 表示更新的时候的策略为 创建者不为空字符串时才更新\n */\n @IndexField(strategy = FieldStrategy.NOT_EMPTY)\n private String creator;\n /**\n * 创建时间\n */\n @IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")\n private String gmtCreate;\n /**\n * es中实际不存在的字段,但模型中加了,为了不和es映射,可以在此类型字段上加上 注解@TableField,并指明exist=false\n */\n @IndexField(exist = false)\n private String notExistsField;\n /**\n * 地理位置经纬度坐标 例如: "40.13933715136454,116.63441990026217"\n */\n @IndexField(fieldType = FieldType.GEO_POINT)\n private String location;\n /**\n * 图形(例如圆心,矩形)\n */\n @IndexField(fieldType = FieldType.GEO_SHAPE)\n private String geoLocation;\n /**\n * 自定义字段名称\n */\n @IndexField(value = "wu-la")\n private String customField;\n\n /**\n * 高亮返回值被映射的字段\n */\n private String highlightContent;\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n\n\n\n# 模式三:手动模式(手动挡)\n\n在此模式下,索引的所有维护工作EE框架均不介入,由用户自行处理,EE提供了开箱即用的索引CRUD相关API,您可以选择使用该API手动维护索引,由于API高度完善,尽管是手动挡,但使用起来依旧简单到爆,一行代码搞定索引创建.当然您亦可通过es-head等工具来维护索引,总之在此模式下,您拥有更高的自由度,比较适合那些质疑EE框架的保守用户或追求极致灵活度的用户使用,类似汽车的手动挡,新手不建议使用此模式,老司机请随便.\n\n> 手动挡模式下,EE提供了如下API,供用户进行便捷调用:\n> \n> * indexName需要用户手动指定\n> * 对象 Wrapper 为 条件构造器\n\n // 获取索引信息\n GetIndexResponse getIndex();\n // 获取指定索引信息\n GetIndexResponse getIndex(String indexName);\n // 是否存在索引\n Boolean existsIndex(String indexName);\n // 根据实体及自定义注解一键创建索引\n Boolean createIndex();\n // 创建索引\n Boolean createIndex(LambdaEsIndexWrapper wrapper);\n // 更新索引\n Boolean updateIndex(LambdaEsIndexWrapper wrapper);\n // 删除指定索引\n Boolean deleteIndex(String indexName);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n\n\n\n\n> 上述API,我们仅演示创建索引,其它过于简单,不在这里赘述,如有需要可移步至源码test模块查看. 通过API手动创建索引,我们提供了两种方式\n\n-方式一:根据实体类及自定义注解一键创建(推荐),99.9%场景适用\n\n/**\n * 实体类信息\n**/\n@Data\n@IndexName(shardsNum = 3, replicasNum = 2, keepGlobalPrefix = true)\npublic class Document {\n /**\n * es中的唯一id,如果你想自定义es中的id为你提供的id,比如MySQL中的id,请将注解中的type指定为customize或直接在全局配置文件中指定,如此id便支持任意数据类型)\n */\n @IndexId(type = IdType.CUSTOMIZE)\n private String id;\n /**\n * 文档标题,不指定类型默认被创建为keyword类型,可进行精确查询\n */\n private String title;\n /**\n * 文档内容,指定了类型及存储/查询分词器\n */\n @HighLight(mappingField = "highlightContent")\n @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)\n private String content;\n // 省略其它字段...\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n\n\n @Test\n public void testCreateIndexByEntity() {\n // 然后通过该实体类的mapper直接一键创建,非常傻瓜级\n documentMapper.createIndex();\n }\n\n\n1\n2\n3\n4\n5\n\n\n提示\n\n实体类中的注解用法可参考注解章节,整体比较傻瓜级,和MP中的注解用法高度相似.\n\n-方式二:通过api创建,每个需要被索引的字段都需要处理,比较繁琐,但灵活性最好,支持所有es能支持的所有索引创建,供0.01%场景使用(不推荐)\n\n @Test\n public void testCreatIndex() {\n LambdaEsIndexWrapper wrapper = new LambdaEsIndexWrapper<>();\n // 此处简单起见 索引名称须保持和实体类名称一致,字母小写 后面章节会教大家更如何灵活配置和使用索引\n wrapper.indexName(Document.class.getSimpleName().toLowerCase());\n\n // 此处将文章标题映射为keyword类型(不支持分词),文档内容映射为text类型,可缺省\n // 支持分词查询,内容分词器可指定,查询分词器也可指定,,均可缺省或只指定其中之一,不指定则为ES默认分词器(standard)\n wrapper.mapping(Document::getTitle, FieldType.KEYWORD)\n .mapping(Document::getContent, FieldType.TEXT,Analyzer.IK_MAX_WORD,Analyzer.IK_MAX_WORD);\n \n // 如果上述简单的mapping不能满足你业务需求,可自定义mapping\n // wrapper.mapping(Map);\n\n // 设置分片及副本信息,3个shards,2个replicas,可缺省\n wrapper.settings(3,2);\n\n // 如果上述简单的settings不能满足你业务需求,可自定义settings\n // wrapper.settings(Settings);\n \n // 设置别名信息,可缺省\n String aliasName = "daily";\n wrapper.createAlias(aliasName);\n \n // 创建索引\n boolean isOk = documentMapper.createIndex(wrapper);\n Assert.assertTrue(isOk);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n\n\n温馨提示\n\n实体类中,id字段不需要创建索引,否则会报错.\n\n由于ES索引改动自动重建的特性,因此本接口设计时将创建索引所需的mapping,settings,alias信息三合一了,尽管其中每一项配置都可缺省,但我们仍建议您在创建索引前提前规划好以上信息,可以规避后续修改带来的不必要麻烦,若后续确有修改,您仍可以通过别名迁移的方式(推荐,可平滑过渡),或删除原索引重新创建的方式进行修改.\n\n\n# 配置启用模式\n\n以上三种模式的配置,您只需要在您项目的配置文件application.properties或application.yml中加入一行配置即可:\n\neasy-es:\n global-config:\n process_index_mode: smoothly #smoothly:平滑模式, not_smoothly:非平滑模式, manual:手动模式\n async-process-index-blocking: true # 异步处理索引是否阻塞主线程 默认阻塞\n distributed: false # 项目是否分布式环境部署,默认为true, 如果是单机运行可填false,将不加分布式锁,效率更高.\n\n\n1\n2\n3\n4\n5\n\n\n若缺省此行配置,则默认开启平滑模式.\n\n温馨提示\n\n * 运行测试模块时强烈建议开启异步处理索引阻塞主线程,否则测试用例跑完后,主线程退出,但异步线程可能还没跑完,可能出现死锁,若不幸出现死锁,删除ee-distribute-lock即可.\n * 生产环境或迁移数据量比较大的情况下,可以配置开启非阻塞,这样服务启动更快.\n * 以上三种模式,用户可根据实际需求灵活选择,自由体验,在使用过程中如有任何意见或建议可反馈给我们,我们将持续优化和改进,\n * EE在索引托管采用了策略+工厂设计模式,未来如果有更多更优模式,可以在不改动原代码的基础上轻松完成拓展,符合开闭原则,也欢迎各路开源爱好者贡献更多模式PR!\n * 我们将持续秉承把复杂留给框架,把易用留给用户这一理念,砥砺前行.\n\n上述所有API对应代码演示皆可参考源码test模块->test目录->index包下代码',normalizedContent:'前言\n\nes难用,索引首当其冲,索引的创建不仅复杂,而且难于维护,一旦索引有变动,就必须面对索引重建带来的服务停机和数据丢失等问题... 尽管es官方提供了索引别名机制来解决问题,但门槛依旧很高,步骤繁琐,在生产环境中由人工操作非常容易出现失误带来严重的问题. 为了解决这些痛点,easy-es提供了多种策略,将用户彻底从索引的维护中解放出来,我们提供了多种索引处理策略,来满足不同用户的个性化需求. 通过对索引的初体验,相信您也可以更深体会到ee的成熟度和易用性. 其中全自动平滑模式,首次采用全球领先的"哥哥你不用动,ee我全自动"的模式,索引的创建,更新,数据迁移等所有全生命周期均无需用户介入,由ee全自动完成,过程零停机,连索引类型都可智能自动推断,一条龙服务,包您满意.是全球开源首创,充分借鉴了jvm垃圾回收算法思想,史无前例,尽管网上已有平滑过渡方案,但并非全自动,过程依旧靠人工介入,我为ee代言,请放心将索引托管给ee,索引只有在彻底迁移成功才会删除旧索引,否则均不会对原有索引和数据造成影响,发生任何意外均能保留原索引和数据,所以安全系数很高.\n\n> 温馨提示:新手上路可尽量选择自动挡模式,老司机自动挡手动挡您请随意~\n\n\n# 模式一:自动托管之平滑模式(自动挡-雪地模式) 默认开启此模式\n\n> 在此模式下,索引的创建更新数据迁移等全生命周期用户均不需要任何操作即可完成,过程零停机,用户无感知,可实现在生产环境的平滑过渡,类似汽车的自动档-雪地模式,平稳舒适,彻底解放用户,尽情享受自动架势的乐趣! 需要值得特别注意的是,在自动托管模式下,系统会自动生成一条名为ee-distribute-lock的索引,该索引为框架内部使用,用户可忽略,若不幸因断电等其它因素极小概率下发生死锁,可删除该索引即可.另外,在使用时如碰到索引变更,原索引名称可能会被追加后缀_s0或_s1,不必慌张,这是全自动平滑迁移零停机的必经之路,索引后缀不影响使用,框架会自动激活该新索引.关于_s0和_s1后缀,在此模式下无法避免,因为要保留原索引数据迁移,又不能同时存在两个同名索引,凡是都是要付出代价的,如果您不认可此种处理方式,可继续往下看,总有一种适合您。\n\n其核心处理流程梳理如下图所示:\n\n\n# 模式二:自动托管之非平滑模式(自动挡-运动模式)\n\n在此模式下,索引额创建及更新由ee全自动异步完成,但不处理数据迁移工作,速度极快类似汽车的自动挡-运动模式,简单粗暴,弹射起步! 适合在开发及测试环境使用,当然如果您使用logstash等其它工具来同步数据,亦可在生产环境开启此模式,在此模式下不会出现_s0和_s1后缀,索引会保持原名称.\n\n\n\n提示\n\n以上两种自动模式中,索引信息主要依托于实体类,如果用户未对该实体类进行任何配置,ee依然能够根据字段类型智能推断出该字段在es中的存储类型,此举可进一步减轻开发者负担,对刚接触es的小白更是福音.\n\n当然,仅靠框架自动推断是不够的,我们仍然建议您在使用中尽量进行详细的配置,以便框架能自动创建出生产级的索引.举个例子,例如string类型字段,框架无法推断出您实际查询中对该字段是精确查询还是分词查询,所以它无法推断出该字段到底用keyword类型还是text类型,倘若是text类型,用户期望的分词器是什么? 这些都需要用户通过配置告诉框架,否则框架只能按默认值进行创建,届时将不能很好地完成您的期望.\n\n自动推断类型的优先级 < 用户通过注解指定的类型优先级\n\n自动推断映射表:\n\njava es\nbyte byte\nshort short\nint integer\nlong long\nfloat float\ndouble double\nbigdecimal keyword\nchar keyword\nstring keyword\nboolean boolean\ndate date\nlocaldate date\nlocaldatetime date\nlist text\n... ...\n\n> "自动挡"模式下的最佳实践示例:\n\n@data\n@indexname(shardsnum = 3,replicasnum = 2) // 可指定分片数,副本数,若缺省则默认均为1\npublic class document {\n /**\n * es中的唯一id,如果你想自定义es中的id为你提供的id,比如mysql中的id,请将注解中的type指定为customize,如此id便支持任意数据类型)\n */\n @indexid(type = idtype.customize)\n private long id;\n /**\n * 文档标题,不指定类型默认被创建为keyword类型,可进行精确查询\n */\n private string title;\n /**\n * 文档内容,指定了类型及存储/查询分词器\n */\n @highlight(mappingfield="highlightcontent")\n @indexfield(fieldtype = fieldtype.text, analyzer = analyzer.ik_smart, searchanalyzer = analyzer.ik_max_word)\n private string content;\n /**\n * 作者 加@tablefield注解,并指明strategy = fieldstrategy.not_empty 表示更新的时候的策略为 创建者不为空字符串时才更新\n */\n @indexfield(strategy = fieldstrategy.not_empty)\n private string creator;\n /**\n * 创建时间\n */\n @indexfield(fieldtype = fieldtype.date, dateformat = "yyyy-mm-dd hh:mm:ss||yyyy-mm-dd||epoch_millis")\n private string gmtcreate;\n /**\n * es中实际不存在的字段,但模型中加了,为了不和es映射,可以在此类型字段上加上 注解@tablefield,并指明exist=false\n */\n @indexfield(exist = false)\n private string notexistsfield;\n /**\n * 地理位置经纬度坐标 例如: "40.13933715136454,116.63441990026217"\n */\n @indexfield(fieldtype = fieldtype.geo_point)\n private string location;\n /**\n * 图形(例如圆心,矩形)\n */\n @indexfield(fieldtype = fieldtype.geo_shape)\n private string geolocation;\n /**\n * 自定义字段名称\n */\n @indexfield(value = "wu-la")\n private string customfield;\n\n /**\n * 高亮返回值被映射的字段\n */\n private string highlightcontent;\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n\n\n\n# 模式三:手动模式(手动挡)\n\n在此模式下,索引的所有维护工作ee框架均不介入,由用户自行处理,ee提供了开箱即用的索引crud相关api,您可以选择使用该api手动维护索引,由于api高度完善,尽管是手动挡,但使用起来依旧简单到爆,一行代码搞定索引创建.当然您亦可通过es-head等工具来维护索引,总之在此模式下,您拥有更高的自由度,比较适合那些质疑ee框架的保守用户或追求极致灵活度的用户使用,类似汽车的手动挡,新手不建议使用此模式,老司机请随便.\n\n> 手动挡模式下,ee提供了如下api,供用户进行便捷调用:\n> \n> * indexname需要用户手动指定\n> * 对象 wrapper 为 条件构造器\n\n // 获取索引信息\n getindexresponse getindex();\n // 获取指定索引信息\n getindexresponse getindex(string indexname);\n // 是否存在索引\n boolean existsindex(string indexname);\n // 根据实体及自定义注解一键创建索引\n boolean createindex();\n // 创建索引\n boolean createindex(lambdaesindexwrapper wrapper);\n // 更新索引\n boolean updateindex(lambdaesindexwrapper wrapper);\n // 删除指定索引\n boolean deleteindex(string indexname);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n\n\n\n\n> 上述api,我们仅演示创建索引,其它过于简单,不在这里赘述,如有需要可移步至源码test模块查看. 通过api手动创建索引,我们提供了两种方式\n\n-方式一:根据实体类及自定义注解一键创建(推荐),99.9%场景适用\n\n/**\n * 实体类信息\n**/\n@data\n@indexname(shardsnum = 3, replicasnum = 2, keepglobalprefix = true)\npublic class document {\n /**\n * es中的唯一id,如果你想自定义es中的id为你提供的id,比如mysql中的id,请将注解中的type指定为customize或直接在全局配置文件中指定,如此id便支持任意数据类型)\n */\n @indexid(type = idtype.customize)\n private string id;\n /**\n * 文档标题,不指定类型默认被创建为keyword类型,可进行精确查询\n */\n private string title;\n /**\n * 文档内容,指定了类型及存储/查询分词器\n */\n @highlight(mappingfield = "highlightcontent")\n @indexfield(fieldtype = fieldtype.text, analyzer = analyzer.ik_smart, searchanalyzer = analyzer.ik_max_word)\n private string content;\n // 省略其它字段...\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n\n\n @test\n public void testcreateindexbyentity() {\n // 然后通过该实体类的mapper直接一键创建,非常傻瓜级\n documentmapper.createindex();\n }\n\n\n1\n2\n3\n4\n5\n\n\n提示\n\n实体类中的注解用法可参考注解章节,整体比较傻瓜级,和mp中的注解用法高度相似.\n\n-方式二:通过api创建,每个需要被索引的字段都需要处理,比较繁琐,但灵活性最好,支持所有es能支持的所有索引创建,供0.01%场景使用(不推荐)\n\n @test\n public void testcreatindex() {\n lambdaesindexwrapper wrapper = new lambdaesindexwrapper<>();\n // 此处简单起见 索引名称须保持和实体类名称一致,字母小写 后面章节会教大家更如何灵活配置和使用索引\n wrapper.indexname(document.class.getsimplename().tolowercase());\n\n // 此处将文章标题映射为keyword类型(不支持分词),文档内容映射为text类型,可缺省\n // 支持分词查询,内容分词器可指定,查询分词器也可指定,,均可缺省或只指定其中之一,不指定则为es默认分词器(standard)\n wrapper.mapping(document::gettitle, fieldtype.keyword)\n .mapping(document::getcontent, fieldtype.text,analyzer.ik_max_word,analyzer.ik_max_word);\n \n // 如果上述简单的mapping不能满足你业务需求,可自定义mapping\n // wrapper.mapping(map);\n\n // 设置分片及副本信息,3个shards,2个replicas,可缺省\n wrapper.settings(3,2);\n\n // 如果上述简单的settings不能满足你业务需求,可自定义settings\n // wrapper.settings(settings);\n \n // 设置别名信息,可缺省\n string aliasname = "daily";\n wrapper.createalias(aliasname);\n \n // 创建索引\n boolean isok = documentmapper.createindex(wrapper);\n assert.asserttrue(isok);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n\n\n温馨提示\n\n实体类中,id字段不需要创建索引,否则会报错.\n\n由于es索引改动自动重建的特性,因此本接口设计时将创建索引所需的mapping,settings,alias信息三合一了,尽管其中每一项配置都可缺省,但我们仍建议您在创建索引前提前规划好以上信息,可以规避后续修改带来的不必要麻烦,若后续确有修改,您仍可以通过别名迁移的方式(推荐,可平滑过渡),或删除原索引重新创建的方式进行修改.\n\n\n# 配置启用模式\n\n以上三种模式的配置,您只需要在您项目的配置文件application.properties或application.yml中加入一行配置即可:\n\neasy-es:\n global-config:\n process_index_mode: smoothly #smoothly:平滑模式, not_smoothly:非平滑模式, manual:手动模式\n async-process-index-blocking: true # 异步处理索引是否阻塞主线程 默认阻塞\n distributed: false # 项目是否分布式环境部署,默认为true, 如果是单机运行可填false,将不加分布式锁,效率更高.\n\n\n1\n2\n3\n4\n5\n\n\n若缺省此行配置,则默认开启平滑模式.\n\n温馨提示\n\n * 运行测试模块时强烈建议开启异步处理索引阻塞主线程,否则测试用例跑完后,主线程退出,但异步线程可能还没跑完,可能出现死锁,若不幸出现死锁,删除ee-distribute-lock即可.\n * 生产环境或迁移数据量比较大的情况下,可以配置开启非阻塞,这样服务启动更快.\n * 以上三种模式,用户可根据实际需求灵活选择,自由体验,在使用过程中如有任何意见或建议可反馈给我们,我们将持续优化和改进,\n * ee在索引托管采用了策略+工厂设计模式,未来如果有更多更优模式,可以在不改动原代码的基础上轻松完成拓展,符合开闭原则,也欢迎各路开源爱好者贡献更多模式pr!\n * 我们将持续秉承把复杂留给框架,把易用留给用户这一理念,砥砺前行.\n\n上述所有api对应代码演示皆可参考源码test模块->test目录->index包下代码',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"混合查询",frontmatter:{title:"混合查询",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/a19563/"},regularPath:"/v1.0.0/030.%E6%8B%93%E5%B1%95%E5%8A%9F%E8%83%BD/010.%E6%B7%B7%E5%90%88%E6%9F%A5%E8%AF%A2.html",relativePath:"v1.0.0/030.拓展功能/010.混合查询.md",key:"v-7470134b",path:"/pages/a19563/",headers:[{level:2,title:"何为混合查询?",slug:"何为混合查询",normalizedTitle:"何为混合查询?",charIndex:2},{level:2,title:"为什么要有混合查询?",slug:"为什么要有混合查询",normalizedTitle:"为什么要有混合查询?",charIndex:100},{level:2,title:"如何使用混合查询?",slug:"如何使用混合查询",normalizedTitle:"如何使用混合查询?",charIndex:320},{level:2,title:"结语",slug:"结语",normalizedTitle:"结语",charIndex:2053}],headersStr:"何为混合查询? 为什么要有混合查询? 如何使用混合查询? 结语",content:'# 何为混合查询?\n\n简单理解,就是一半采用EE的语法,一半采用RestHighLevelClient的语法,类似"油电混动",相信你会爱上这种"油电混动"模式,因为它结合了两种模式的优点!\n\n\n# 为什么要有混合查询?\n\n因为EE目前还没有做到对RestHighLevelClient的功能100%覆盖,目前开源初期,仅覆盖了RestHighLevelClient约90%左右的功能,99%的核心高频使用功能,如此就不可避免的会出现个别场景下,EE不能满足某个特殊需求,此时对EE框架进行二次开发或直接将该需求提给EE作者,在时间上都无法满足开发者需求,有些需求可能产品经理要的比较紧,那么此时,您就可以通过混合查询来解决窘境.\n\n\n# 如何使用混合查询?\n\n在我没提供此篇文档时,尽管我提供了混合查询的API和简单介绍,但很多人还不知道有此功能,更不知道该如何使用,所以这里我以一个具体的案例,给大家演示如何使用混合查询,供大家参考,主公们别担心篇幅多,其实非常非常简单,只是我教程写的细.\n\n背景\n\n用户"向阳"微信向我反馈,说目前EE尚不支持查询按照距给定点的位置由近及远排序. 实际开发中,此场景可以被应用到打车时"乘客下单,要求优先派单给周围3公里内离我最近的司机",然后该乘客是个美女,担心自身安全问题,又多加了几个要求,比如司机必须是女性,驾龄大于3年,商务型车子等...\n\n以上面打车的场景为例,我们来看下用EE怎么查询?上面查询可以分为两部分\n\n * EE支持的常规查询:如周围3公里内,司机性别为女,查询驾龄>=3年...\n * EE不支持的非常规查询:按照复杂的排序规则排序(写此篇文档时是不支持的,现已支持,但这不重要,本篇仅以此来演示混合查询的使用)\n\n对于支持的部分,我们可以直接调用EE,由EE先构建一个SearchSourceBuilder出来\n\n// 假设该乘客所在位置经纬度为 31.256224D, 121.462311D\nLambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\nwrapper.geoDistance(Driver::getLocation, 3.0, DistanceUnit.KILOMETERS, new GeoPoint(31.256224D, 121.462311D))\n .eq(Driver::getGender,"女")\n .ge(Driver::getDriverAge,3)\n .eq(Driver::getCarModel,"商务车");\nSearchSourceBuilder searchSourceBuilder = driverMapper.getSearchSourceBuilder(wrapper);\n\n\n1\n2\n3\n4\n5\n6\n7\n\n\n对于不支持的语句,可以继续用RestHighLevelClient的语法进行封装,封装好了,直接调用EE提供的原生查询接口,就可以完成整个查询.\n\nSearchRequest searchRequest = new SearchRequest("索引名");\n// 此处的searchSourceBuilder由上面EE构建而来,我们继续对其追加排序参数\nsearchSourceBuilder.sort(\n new GeoDistanceSortBuilder("location", 31.256224D, 121.462311D)\n .order(SortOrder.DESC)\n .unit(DistanceUnit.KILOMETERS)\n .geoDistance(GeoDistance.ARC)\n);\nsearchRequest.source(searchSourceBuilder);\nSearchResponse searchResponse = driverMapper.search(searchRequest, RequestOptions.DEFAULT);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n如此您便可以既享受到了EE帮您生成好的基本查询,又可完成EE暂未支持的功能,只需要不太多的代码(相比直接RestHighLevelClient,仍能节省大量代码)就可以达成您的目标,和当下纯电动汽车尚未完全发展成熟下的一种折中方案---油电混动有着异曲同工之妙.\n\n当然,如果您不习惯使用这种模式,您仍可以直接使用原生查询,所以您大可以无忧无虑的使用EE,我们已经为您想好了各种兜底的方案和退路,无忧售后!如果您也认可这种模式,不妨给作者点个赞吧,为了让EE的用户爽,作者那糟老头子可谓是煞费苦心!\n\n\n# 结语\n\n因为ES官方提供的RestHighLevel支持的功能实在是过于繁多,尽管我目前仍在马不停蹄的集成各种新的功能,以及修复用户反馈的问题,优化既有代码性能,但仍不可避免地会出现有些许功能不能满足您当前需求,请各位主公们见谅,EE才诞生三个月,不可能做到十全十美,请给我们一点时间,这些所谓的不足,都会被解决,就像新能源车在未来终会逐步取代燃油车,那些所谓的问题,在未来都不是问题,乌拉!',normalizedContent:'# 何为混合查询?\n\n简单理解,就是一半采用ee的语法,一半采用resthighlevelclient的语法,类似"油电混动",相信你会爱上这种"油电混动"模式,因为它结合了两种模式的优点!\n\n\n# 为什么要有混合查询?\n\n因为ee目前还没有做到对resthighlevelclient的功能100%覆盖,目前开源初期,仅覆盖了resthighlevelclient约90%左右的功能,99%的核心高频使用功能,如此就不可避免的会出现个别场景下,ee不能满足某个特殊需求,此时对ee框架进行二次开发或直接将该需求提给ee作者,在时间上都无法满足开发者需求,有些需求可能产品经理要的比较紧,那么此时,您就可以通过混合查询来解决窘境.\n\n\n# 如何使用混合查询?\n\n在我没提供此篇文档时,尽管我提供了混合查询的api和简单介绍,但很多人还不知道有此功能,更不知道该如何使用,所以这里我以一个具体的案例,给大家演示如何使用混合查询,供大家参考,主公们别担心篇幅多,其实非常非常简单,只是我教程写的细.\n\n背景\n\n用户"向阳"微信向我反馈,说目前ee尚不支持查询按照距给定点的位置由近及远排序. 实际开发中,此场景可以被应用到打车时"乘客下单,要求优先派单给周围3公里内离我最近的司机",然后该乘客是个美女,担心自身安全问题,又多加了几个要求,比如司机必须是女性,驾龄大于3年,商务型车子等...\n\n以上面打车的场景为例,我们来看下用ee怎么查询?上面查询可以分为两部分\n\n * ee支持的常规查询:如周围3公里内,司机性别为女,查询驾龄>=3年...\n * ee不支持的非常规查询:按照复杂的排序规则排序(写此篇文档时是不支持的,现已支持,但这不重要,本篇仅以此来演示混合查询的使用)\n\n对于支持的部分,我们可以直接调用ee,由ee先构建一个searchsourcebuilder出来\n\n// 假设该乘客所在位置经纬度为 31.256224d, 121.462311d\nlambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\nwrapper.geodistance(driver::getlocation, 3.0, distanceunit.kilometers, new geopoint(31.256224d, 121.462311d))\n .eq(driver::getgender,"女")\n .ge(driver::getdriverage,3)\n .eq(driver::getcarmodel,"商务车");\nsearchsourcebuilder searchsourcebuilder = drivermapper.getsearchsourcebuilder(wrapper);\n\n\n1\n2\n3\n4\n5\n6\n7\n\n\n对于不支持的语句,可以继续用resthighlevelclient的语法进行封装,封装好了,直接调用ee提供的原生查询接口,就可以完成整个查询.\n\nsearchrequest searchrequest = new searchrequest("索引名");\n// 此处的searchsourcebuilder由上面ee构建而来,我们继续对其追加排序参数\nsearchsourcebuilder.sort(\n new geodistancesortbuilder("location", 31.256224d, 121.462311d)\n .order(sortorder.desc)\n .unit(distanceunit.kilometers)\n .geodistance(geodistance.arc)\n);\nsearchrequest.source(searchsourcebuilder);\nsearchresponse searchresponse = drivermapper.search(searchrequest, requestoptions.default);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n如此您便可以既享受到了ee帮您生成好的基本查询,又可完成ee暂未支持的功能,只需要不太多的代码(相比直接resthighlevelclient,仍能节省大量代码)就可以达成您的目标,和当下纯电动汽车尚未完全发展成熟下的一种折中方案---油电混动有着异曲同工之妙.\n\n当然,如果您不习惯使用这种模式,您仍可以直接使用原生查询,所以您大可以无忧无虑的使用ee,我们已经为您想好了各种兜底的方案和退路,无忧售后!如果您也认可这种模式,不妨给作者点个赞吧,为了让ee的用户爽,作者那糟老头子可谓是煞费苦心!\n\n\n# 结语\n\n因为es官方提供的resthighlevel支持的功能实在是过于繁多,尽管我目前仍在马不停蹄的集成各种新的功能,以及修复用户反馈的问题,优化既有代码性能,但仍不可避免地会出现有些许功能不能满足您当前需求,请各位主公们见谅,ee才诞生三个月,不可能做到十全十美,请给我们一点时间,这些所谓的不足,都会被解决,就像新能源车在未来终会逐步取代燃油车,那些所谓的问题,在未来都不是问题,乌拉!',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"分页查询",frontmatter:{title:"分页查询",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/0cf11e/"},regularPath:"/v1.0.0/030.%E6%8B%93%E5%B1%95%E5%8A%9F%E8%83%BD/030.%E5%88%86%E9%A1%B5%E6%9F%A5%E8%AF%A2.html",relativePath:"v1.0.0/030.拓展功能/030.分页查询.md",key:"v-3d8b3548",path:"/pages/0cf11e/",headers:[{level:2,title:"浅分页",slug:"浅分页",normalizedTitle:"浅分页",charIndex:2},{level:2,title:"滚动查询",slug:"滚动查询",normalizedTitle:"滚动查询",charIndex:705}],headersStr:"浅分页 滚动查询",content:'# 浅分页\n\n // 物理分页\n PageInfo pageQuery(LambdaEsQueryWrapper wrapper, Integer pageNum, Integer pageSize);\n\n\n1\n2\n\n\n温馨提示\n\n无需集成任何插件,即可使用分页查询,本查询属于物理分页,基于size+from的浅分页模式,如您需要 在一些高阶语法的使用场景中,目前已知的有聚合字段的返回,我们分页器尚不能支持,需要您自己封装分页,其它场景基本都能完美支持,用起来无比简单. 注意PageInfo是由本框架提供的,如果你项目中已经有目前最受欢迎的开源分页插件PageHelper,请在引入包的时候注意别引入错误了,EE采用和PageHelper一样的返回字段,您无需担心字段名称不统一带来的额外工作量.\n\n> 使用示例:\n\n @Test\n public void testPageQuery() {\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.match(Document::getTitle, "老汉");\n PageInfo documentPageInfo = documentMapper.pageQuery(wrapper,1,10);\n System.out.println(documentPageInfo);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n\n\n\n# 滚动查询\n\n // 滚动查询\n SearchResponse scroll(SearchScrollRequest searchScrollRequest, RequestOptions requestOptions) throws IOException;\n\n\n1\n2\n\n\n提示\n\n若您有需要进行超大量的数据查询和分页需求,可以采用滚动查询来实现,关于滚动查询,我们实际上已经提供了getSearchSourceBuilderAPI用于快速构造出SearchSourceBuilder,配合上面提供的滚动查询API,助力您快速实现滚动查询。 当然我们对滚动查询的支持不会止步于此,后期还会持续优化,针对分页查询数据量超过一定阈值时自动开启滚动查询分页,且用户可以通过配置选择采用哪种分页模式,敬请期待.',normalizedContent:'# 浅分页\n\n // 物理分页\n pageinfo pagequery(lambdaesquerywrapper wrapper, integer pagenum, integer pagesize);\n\n\n1\n2\n\n\n温馨提示\n\n无需集成任何插件,即可使用分页查询,本查询属于物理分页,基于size+from的浅分页模式,如您需要 在一些高阶语法的使用场景中,目前已知的有聚合字段的返回,我们分页器尚不能支持,需要您自己封装分页,其它场景基本都能完美支持,用起来无比简单. 注意pageinfo是由本框架提供的,如果你项目中已经有目前最受欢迎的开源分页插件pagehelper,请在引入包的时候注意别引入错误了,ee采用和pagehelper一样的返回字段,您无需担心字段名称不统一带来的额外工作量.\n\n> 使用示例:\n\n @test\n public void testpagequery() {\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.match(document::gettitle, "老汉");\n pageinfo documentpageinfo = documentmapper.pagequery(wrapper,1,10);\n system.out.println(documentpageinfo);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n\n\n\n# 滚动查询\n\n // 滚动查询\n searchresponse scroll(searchscrollrequest searchscrollrequest, requestoptions requestoptions) throws ioexception;\n\n\n1\n2\n\n\n提示\n\n若您有需要进行超大量的数据查询和分页需求,可以采用滚动查询来实现,关于滚动查询,我们实际上已经提供了getsearchsourcebuilderapi用于快速构造出searchsourcebuilder,配合上面提供的滚动查询api,助力您快速实现滚动查询。 当然我们对滚动查询的支持不会止步于此,后期还会持续优化,针对分页查询数据量超过一定阈值时自动开启滚动查询分页,且用户可以通过配置选择采用哪种分页模式,敬请期待.',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"CRUD接口",frontmatter:{title:"CRUD接口",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/c5999a/"},regularPath:"/v1.0.0/020.%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD/020.CRUD%E6%8E%A5%E5%8F%A3.html",relativePath:"v1.0.0/020.核心功能/020.CRUD接口.md",key:"v-7191526a",path:"/pages/c5999a/",headers:[{level:2,title:"Mapper CRUD 接口",slug:"mapper-crud-接口",normalizedTitle:"mapper crud 接口",charIndex:2},{level:3,title:"Insert",slug:"insert",normalizedTitle:"insert",charIndex:424},{level:5,title:"参数说明",slug:"参数说明",normalizedTitle:"参数说明",charIndex:543},{level:3,title:"Delete",slug:"delete",normalizedTitle:"delete",charIndex:933},{level:5,title:"参数说明",slug:"参数说明-2",normalizedTitle:"参数说明",charIndex:543},{level:3,title:"Update",slug:"update",normalizedTitle:"update",charIndex:1421},{level:5,title:"参数说明",slug:"参数说明-3",normalizedTitle:"参数说明",charIndex:543},{level:3,title:"Select",slug:"select",normalizedTitle:"select",charIndex:1818},{level:5,title:"参数说明",slug:"参数说明-4",normalizedTitle:"参数说明",charIndex:543}],headersStr:"Mapper CRUD 接口 Insert 参数说明 Delete 参数说明 Update 参数说明 Select 参数说明",content:"# Mapper CRUD 接口\n\n说明\n\n * 通用 CRUD 封装BaseEsMapper 接口,为 Easy-Es 启动时自动解析实体对象关系映射转换为 EE 内部对象注入容器\n * 泛型 T 为任意实体对象\n * insert接口需要区别于MP,具体可看下面insert文档\n * 参数 Serializable 为任意类型主键 Easy-Es 不推荐使用复合主键约定每个索引都有自己的唯一 id 主键\n * 对象 Wrapper 为 条件构造器\n * 针对实体对象T中的 get和set 方法,我们推荐您使用Lombok插件生成,若您采用IDEA自带插件生成,通过Lambda风格获取的字段名称时,会导致部分驼峰命名的字段无法获取正确的字段名. 比如有字段名称叫eName,采用Lombok生成的的get方法为getEName(),但IDEA生成的为geteName(),如此框架底层解析字段名称时就会报错,MP也存在同样问题.\n\n\n# Insert\n\n// 插入一条记录\nInteger insert(T entity);\n\n// 批量插入多条记录\nInteger insertBatch(Collection entityList)\n\n\n1\n2\n3\n4\n5\n\n\n# 参数说明\n\n类型 参数名 描述\nT entity 实体对象\nCollection entityList 实体对象集合\n\n特别注意\n\n * 如果您在insert时传入的entity有id并且该id对应数据已存在,则此次insert实际效果为更新该id对应的数据,并且更新不计入insert接口最后返回的成功总条数.\n * 当insert接口如上所述,触发了数据更新逻辑,本次更新字段和全局配置的策略(如NOT_NULL/NOT_EMPTY)等均不生效,若您期望策略生效,可以调用update接口而非insert接口.\n * 插入后如需id值可直接从entity中取,用法和MP中一致,批量插入亦可直接从原对象中获取插入成功后的数据id,以上接口返回Integer为成功条数.\n\n\n# Delete\n\n // 根据 ID 删除\nInteger deleteById(Serializable id);\n\n// 根据 entity 条件,删除记录\nInteger delete(LambdaEsQueryWrapper wrapper);\n\n// 删除(根据ID 批量删除)\nInteger deleteBatchIds(Collection idList);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n# 参数说明\n\n类型 参数名 描述\nWrapper queryWrapper 实体包装类 QueryWrapper\nSerializable id 主键ID\nCollection idList 主键ID列表\n\n\n# Update\n\n//根据 ID 更新\nInteger updateById(T entity);\n\n// 根据ID 批量更新\nInteger updateBatchByIds(Collection entityList);\n\n// 根据动态条件 更新记录\nInteger update(T entity, LambdaEsUpdateWrapper updateWrapper);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n# 参数说明\n\n类型 参数名 描述\nT entity 实体对象\nWrapper updateWrapper 实体对象封装操作类 UpdateWrapper\nCollection entityList 实体对象集合\n\n\n# Select\n\n\t// 获取总数\n Long selectCount(LambdaEsQueryWrapper wrapper);\n \t// 根据 ID 查询\n T selectById(Serializable id);\n\t// 查询(根据ID 批量查询)\n List selectBatchIds(Collection idList);\n\t// 根据动态查询条件,查询一条记录 若存在多条记录 会报错\n T selectOne(LambdaEsQueryWrapper wrapper);\n // 根据动态查询条件,查询全部记录\n List selectList(LambdaEsQueryWrapper wrapper);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n# 参数说明\n\n类型 参数名 描述\nWrapper queryWrapper 实体包装类 QueryWrapper\nSerializable id 主键ID\nCollection idList 主键ID列表\n\n提示\n\n * CRUD接口用法基本与MP一致\n * 用户需要继承的Mapper为BaseEsMapper,而非BaseMapper\n * EE没有提供Service层,而是把MP中一些Service层的方法直接下沉到Mapper层了,用户用起来会更方便",normalizedContent:"# mapper crud 接口\n\n说明\n\n * 通用 crud 封装baseesmapper 接口,为 easy-es 启动时自动解析实体对象关系映射转换为 ee 内部对象注入容器\n * 泛型 t 为任意实体对象\n * insert接口需要区别于mp,具体可看下面insert文档\n * 参数 serializable 为任意类型主键 easy-es 不推荐使用复合主键约定每个索引都有自己的唯一 id 主键\n * 对象 wrapper 为 条件构造器\n * 针对实体对象t中的 get和set 方法,我们推荐您使用lombok插件生成,若您采用idea自带插件生成,通过lambda风格获取的字段名称时,会导致部分驼峰命名的字段无法获取正确的字段名. 比如有字段名称叫ename,采用lombok生成的的get方法为getename(),但idea生成的为getename(),如此框架底层解析字段名称时就会报错,mp也存在同样问题.\n\n\n# insert\n\n// 插入一条记录\ninteger insert(t entity);\n\n// 批量插入多条记录\ninteger insertbatch(collection entitylist)\n\n\n1\n2\n3\n4\n5\n\n\n# 参数说明\n\n类型 参数名 描述\nt entity 实体对象\ncollection entitylist 实体对象集合\n\n特别注意\n\n * 如果您在insert时传入的entity有id并且该id对应数据已存在,则此次insert实际效果为更新该id对应的数据,并且更新不计入insert接口最后返回的成功总条数.\n * 当insert接口如上所述,触发了数据更新逻辑,本次更新字段和全局配置的策略(如not_null/not_empty)等均不生效,若您期望策略生效,可以调用update接口而非insert接口.\n * 插入后如需id值可直接从entity中取,用法和mp中一致,批量插入亦可直接从原对象中获取插入成功后的数据id,以上接口返回integer为成功条数.\n\n\n# delete\n\n // 根据 id 删除\ninteger deletebyid(serializable id);\n\n// 根据 entity 条件,删除记录\ninteger delete(lambdaesquerywrapper wrapper);\n\n// 删除(根据id 批量删除)\ninteger deletebatchids(collection idlist);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n# 参数说明\n\n类型 参数名 描述\nwrapper querywrapper 实体包装类 querywrapper\nserializable id 主键id\ncollection idlist 主键id列表\n\n\n# update\n\n//根据 id 更新\ninteger updatebyid(t entity);\n\n// 根据id 批量更新\ninteger updatebatchbyids(collection entitylist);\n\n// 根据动态条件 更新记录\ninteger update(t entity, lambdaesupdatewrapper updatewrapper);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n# 参数说明\n\n类型 参数名 描述\nt entity 实体对象\nwrapper updatewrapper 实体对象封装操作类 updatewrapper\ncollection entitylist 实体对象集合\n\n\n# select\n\n\t// 获取总数\n long selectcount(lambdaesquerywrapper wrapper);\n \t// 根据 id 查询\n t selectbyid(serializable id);\n\t// 查询(根据id 批量查询)\n list selectbatchids(collection idlist);\n\t// 根据动态查询条件,查询一条记录 若存在多条记录 会报错\n t selectone(lambdaesquerywrapper wrapper);\n // 根据动态查询条件,查询全部记录\n list selectlist(lambdaesquerywrapper wrapper);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n# 参数说明\n\n类型 参数名 描述\nwrapper querywrapper 实体包装类 querywrapper\nserializable id 主键id\ncollection idlist 主键id列表\n\n提示\n\n * crud接口用法基本与mp一致\n * 用户需要继承的mapper为baseesmapper,而非basemapper\n * ee没有提供service层,而是把mp中一些service层的方法直接下沉到mapper层了,用户用起来会更方便",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"嵌套类型",frontmatter:{title:"嵌套类型",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/05702c/"},regularPath:"/v1.0.0/030.%E6%8B%93%E5%B1%95%E5%8A%9F%E8%83%BD/040.%E5%B5%8C%E5%A5%97%E7%B1%BB%E5%9E%8B.html",relativePath:"v1.0.0/030.拓展功能/040.嵌套类型.md",key:"v-f04c882c",path:"/pages/05702c/",headers:[{level:2,title:"1.前套类型创建索引",slug:"_1-前套类型创建索引",normalizedTitle:"1.前套类型创建索引",charIndex:409},{level:2,title:"嵌套类型 CRUD",slug:"嵌套类型-crud",normalizedTitle:"嵌套类型 crud",charIndex:1106}],headersStr:"1.前套类型创建索引 嵌套类型 CRUD",content:'前言\n\nES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对嵌套文档的支持,实际上也是采取了一种投机取巧的方式实现的.\n\n嵌套的文档均以独立的文档存入,然后添加关联关系,这就会导致,一条嵌套类型的文档,底层实际上存储了N条数据,而且更新时会株连九族式更新,导致效率低下,而且对于嵌套类型,其查询功能也受限,不支持聚合排序等功能,因此我们并不建议您在实际开发中使用这种类型.\n\nES本身更适合"大宽表"模式,不要带着传统关系型数据库那种思维方式去使用ES,我们完全可以通过把多张表中的字段和内容合并到一张表(一个索引)中,来完成期望功能,尽可能规避嵌套类型的使用,不仅效率高,功能也更强大.\n\n当然存在即合理,也确实有个别场景下,不可避免的会用到嵌套类型,作为全球首屈一指的ES-ORM框架,我们对此也提供了支持,用户可以不用,但我们不能没有!\n\n\n# 1.前套类型创建索引\n\n * 自动挡模式:\n\n public class Document{\n // 省略其它字段...\n /**\n * 嵌套类型 \n */\n @TableField(fieldType = FieldType.NESTED, nestedClass = User.class)\n private List users;\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n注意\n\n务必像上面示例一样指定类型为fieldType=NESTED及其nestedClass,否则会导致框架无法正常运行\n\n * 手动挡模式\n * 方式一: 按照自动挡模式,配置好注解,然后直接调用一键生成API生成索引 (v0.9.30+ 版本支持)\n\ndocumentMapper.createIndex();\n\n\n1\n\n * 方式二: 纯手工打造,所有字段自己安排一遍,不推荐,麻烦得很\n\n LambdaEsIndexWrapper wrapper = new LambdaEsIndexWrapper<>();\n // 省略其它代码\n wrapper.mapping(Document::getUsers, FieldType.NESTED)\n\n\n1\n2\n3\n\n\n注意\n\n在手动挡模式下,除了要通过注解@TableField指定nestedClass外,还需要通过wrapper指定该嵌套字段,然后完成索引创建/更新\n\n\n# 嵌套类型 CRUD\n\n其中增删改与非嵌套类型使用无差异,这里不赘述\n\n查询示例:\n\n @Test\n public void testNestedMatch() {\n // 嵌套查询 查询内容匹配人才且嵌套数据中用户名匹配"用户1"的数据\n // 其中嵌套类的字段名称获取我们提供了工具类FieldUtils.val帮助用户通过lambda函数式获取字段名称,当然如果不想用也可以直接传字符串\n EsWrappers.lambdaQuery(Document.class)\n .match(Document::getContent, "人才");\n .nestedMatch(Document::getUsers, FieldUtils.val(User::getUsername), "用户");\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n相关demo可参考源码的test模块->test目录->nested包',normalizedContent:'前言\n\nes底层是lucene,由于lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在lucene中,es对嵌套文档的支持,实际上也是采取了一种投机取巧的方式实现的.\n\n嵌套的文档均以独立的文档存入,然后添加关联关系,这就会导致,一条嵌套类型的文档,底层实际上存储了n条数据,而且更新时会株连九族式更新,导致效率低下,而且对于嵌套类型,其查询功能也受限,不支持聚合排序等功能,因此我们并不建议您在实际开发中使用这种类型.\n\nes本身更适合"大宽表"模式,不要带着传统关系型数据库那种思维方式去使用es,我们完全可以通过把多张表中的字段和内容合并到一张表(一个索引)中,来完成期望功能,尽可能规避嵌套类型的使用,不仅效率高,功能也更强大.\n\n当然存在即合理,也确实有个别场景下,不可避免的会用到嵌套类型,作为全球首屈一指的es-orm框架,我们对此也提供了支持,用户可以不用,但我们不能没有!\n\n\n# 1.前套类型创建索引\n\n * 自动挡模式:\n\n public class document{\n // 省略其它字段...\n /**\n * 嵌套类型 \n */\n @tablefield(fieldtype = fieldtype.nested, nestedclass = user.class)\n private list users;\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n注意\n\n务必像上面示例一样指定类型为fieldtype=nested及其nestedclass,否则会导致框架无法正常运行\n\n * 手动挡模式\n * 方式一: 按照自动挡模式,配置好注解,然后直接调用一键生成api生成索引 (v0.9.30+ 版本支持)\n\ndocumentmapper.createindex();\n\n\n1\n\n * 方式二: 纯手工打造,所有字段自己安排一遍,不推荐,麻烦得很\n\n lambdaesindexwrapper wrapper = new lambdaesindexwrapper<>();\n // 省略其它代码\n wrapper.mapping(document::getusers, fieldtype.nested)\n\n\n1\n2\n3\n\n\n注意\n\n在手动挡模式下,除了要通过注解@tablefield指定nestedclass外,还需要通过wrapper指定该嵌套字段,然后完成索引创建/更新\n\n\n# 嵌套类型 crud\n\n其中增删改与非嵌套类型使用无差异,这里不赘述\n\n查询示例:\n\n @test\n public void testnestedmatch() {\n // 嵌套查询 查询内容匹配人才且嵌套数据中用户名匹配"用户1"的数据\n // 其中嵌套类的字段名称获取我们提供了工具类fieldutils.val帮助用户通过lambda函数式获取字段名称,当然如果不想用也可以直接传字符串\n eswrappers.lambdaquery(document.class)\n .match(document::getcontent, "人才");\n .nestedmatch(document::getusers, fieldutils.val(user::getusername), "用户");\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n相关demo可参考源码的test模块->test目录->nested包',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"父子类型",frontmatter:{title:"父子类型",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/0bbd7e/"},regularPath:"/v1.0.0/030.%E6%8B%93%E5%B1%95%E5%8A%9F%E8%83%BD/050.%E7%88%B6%E5%AD%90%E7%B1%BB%E5%9E%8B.html",relativePath:"v1.0.0/030.拓展功能/050.父子类型.md",key:"v-693db66d",path:"/pages/0bbd7e/",headers:[{level:2,title:"1父子类型创建索引",slug:"_1父子类型创建索引",normalizedTitle:"1父子类型创建索引",charIndex:442},{level:2,title:"父子类型 CRUD",slug:"父子类型-crud",normalizedTitle:"父子类型 crud",charIndex:1823}],headersStr:"1父子类型创建索引 父子类型 CRUD",content:'前言\n\nES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的.\n\n父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有减少文档数量,而且增加了父子绑定关系,会导致查询效率低下,因此我们并不建议您在实际开发中使用父子类型.\n\nES本身更适合"大宽表"模式,不要带着传统关系型数据库那种思维方式去使用ES,我们完全可以通过把多张表中的字段和内容合并到一张表(一个索引)中,来完成期望功能,尽可能规避父子类型的使用,不仅效率高,功能也更强大.\n\n当然存在即合理,也确实有个别场景下,不可避免的会用到父子类型,作为全球首屈一指的ES-ORM框架,我们对此也提供了支持,用户可以不用,但我们不能没有!\n\n关于父子类型和嵌套类型的选择:如果对文档的写多于读,那么建议你选择父子类型,如果文档读多于写, 那么请选择嵌套类型.\n\n\n# 1父子类型创建索引\n\n * 自动挡模式:\n\n /**\n * 父文档\n */\n @TableName(childClass = Comment.class)\n public class Document{\n // 省略其它字段...\n /**\n * 须通过注解在父文档及子文档的实体类中指明其类型为Join,及其父名称和子名称,这里的JoinField类框架已内置,无需重复造轮子\n * JoinField类全路径为cn.easyes.common.params.JoinField,如果你非要自己造轮子,也支持,那么需要在@TableField注解中指明joinFieldClass=你造的轮子\n */\n @TableField(fieldType = FieldType.JOIN, parentName = "document", childName = "comment")\n private JoinField joinField;\n }\n /**\n * 子文档\n */\n @TableName(child = true)\n public class Comment {\n // 省略其它字段...\n /**\n * 父子关系字段 须通过注解在父文档及子文档的实体类中指明其类型为Join,子文档中的父子关系可省略\n */\n @TableField(fieldType = FieldType.JOIN)\n private JoinField joinField;\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n\n\n> 注意: 务必像上面示例一样,在父文档的类上加注解@TableName指明其子文档类,在子文档的类上加注解@TableName,指明child=true,并在JoinField类的@TableField注解中指定类型为fieldType=JOIN及其parentName,childName,否则会导致框架无法正常工作\n\n * 手动挡模式\n * 方式一: 按照自动挡模式,配置好注解,然后直接调用一键生成API生成索引 (v0.9.30+ 版本支持)\n\ndocumentMapper.createIndex();\n\n\n1\n\n * 方式二: 纯手工打造,所有字段自己安排一遍,不推荐,麻烦得很\n\n LambdaEsIndexWrapper wrapper = new LambdaEsIndexWrapper<>();\n // 省略其它代码\n wrapper.join("joinField", "document", "comment");\n\n\n1\n2\n3\n\n\n注意\n\n在手动挡模式下,主类上的注解依然不能少,框架运行时需要用到父子关系,在方式二还需要通过wrapper指定该嵌套字段,然后完成索引创建/更新\n\n\n# 父子类型 CRUD\n\n注意父子类型由于都是独立的文档,独立的实体类,所以各自都需要有各自的mapper\n\nCRUD示例:\n\n @Test\n public void testInsert() {\n // 测试新增父子文档,此处开启自动挡模式,父子类型索引已被自动处理\n // 新新增父文档,然后再插入子文档\n Document document = new Document();\n document.setId("1");\n document.setTitle("父文档的标题");\n document.setContent("父文档的内容");\n JoinField joinField = new JoinField();\n joinField.setName("document");\n document.setJoinField(joinField);\n documentMapper.insert(document);\n\n // 插入子文档\n Comment comment = new Comment();\n comment.setId("2");\n comment.setCommentContent("文档的评论1");\n\n // 这里特别注意,子文档必须指定其父文档的id,否则找不到父文档别怪我没提醒\n joinField.setParent("1");\n joinField.setName("comment");\n comment.setJoinField(joinField);\n commentMapper.insert(comment);\n\n // 插入子文档2\n Comment comment1 = new Comment();\n comment1.setId("3");\n comment1.setCommentContent("文档的评论2");\n comment1.setJoinField(joinField);\n commentMapper.insert(comment1);\n }\n\n @Test\n public void testSelect() {\n // 温馨提示,下面wrapper中的type实际上就是JoinField字段注解@TableField中指定的parentName和childName,与原生语法是一致的\n // case1: hasChild查询,返回的是相关的父文档 所以查询用父文档实体及其mapper\n LambdaEsQueryWrapper documentWrapper = new LambdaEsQueryWrapper<>();\n documentWrapper.hasChild("comment", FieldUtils.val(Comment::getCommentContent), "评论");\n List documents = documentMapper.selectList(documentWrapper);\n System.out.println(documents);\n\n // case2: hasParent查询,返回的是相关的子文档 所以查询用子文档实体及其mapper\n LambdaEsQueryWrapper commentWrapper = new LambdaEsQueryWrapper<>();\n // 字段名称你也可以不用FieldUtils.val,直接传入字符串也行\n commentWrapper.hasParent("document", "content", "内容");\n List comments = commentMapper.selectList(commentWrapper);\n System.out.println(comments);\n\n // case3: parentId查询,返回的是相关的子文档,与case2类似,所以查询用子文档实体及其mapper\n commentWrapper = new LambdaEsQueryWrapper<>();\n commentWrapper.parentId("1", "comment");\n List commentList = commentMapper.selectList(commentWrapper);\n System.out.println(commentList);\n }\n\n @Test\n public void testUpdate() {\n // case1: 父文档/子文档 根据各自的id更新\n Document document = new Document();\n document.setId("1");\n document.setTitle("父标题");\n documentMapper.updateById(document);\n\n // case2: 父文档/子文档 根据各自条件更新\n Comment comment = new Comment();\n comment.setCommentContent("更新后的评论");\n LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>();\n wrapper.match(Comment::getCommentContent, "评论");\n commentMapper.update(comment, wrapper);\n }\n\n @Test\n public void testDelete() {\n // case1: 父文档/子文档 根据各自的id删除\n documentMapper.deleteById("1");\n\n //case2: 父文档/子文档 根据各自条件删除\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.match(Comment::getCommentContent, "评论");\n commentMapper.delete(wrapper);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n\n\n相关demo可参考源码的test模块->test目录->join包',normalizedContent:'前言\n\nes底层是lucene,由于lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在lucene中,es对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的.\n\n父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有减少文档数量,而且增加了父子绑定关系,会导致查询效率低下,因此我们并不建议您在实际开发中使用父子类型.\n\nes本身更适合"大宽表"模式,不要带着传统关系型数据库那种思维方式去使用es,我们完全可以通过把多张表中的字段和内容合并到一张表(一个索引)中,来完成期望功能,尽可能规避父子类型的使用,不仅效率高,功能也更强大.\n\n当然存在即合理,也确实有个别场景下,不可避免的会用到父子类型,作为全球首屈一指的es-orm框架,我们对此也提供了支持,用户可以不用,但我们不能没有!\n\n关于父子类型和嵌套类型的选择:如果对文档的写多于读,那么建议你选择父子类型,如果文档读多于写, 那么请选择嵌套类型.\n\n\n# 1父子类型创建索引\n\n * 自动挡模式:\n\n /**\n * 父文档\n */\n @tablename(childclass = comment.class)\n public class document{\n // 省略其它字段...\n /**\n * 须通过注解在父文档及子文档的实体类中指明其类型为join,及其父名称和子名称,这里的joinfield类框架已内置,无需重复造轮子\n * joinfield类全路径为cn.easyes.common.params.joinfield,如果你非要自己造轮子,也支持,那么需要在@tablefield注解中指明joinfieldclass=你造的轮子\n */\n @tablefield(fieldtype = fieldtype.join, parentname = "document", childname = "comment")\n private joinfield joinfield;\n }\n /**\n * 子文档\n */\n @tablename(child = true)\n public class comment {\n // 省略其它字段...\n /**\n * 父子关系字段 须通过注解在父文档及子文档的实体类中指明其类型为join,子文档中的父子关系可省略\n */\n @tablefield(fieldtype = fieldtype.join)\n private joinfield joinfield;\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n\n\n> 注意: 务必像上面示例一样,在父文档的类上加注解@tablename指明其子文档类,在子文档的类上加注解@tablename,指明child=true,并在joinfield类的@tablefield注解中指定类型为fieldtype=join及其parentname,childname,否则会导致框架无法正常工作\n\n * 手动挡模式\n * 方式一: 按照自动挡模式,配置好注解,然后直接调用一键生成api生成索引 (v0.9.30+ 版本支持)\n\ndocumentmapper.createindex();\n\n\n1\n\n * 方式二: 纯手工打造,所有字段自己安排一遍,不推荐,麻烦得很\n\n lambdaesindexwrapper wrapper = new lambdaesindexwrapper<>();\n // 省略其它代码\n wrapper.join("joinfield", "document", "comment");\n\n\n1\n2\n3\n\n\n注意\n\n在手动挡模式下,主类上的注解依然不能少,框架运行时需要用到父子关系,在方式二还需要通过wrapper指定该嵌套字段,然后完成索引创建/更新\n\n\n# 父子类型 crud\n\n注意父子类型由于都是独立的文档,独立的实体类,所以各自都需要有各自的mapper\n\ncrud示例:\n\n @test\n public void testinsert() {\n // 测试新增父子文档,此处开启自动挡模式,父子类型索引已被自动处理\n // 新新增父文档,然后再插入子文档\n document document = new document();\n document.setid("1");\n document.settitle("父文档的标题");\n document.setcontent("父文档的内容");\n joinfield joinfield = new joinfield();\n joinfield.setname("document");\n document.setjoinfield(joinfield);\n documentmapper.insert(document);\n\n // 插入子文档\n comment comment = new comment();\n comment.setid("2");\n comment.setcommentcontent("文档的评论1");\n\n // 这里特别注意,子文档必须指定其父文档的id,否则找不到父文档别怪我没提醒\n joinfield.setparent("1");\n joinfield.setname("comment");\n comment.setjoinfield(joinfield);\n commentmapper.insert(comment);\n\n // 插入子文档2\n comment comment1 = new comment();\n comment1.setid("3");\n comment1.setcommentcontent("文档的评论2");\n comment1.setjoinfield(joinfield);\n commentmapper.insert(comment1);\n }\n\n @test\n public void testselect() {\n // 温馨提示,下面wrapper中的type实际上就是joinfield字段注解@tablefield中指定的parentname和childname,与原生语法是一致的\n // case1: haschild查询,返回的是相关的父文档 所以查询用父文档实体及其mapper\n lambdaesquerywrapper documentwrapper = new lambdaesquerywrapper<>();\n documentwrapper.haschild("comment", fieldutils.val(comment::getcommentcontent), "评论");\n list documents = documentmapper.selectlist(documentwrapper);\n system.out.println(documents);\n\n // case2: hasparent查询,返回的是相关的子文档 所以查询用子文档实体及其mapper\n lambdaesquerywrapper commentwrapper = new lambdaesquerywrapper<>();\n // 字段名称你也可以不用fieldutils.val,直接传入字符串也行\n commentwrapper.hasparent("document", "content", "内容");\n list comments = commentmapper.selectlist(commentwrapper);\n system.out.println(comments);\n\n // case3: parentid查询,返回的是相关的子文档,与case2类似,所以查询用子文档实体及其mapper\n commentwrapper = new lambdaesquerywrapper<>();\n commentwrapper.parentid("1", "comment");\n list commentlist = commentmapper.selectlist(commentwrapper);\n system.out.println(commentlist);\n }\n\n @test\n public void testupdate() {\n // case1: 父文档/子文档 根据各自的id更新\n document document = new document();\n document.setid("1");\n document.settitle("父标题");\n documentmapper.updatebyid(document);\n\n // case2: 父文档/子文档 根据各自条件更新\n comment comment = new comment();\n comment.setcommentcontent("更新后的评论");\n lambdaesupdatewrapper wrapper = new lambdaesupdatewrapper<>();\n wrapper.match(comment::getcommentcontent, "评论");\n commentmapper.update(comment, wrapper);\n }\n\n @test\n public void testdelete() {\n // case1: 父文档/子文档 根据各自的id删除\n documentmapper.deletebyid("1");\n\n //case2: 父文档/子文档 根据各自条件删除\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.match(comment::getcommentcontent, "评论");\n commentmapper.delete(wrapper);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n\n\n相关demo可参考源码的test模块->test目录->join包',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"查询字段过滤",frontmatter:{title:"查询字段过滤",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/c9c57f/"},regularPath:"/v1.0.0/040.%E9%AB%98%E9%98%B6%E8%AF%AD%E6%B3%95/010.%E6%9F%A5%E8%AF%A2%E5%AD%97%E6%AE%B5%E8%BF%87%E6%BB%A4.html",relativePath:"v1.0.0/040.高阶语法/010.查询字段过滤.md",key:"v-48a65df4",path:"/pages/c9c57f/",headers:[{level:2,title:"1.正向过滤(只查询指定字段)",slug:"_1-正向过滤-只查询指定字段",normalizedTitle:"1.正向过滤(只查询指定字段)",charIndex:36},{level:2,title:"2.反向过滤(不查询指定字段)",slug:"_2-反向过滤-不查询指定字段",normalizedTitle:"2.反向过滤(不查询指定字段)",charIndex:454}],headersStr:"1.正向过滤(只查询指定字段) 2.反向过滤(不查询指定字段)",content:'> 如果您在某些查询中,不想查一些大字段,您可以过滤查询的字段\n\n\n# 1.正向过滤(只查询指定字段)\n\n @Test\n public void testFilterField() {\n // 测试只查询指定字段\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n String title = "老汉";\n wrapper.eq(Document::getTitle, title);\n wrapper.select(Document::getTitle);\n Document document = documentMapper.selectOne(wrapper);\n System.out.println(document);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n\n# 2.反向过滤(不查询指定字段)\n\n @Test\n public void testNotFilterField() {\n // 测试不查询指定字段 (推荐)\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n String title = "老汉";\n wrapper.eq(Document::getTitle, title);\n wrapper.notSelect(Document::getTitle);\n Document document = documentMapper.selectOne(wrapper);\n System.out.println(document);\n\n // 另外一种与mp一致语法的Lambda写法\n LambdaEsQueryWrapper wrapper1 = new LambdaEsQueryWrapper<>();\n wrapper1.select(Document.class, d -> !Objects.equals(d.getColumn(), "title"));\n Document document1 = documentMapper.selectOne(wrapper);\n System.out.println(document1);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n\n\n温馨提示\n\n正向过滤和反向过滤你只能选择其中一种,如果同时使用两种过滤规则,会导致冲突字段失去过滤效果.',normalizedContent:'> 如果您在某些查询中,不想查一些大字段,您可以过滤查询的字段\n\n\n# 1.正向过滤(只查询指定字段)\n\n @test\n public void testfilterfield() {\n // 测试只查询指定字段\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n string title = "老汉";\n wrapper.eq(document::gettitle, title);\n wrapper.select(document::gettitle);\n document document = documentmapper.selectone(wrapper);\n system.out.println(document);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n\n# 2.反向过滤(不查询指定字段)\n\n @test\n public void testnotfilterfield() {\n // 测试不查询指定字段 (推荐)\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n string title = "老汉";\n wrapper.eq(document::gettitle, title);\n wrapper.notselect(document::gettitle);\n document document = documentmapper.selectone(wrapper);\n system.out.println(document);\n\n // 另外一种与mp一致语法的lambda写法\n lambdaesquerywrapper wrapper1 = new lambdaesquerywrapper<>();\n wrapper1.select(document.class, d -> !objects.equals(d.getcolumn(), "title"));\n document document1 = documentmapper.selectone(wrapper);\n system.out.println(document1);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n\n\n温馨提示\n\n正向过滤和反向过滤你只能选择其中一种,如果同时使用两种过滤规则,会导致冲突字段失去过滤效果.',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"排序",frontmatter:{title:"排序",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/274da8/"},regularPath:"/v1.0.0/040.%E9%AB%98%E9%98%B6%E8%AF%AD%E6%B3%95/020.%E6%8E%92%E5%BA%8F.html",relativePath:"v1.0.0/040.高阶语法/020.排序.md",key:"v-0a0bb08f",path:"/pages/274da8/",headers:[{level:2,title:"EE内置排序",slug:"ee内置排序",normalizedTitle:"ee内置排序",charIndex:2},{level:2,title:"自定义排序",slug:"自定义排序",normalizedTitle:"自定义排序",charIndex:2119}],headersStr:"EE内置排序 自定义排序",content:'# EE内置排序\n\n> 针对字段的排序,EE提供了一些内置开箱即用的API,用于支持升序排序和降序排序:\n\n// 降序排列\nwrapper.orderByDesc(排序字段,支持多字段)\n \n// 升序排列\nwrapper.orderByAsc(排序字段,支持多字段)\n \n// 根据得分排序(此功能0.9.7+版本支持;不指定SortOrder时默认降序,得分高的在前,支持升序/降序)\nwrapper.sortByScore(boolean condition,SortOrder sortOrder)\n \n// 排序入参由前端传入, 字符串格式,有点类似之前MySQL那种\nwrapper.orderBy(boolean condition, OrderByParam orderByParam);\n\n// 排序入参由前端传入,多字段情形\nwrapper.orderBy(boolean condition, List orderByParams);\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n\n\n使用示例:\n\n @Test\n public void testSort(){\n // 测试排序 为了测试排序,我们在Document对象中新增了创建时间字段,更新了索引,并新增了两条数据\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.likeRight(Document::getContent,"推");\n wrapper.select(Document::getTitle,Document::getGmtCreate);\n List before = documentMapper.selectList(wrapper);\n System.out.println("before:"+before);\n wrapper.orderByDesc(Document::getGmtCreate);\n List desc = documentMapper.selectList(wrapper);\n System.out.println("desc:"+desc);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n\n\n @Test\n public void testSortByScore(){\n // 测试根据得分升序排列(分数低的排前面)\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.match(Document::getContent,"技术");\n wrapper.sortByScore(SortOrder.ASC);\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n @Test\n public void testOrderByParams(){\n // 此处模拟参数由前端通过xxQuery类传入,排序根据标题降序,根据内容升序\n String jsonParam = "[{\\"order\\":\\"title\\",\\"sort\\":\\"DESC\\"},{\\"order\\":\\"creator\\",\\"sort\\":\\"ASC\\"}]";\n List orderByParams = JSON.parseArray(jsonParam, OrderByParam.class);\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.match(Document::getContent,"技术")\n .orderBy(orderByParams);\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\n效果:\n\n\n# 自定义排序\n\n背景\n\nES的排序器非常丰富多变,也足够灵活,我们很难用一套固定的方案将所有排序都简化。因此我们针对上面这些高频的排序提供了开箱即用的支持,对于其它低频使用的排序,将排序建造者通过自定义的方式直接委托给用户使用,无疑是目前较好的解决方案,如此便可以在不使用原生查询和混合查询的前提下,还能100%支持ES提供的所有查询功能。而且随着不断迭代和吸纳用户反馈,在不久的将来,我们也会持续提供更多开箱即用的API支持,敬请期待。\n\n// API\nwrapper.sort(boolean condition, SortBuilder sortBuilder)\n\n\n1\n2\n\n\n使用示例:\n\n @Test\n public void testSort(){\n // 测试复杂排序,SortBuilder的子类非常多,这里仅演示一种, 比如有用户提出需要随机获取数据\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.match(Document::getContent,"技术");\n Script script = new Script("Math.random()");\n ScriptSortBuilder scriptSortBuilder = new ScriptSortBuilder(script, ScriptSortBuilder.ScriptSortType.NUMBER);\n wrapper.sort(scriptSortBuilder);\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\nSortBuilder类的子类非常多,也非常灵活,所以能支撑和覆盖的排序场景也足够多,其它各种类型的查询,如果您在使用过程中有碰到,可以参考上面的例子去写',normalizedContent:'# ee内置排序\n\n> 针对字段的排序,ee提供了一些内置开箱即用的api,用于支持升序排序和降序排序:\n\n// 降序排列\nwrapper.orderbydesc(排序字段,支持多字段)\n \n// 升序排列\nwrapper.orderbyasc(排序字段,支持多字段)\n \n// 根据得分排序(此功能0.9.7+版本支持;不指定sortorder时默认降序,得分高的在前,支持升序/降序)\nwrapper.sortbyscore(boolean condition,sortorder sortorder)\n \n// 排序入参由前端传入, 字符串格式,有点类似之前mysql那种\nwrapper.orderby(boolean condition, orderbyparam orderbyparam);\n\n// 排序入参由前端传入,多字段情形\nwrapper.orderby(boolean condition, list orderbyparams);\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n\n\n使用示例:\n\n @test\n public void testsort(){\n // 测试排序 为了测试排序,我们在document对象中新增了创建时间字段,更新了索引,并新增了两条数据\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.likeright(document::getcontent,"推");\n wrapper.select(document::gettitle,document::getgmtcreate);\n list before = documentmapper.selectlist(wrapper);\n system.out.println("before:"+before);\n wrapper.orderbydesc(document::getgmtcreate);\n list desc = documentmapper.selectlist(wrapper);\n system.out.println("desc:"+desc);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n\n\n @test\n public void testsortbyscore(){\n // 测试根据得分升序排列(分数低的排前面)\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.match(document::getcontent,"技术");\n wrapper.sortbyscore(sortorder.asc);\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n @test\n public void testorderbyparams(){\n // 此处模拟参数由前端通过xxquery类传入,排序根据标题降序,根据内容升序\n string jsonparam = "[{\\"order\\":\\"title\\",\\"sort\\":\\"desc\\"},{\\"order\\":\\"creator\\",\\"sort\\":\\"asc\\"}]";\n list orderbyparams = json.parsearray(jsonparam, orderbyparam.class);\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.match(document::getcontent,"技术")\n .orderby(orderbyparams);\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\n效果:\n\n\n# 自定义排序\n\n背景\n\nes的排序器非常丰富多变,也足够灵活,我们很难用一套固定的方案将所有排序都简化。因此我们针对上面这些高频的排序提供了开箱即用的支持,对于其它低频使用的排序,将排序建造者通过自定义的方式直接委托给用户使用,无疑是目前较好的解决方案,如此便可以在不使用原生查询和混合查询的前提下,还能100%支持es提供的所有查询功能。而且随着不断迭代和吸纳用户反馈,在不久的将来,我们也会持续提供更多开箱即用的api支持,敬请期待。\n\n// api\nwrapper.sort(boolean condition, sortbuilder sortbuilder)\n\n\n1\n2\n\n\n使用示例:\n\n @test\n public void testsort(){\n // 测试复杂排序,sortbuilder的子类非常多,这里仅演示一种, 比如有用户提出需要随机获取数据\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.match(document::getcontent,"技术");\n script script = new script("math.random()");\n scriptsortbuilder scriptsortbuilder = new scriptsortbuilder(script, scriptsortbuilder.scriptsorttype.number);\n wrapper.sort(scriptsortbuilder);\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\nsortbuilder类的子类非常多,也非常灵活,所以能支撑和覆盖的排序场景也足够多,其它各种类型的查询,如果您在使用过程中有碰到,可以参考上面的例子去写',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"高亮查询",frontmatter:{title:"高亮查询",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/899c12/"},regularPath:"/v1.0.0/040.%E9%AB%98%E9%98%B6%E8%AF%AD%E6%B3%95/060.%E9%AB%98%E4%BA%AE%E6%9F%A5%E8%AF%A2.html",relativePath:"v1.0.0/040.高阶语法/060.高亮查询.md",key:"v-5b90b78a",path:"/pages/899c12/",headers:[{level:2,title:"注解使用示例",slug:"注解使用示例",normalizedTitle:"注解使用示例",charIndex:53}],headersStr:"注解使用示例",content:'提示\n\n高亮字段通过自定义注解@HighLight即可实现,将该注解添加在需要被高亮的字段上即可\n\n\n# 注解使用示例\n\npublic class Document{\n /**\n * 需要被高亮的字段\n */\n @HighLight\n private String content;\n // 省略其它无关字段...\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n温馨提示\n\n如果你不想原来的字段值被高亮字段覆盖,那么你需要在@HighLight注解中指定mappingField,并将该字段添加至对应实体类中,这样配置以后,高亮内容在highlightContent字段中返回,原content字段的值依旧返回它本身的值.\n\n例如:\n\npublic class Document{\n /**\n * 需要被高亮的字段\n */\n @HighLight(mappingField = "highlightContent")\n private String content;\n /**\n * 高亮返回值被映射的字段\n */\n private String highlightContent;\n // 省略其它无关字段...\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n\n\n其它\n\n * 高亮注解支持设置高亮返回内容截取的长度fragmentSize,默认值为100\n * 高亮注解支持设置高亮内容的标签,默认为',normalizedContent:'提示\n\n高亮字段通过自定义注解@highlight即可实现,将该注解添加在需要被高亮的字段上即可\n\n\n# 注解使用示例\n\npublic class document{\n /**\n * 需要被高亮的字段\n */\n @highlight\n private string content;\n // 省略其它无关字段...\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n温馨提示\n\n如果你不想原来的字段值被高亮字段覆盖,那么你需要在@highlight注解中指定mappingfield,并将该字段添加至对应实体类中,这样配置以后,高亮内容在highlightcontent字段中返回,原content字段的值依旧返回它本身的值.\n\n例如:\n\npublic class document{\n /**\n * 需要被高亮的字段\n */\n @highlight(mappingfield = "highlightcontent")\n private string content;\n /**\n * 高亮返回值被映射的字段\n */\n private string highlightcontent;\n // 省略其它无关字段...\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n\n\n其它\n\n * 高亮注解支持设置高亮返回内容截取的长度fragmentsize,默认值为100\n * 高亮注解支持设置高亮内容的标签,默认为',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"分词查询",frontmatter:{title:"分词查询",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/2688d1/"},regularPath:"/v1.0.0/040.%E9%AB%98%E9%98%B6%E8%AF%AD%E6%B3%95/040.%E5%88%86%E8%AF%8D%E6%9F%A5%E8%AF%A2.html",relativePath:"v1.0.0/040.高阶语法/040.分词查询.md",key:"v-23dba453",path:"/pages/2688d1/",headers:[{level:2,title:"分词匹配相关功能API",slug:"分词匹配相关功能api",normalizedTitle:"分词匹配相关功能api",charIndex:2},{level:2,title:"代码示例",slug:"代码示例",normalizedTitle:"代码示例",charIndex:827}],headersStr:"分词匹配相关功能API 代码示例",content:'# 分词匹配相关功能API\n\nmatch(boolean condition, R column, Object val);\nnotMatch(boolean condition, R column, Object val, Float boost);\n\n// 下面这些API 0.9.12+版本才支持,如需可自行升级EE版本\nmatchPhase(boolean condition, R column, Object val, Float boost);\nmatchAllQuery();\nmatchPhrasePrefixQuery(boolean condition, R column, Object val, int maxExpansions, Float boost);\nmultiMatchQuery(boolean condition, Object val, Operator operator, int minimumShouldMatch, Float boost, R... columns);\nqueryStringQuery(boolean condition, String queryString, Float boost);\nprefixQuery(boolean condition, R column, String prefix, Float boost);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n注意\n\n注意:涉及需要分词匹配的字段索引类型必须为text,并为其指定分词器,所需分词器需提前安装,否则将使用es默认分词器,对中文支持不好.\n\n * 分词匹配\n * 例: match("content", "老王")---\x3econtent 包含关键词 \'老王\' 如果分词粒度设置的比较细,老王可能会被拆分成"老"和"王",只要content中包含"老"或"王",均可以被搜出来,其它api可参考下面代码示例.\n\n\n# 代码示例\n\n\n @Test\n public void testMatch(){\n // 会对输入做分词,只要所有分词中有一个词在内容中有匹配就会查询出该数据,无视分词顺序\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.match(Document::getContent,"技术");\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents.size());\n } \n\n @Test\n public void testMatchPhase() {\n // 会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样,否则就无法查询出结果\n // 例如es中数据是 技术过硬,如果搜索关键词为过硬技术就无法查询出结果\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.matchPhase(Document::getContent, "技术");\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n @Test\n public void testMatchAllQuery() {\n // 查询所有数据,类似mysql select all.\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.matchAllQuery();\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n @Test\n public void testMatchPhrasePrefixQuery() {\n // 前缀匹配查询 查询字符串的最后一个词才能当作前缀使用\n // 前缀 可能会匹配成千上万的词,这不仅会消耗很多系统资源,而且结果的用处也不大,所以可以提供入参maxExpansions,若不写则默认为50\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.matchPhrasePrefixQuery(Document::getCustomField, "乌拉巴拉", 10);\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n @Test\n public void testMultiMatchQuery() {\n // 从多个指定字段中查询包含老王的数据\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.multiMatchQuery("老王", Document::getTitle, Document::getContent, Document::getCreator, Document::getCustomField);\n\n // 其中,默认的Operator为OR,默认的minShouldMatch为60% 这两个参数都可以按需调整,我们api是支持的 例如:\n // 其中AND意味着所有搜索的Token都必须被匹配,OR表示只要有一个Token匹配即可. minShouldMatch 80 表示只查询匹配度大于80%的数据\n // wrapper.multiMatchQuery("老王",Operator.AND,80,Document::getCustomField,Document::getContent);\n\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents.size());\n System.out.println(documents);\n }\n\n @Test\n public void queryStringQuery() {\n // 从所有字段中查询包含关键词老汉的数据\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.queryStringQuery("老汉");\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n @Test\n public void prefixQuery() {\n // 查询创建者以"隔壁"打头的所有数据 比如隔壁老王 隔壁老汉 都能被查出来\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.prefixQuery(Document::getCreator, "隔壁");\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n',normalizedContent:'# 分词匹配相关功能api\n\nmatch(boolean condition, r column, object val);\nnotmatch(boolean condition, r column, object val, float boost);\n\n// 下面这些api 0.9.12+版本才支持,如需可自行升级ee版本\nmatchphase(boolean condition, r column, object val, float boost);\nmatchallquery();\nmatchphraseprefixquery(boolean condition, r column, object val, int maxexpansions, float boost);\nmultimatchquery(boolean condition, object val, operator operator, int minimumshouldmatch, float boost, r... columns);\nquerystringquery(boolean condition, string querystring, float boost);\nprefixquery(boolean condition, r column, string prefix, float boost);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n注意\n\n注意:涉及需要分词匹配的字段索引类型必须为text,并为其指定分词器,所需分词器需提前安装,否则将使用es默认分词器,对中文支持不好.\n\n * 分词匹配\n * 例: match("content", "老王")---\x3econtent 包含关键词 \'老王\' 如果分词粒度设置的比较细,老王可能会被拆分成"老"和"王",只要content中包含"老"或"王",均可以被搜出来,其它api可参考下面代码示例.\n\n\n# 代码示例\n\n\n @test\n public void testmatch(){\n // 会对输入做分词,只要所有分词中有一个词在内容中有匹配就会查询出该数据,无视分词顺序\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.match(document::getcontent,"技术");\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents.size());\n } \n\n @test\n public void testmatchphase() {\n // 会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样,否则就无法查询出结果\n // 例如es中数据是 技术过硬,如果搜索关键词为过硬技术就无法查询出结果\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.matchphase(document::getcontent, "技术");\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n @test\n public void testmatchallquery() {\n // 查询所有数据,类似mysql select all.\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.matchallquery();\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n @test\n public void testmatchphraseprefixquery() {\n // 前缀匹配查询 查询字符串的最后一个词才能当作前缀使用\n // 前缀 可能会匹配成千上万的词,这不仅会消耗很多系统资源,而且结果的用处也不大,所以可以提供入参maxexpansions,若不写则默认为50\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.matchphraseprefixquery(document::getcustomfield, "乌拉巴拉", 10);\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n @test\n public void testmultimatchquery() {\n // 从多个指定字段中查询包含老王的数据\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.multimatchquery("老王", document::gettitle, document::getcontent, document::getcreator, document::getcustomfield);\n\n // 其中,默认的operator为or,默认的minshouldmatch为60% 这两个参数都可以按需调整,我们api是支持的 例如:\n // 其中and意味着所有搜索的token都必须被匹配,or表示只要有一个token匹配即可. minshouldmatch 80 表示只查询匹配度大于80%的数据\n // wrapper.multimatchquery("老王",operator.and,80,document::getcustomfield,document::getcontent);\n\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents.size());\n system.out.println(documents);\n }\n\n @test\n public void querystringquery() {\n // 从所有字段中查询包含关键词老汉的数据\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.querystringquery("老汉");\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n @test\n public void prefixquery() {\n // 查询创建者以"隔壁"打头的所有数据 比如隔壁老王 隔壁老汉 都能被查出来\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.prefixquery(document::getcreator, "隔壁");\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"权重",frontmatter:{title:"权重",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/e6fc8d/"},regularPath:"/v1.0.0/040.%E9%AB%98%E9%98%B6%E8%AF%AD%E6%B3%95/050.%E6%9D%83%E9%87%8D.html",relativePath:"v1.0.0/040.高阶语法/050.权重.md",key:"v-0cee86be",path:"/pages/e6fc8d/",headers:[{level:2,title:"API",slug:"api",normalizedTitle:"api",charIndex:32},{level:2,title:"代码示例",slug:"代码示例",normalizedTitle:"代码示例",charIndex:73}],headersStr:"API 代码示例",content:'> 权重查询也是Es有MySQL无的一种查询,语法如下\n\n\n# API\n\nfunction(字段, 值, Float 权重值)\n\n\n1\n\n\n\n# 代码示例\n\n @Test\n public void testWeight() throws IOException {\n \t// 测试权重\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n String keyword = "过硬";\n float contentBoost = 5.0f;\n wrapper.match(Document::getContent,keyword,contentBoost);\n String creator = "老汉";\n float creatorBoost = 2.0f;\n wrapper.eq(Document::getCreator,creator,creatorBoost);\n SearchResponse response = documentMapper.search(wrapper);\n System.out.println(response);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n\n\n温馨提示\n\n如果你需要得分,则通过SearchResponse返回,如果不需要得分,只需要按照得分高的排名靠前返回,则直接用List接收即可.',normalizedContent:'> 权重查询也是es有mysql无的一种查询,语法如下\n\n\n# api\n\nfunction(字段, 值, float 权重值)\n\n\n1\n\n\n\n# 代码示例\n\n @test\n public void testweight() throws ioexception {\n \t// 测试权重\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n string keyword = "过硬";\n float contentboost = 5.0f;\n wrapper.match(document::getcontent,keyword,contentboost);\n string creator = "老汉";\n float creatorboost = 2.0f;\n wrapper.eq(document::getcreator,creator,creatorboost);\n searchresponse response = documentmapper.search(wrapper);\n system.out.println(response);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n\n\n温馨提示\n\n如果你需要得分,则通过searchresponse返回,如果不需要得分,只需要按照得分高的排名靠前返回,则直接用list接收即可.',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"获取DSL语句",frontmatter:{title:"获取DSL语句",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/981130/"},regularPath:"/v1.0.0/030.%E6%8B%93%E5%B1%95%E5%8A%9F%E8%83%BD/060.%E8%8E%B7%E5%8F%96DSL%E8%AF%AD%E5%8F%A5.html",relativePath:"v1.0.0/030.拓展功能/060.获取DSL语句.md",key:"v-ff37c92c",path:"/pages/981130/",headers:[{level:2,title:"API",slug:"api",normalizedTitle:"api",charIndex:2}],headersStr:"API",content:"# API\n\n// 获取通过本框架生成的查询参数 可用于检验本框架生成的查询参数是否正确以及其它用途\nString getSource(LambdaEsQueryWrapper wrapper);\n\n\n1\n2\n\n\n温馨提示\n\n如果您获取DSL语句仅仅是为了打印,您无需再手动调用此接口获取DSL语句,DSL语句默认会在控制台打印,生产环境如需关闭请在配置文件中配置print-dsl=false,配置可参考配置章节.",normalizedContent:"# api\n\n// 获取通过本框架生成的查询参数 可用于检验本框架生成的查询参数是否正确以及其它用途\nstring getsource(lambdaesquerywrapper wrapper);\n\n\n1\n2\n\n\n温馨提示\n\n如果您获取dsl语句仅仅是为了打印,您无需再手动调用此接口获取dsl语句,dsl语句默认会在控制台打印,生产环境如需关闭请在配置文件中配置print-dsl=false,配置可参考配置章节.",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"插件",frontmatter:{title:"插件",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/6431d1/"},regularPath:"/v1.0.0/050.%E6%8F%92%E4%BB%B6/010.%E6%8F%92%E4%BB%B6.html",relativePath:"v1.0.0/050.插件/010.插件.md",key:"v-486924ca",path:"/pages/6431d1/",headers:[{level:2,title:"拦截器插件",slug:"拦截器插件",normalizedTitle:"拦截器插件",charIndex:219},{level:3,title:"需求背景",slug:"需求背景",normalizedTitle:"需求背景",charIndex:369},{level:3,title:"使用示例",slug:"使用示例",normalizedTitle:"使用示例",charIndex:434},{level:3,title:"改进建议",slug:"改进建议",normalizedTitle:"改进建议",charIndex:1289}],headersStr:"拦截器插件 需求背景 使用示例 改进建议",content:'> 期待已久的插件模块来了,在此模块大家可以发挥自己的想象力,脑洞大开,自定义插件,可根据自己项目喜好自行开发一些好用的插件, 只要有价值,皆可提交PR,评审通过即可成为EE贡献者,该插件即可供全球开发者使用..\n\n注意事项\n\n * 插件模块尽量独立于其它模块,尤其是core模块\n * 插件模块不得过度修改其它模块代码,如有修改,需评估影响范围\n * 插件模块尽量做到可配置,不配置开启时,不可影响其它模块运行及性能安全等\n\n\n\n\n# 拦截器插件\n\n> 本插件由开源团队成员:璐先生贡献\n\n适用场景\n\n需要对一些方法做特殊前置处理,比如:\n\n * 需要在执行删除es数据操作前,需要先验证用户权限,或是记录操作记录等\n * 需要在执行查询前,追加一些特殊参数,比如逻辑删除 总之就是对EE提供的各种API的AOP前置拦截增强.\n\n\n# 需求背景\n\n需要拦截本框架提供的selectList方法,然后在此方法的查询参数中追加逻辑删除为未删除的状态作为查询条件\n\n\n# 使用示例\n\n新增拦截器,通过@Intercepts注解指定拦截的方法列表,通过@Signature注解指定被拦截的类,方法,参数等信息.\n\n@Intercepts(\n {\n @Signature(type = BaseEsMapper.class, method = "selectList", args = {LambdaEsQueryWrapper.class}),\n }\n)\n@Component\npublic class QueryInterceptor implements Interceptor {\n\n @Override\n public Object intercept(Invocation invocation) throws Throwable {\n System.out.println("啊啊啊,我拦截到了查询,统一增加查询条件");\n // 查询条件中统一加入逻辑删除状态为未删除\n Object[] args = invocation.getArgs();\n LambdaEsQueryWrapper arg = (LambdaEsQueryWrapper) args[0];\n arg.eq(GeneralBean::getExistStatus, true);\n return invocation.proceed();\n }\n\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n\n\n提示\n\n 1. 需要将此拦截器加上@Component注解,将其加入Spring容器,否则此拦截器不生效.\n 2. 实现的Interceptor全路径为:com.xpc.easyes.sample.interceptor,而非其它同名拦截器.\n\n\n# 改进建议\n\n粒度过于细,不支持通配,比如我想拦截5个方法前缀为selectXXX的方法,需要通过注解配置5次才能实现, 后续建议可支持通配拦截,比如通过select*拦截指定类中以select打头的所有方法. 后续迭代如果我有时间会优化此处,如有开发者感兴趣欢迎提交改进代码,贡献PR!',normalizedContent:'> 期待已久的插件模块来了,在此模块大家可以发挥自己的想象力,脑洞大开,自定义插件,可根据自己项目喜好自行开发一些好用的插件, 只要有价值,皆可提交pr,评审通过即可成为ee贡献者,该插件即可供全球开发者使用..\n\n注意事项\n\n * 插件模块尽量独立于其它模块,尤其是core模块\n * 插件模块不得过度修改其它模块代码,如有修改,需评估影响范围\n * 插件模块尽量做到可配置,不配置开启时,不可影响其它模块运行及性能安全等\n\n\n\n\n# 拦截器插件\n\n> 本插件由开源团队成员:璐先生贡献\n\n适用场景\n\n需要对一些方法做特殊前置处理,比如:\n\n * 需要在执行删除es数据操作前,需要先验证用户权限,或是记录操作记录等\n * 需要在执行查询前,追加一些特殊参数,比如逻辑删除 总之就是对ee提供的各种api的aop前置拦截增强.\n\n\n# 需求背景\n\n需要拦截本框架提供的selectlist方法,然后在此方法的查询参数中追加逻辑删除为未删除的状态作为查询条件\n\n\n# 使用示例\n\n新增拦截器,通过@intercepts注解指定拦截的方法列表,通过@signature注解指定被拦截的类,方法,参数等信息.\n\n@intercepts(\n {\n @signature(type = baseesmapper.class, method = "selectlist", args = {lambdaesquerywrapper.class}),\n }\n)\n@component\npublic class queryinterceptor implements interceptor {\n\n @override\n public object intercept(invocation invocation) throws throwable {\n system.out.println("啊啊啊,我拦截到了查询,统一增加查询条件");\n // 查询条件中统一加入逻辑删除状态为未删除\n object[] args = invocation.getargs();\n lambdaesquerywrapper arg = (lambdaesquerywrapper) args[0];\n arg.eq(generalbean::getexiststatus, true);\n return invocation.proceed();\n }\n\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n\n\n提示\n\n 1. 需要将此拦截器加上@component注解,将其加入spring容器,否则此拦截器不生效.\n 2. 实现的interceptor全路径为:com.xpc.easyes.sample.interceptor,而非其它同名拦截器.\n\n\n# 改进建议\n\n粒度过于细,不支持通配,比如我想拦截5个方法前缀为selectxxx的方法,需要通过注解配置5次才能实现, 后续建议可支持通配拦截,比如通过select*拦截指定类中以select打头的所有方法. 后续迭代如果我有时间会优化此处,如有开发者感兴趣欢迎提交改进代码,贡献pr!',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"聚合查询",frontmatter:{title:"聚合查询",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/b508b3/"},regularPath:"/v1.0.0/040.%E9%AB%98%E9%98%B6%E8%AF%AD%E6%B3%95/030.%E8%81%9A%E5%90%88%E6%9F%A5%E8%AF%A2.html",relativePath:"v1.0.0/040.高阶语法/030.聚合查询.md",key:"v-7b83d27a",path:"/pages/b508b3/",headers:[{level:2,title:"常规聚合",slug:"常规聚合",normalizedTitle:"常规聚合",charIndex:294},{level:2,title:"其它聚合:",slug:"其它聚合",normalizedTitle:"其它聚合:",charIndex:1056},{level:2,title:"去重聚合",slug:"去重聚合",normalizedTitle:"去重聚合",charIndex:2289}],headersStr:"常规聚合 其它聚合: 去重聚合",content:'前言\n\n聚合可以算得上ES中最难用的一部分了,其API也是最反人类的,懂的都懂。对聚合的支持,SpringData-ElasticSearch直接放弃了,EE对其ES的聚合的简化也比较有限,尽管如此,也算得上目前市面上开源框架中对ES聚合支持得最好的框架了,大家在用得时候请轻喷,在聚合方式排列组合有上千种,以及灵活多变的树形桶得数据解析上,我们真的尽力了,奉劝大家抛弃幻想,准备迎接挑战,这不是MySQL。ES的聚合和MySQL的聚合完全是两种不同的东西。 您现在看到的聚合也绝对不是EE对聚合支持的最终形态,我们还会持续探索进一步简化聚合,来减轻用户使用ES聚合功能的烦恼。\n\n\n# 常规聚合\n\n在MySQL中,我们可以通过指定字段进行group by聚合,EE同样也支持类似聚合:\n\n @Test\n public void testGroupBy() {\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.likeRight(Document::getContent,"推");\n wrapper.groupBy(Document::getCreator);\n // 支持多字段聚合\n // wrapper.groupBy(Document::getCreator,Document::getCreator);\n SearchResponse response = documentMapper.search(wrapper);\n System.out.println(response);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n温馨提示\n\n尽管语法与MP一致,但实际上,ES的聚合结果是放在单独的对象中的,格式如下所示,因此我们高阶语法均需要用SearchResponse来接收返回结果,这点需要区别于MP和MySQL.\n\n"aggregations":{"sterms#creator":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":"老汉","doc_count":2},{"key":"老王","doc_count":1}]}}\n\n\n1\n\n\n\n# 其它聚合:\n\n// 求最小值\nwrapper.min();\n// 求最大值\nwrapper.max();\n// 求平均值\nwrapper.avg();\n// 求和\nwrapper.sum();\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n如果需要先groupBy,再根据groupBy聚合后桶中的数据进行求最值,均值之类的,也是支持的,会按照您在wrapper中指定的顺序,管道聚合(pipeline aggregation).\n\n示例:\n\n @Test\n public void testAgg() {\n // 根据创建者聚合,聚合完在该桶中再次根据点赞数聚合\n // 注意:指定的多个聚合参数为管道聚合,就是第一个聚合参数聚合之后的结果,再根据第二个参数聚合,对应Pipeline聚合\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.eq(Document::getTitle, "老汉")\n .groupBy(Document::getCreator)\n .max(Document::getStarNum);\n SearchResponse response = documentMapper.search(wrapper);\n System.out.println(response);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\n> 另外EE还提供了可以配置是否开启管道聚合的参数,默认为开启,如果你想让多个字段聚合的结果出现在各自的桶中,那么你可以指定enablePipeline参数为false即可.\n\n @Test\n public void testAggNotPipeline() {\n // 对于下面两个字段,如果不想以pipeline管道聚合,各自聚合的结果在各自的桶中展示的话,我们也提供了支持\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n // 指定启用管道聚合为false\n wrapper.groupBy(false, Document::getCreator, Document::getTitle);\n SearchResponse response = documentMapper.search(wrapper);\n System.out.println(response);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n\n# 去重聚合\n\n> 为了方便用户去重,我们针对字段的去重提供了极为友好的方式,解决用户根据字段进行去重及分页要写大量代码来实现的烦恼,使用ee单字段去重仅需1行即可搞定!\n\nAPI:\n\n // 去重,入参为去重列\n wrapper.distinct(R column);\n\n\n1\n2\n\n\n下面我用一段代码来演示根据指定字段去重:\n\n @Test\n public void testDistinct() {\n // 查询所有标题为老汉的文档,根据创建者去重,并分页返回\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n wrapper.eq(Document::getTitle, "老汉")\n .distinct(Document::getCreator);\n PageInfo pageInfo = documentMapper.pageQuery(wrapper, 1, 10);\n System.out.println(pageInfo);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n坏味道\n\n对于多字段的去重支持,没有上述这么简单,因为多字段去重无法通过折叠去实现,数据会被置入桶中返回,桶中数据的解析,需要哪些字段,排序规则,覆盖规则是怎样的过于灵活,我们无法通过框架来帮用户屏蔽这些,市面上目前也无任何框架能够支撑,因此,我们对多字段的去重仅支持到了查询条件的封装,数据解析部分需用户自行完成,敬请谅解.好在多字段去重的场景并不是太多,用户如果有用到多字段去重,可参见本篇开头对groupBy的介绍,可通过groupBy对多字段实现去重。',normalizedContent:'前言\n\n聚合可以算得上es中最难用的一部分了,其api也是最反人类的,懂的都懂。对聚合的支持,springdata-elasticsearch直接放弃了,ee对其es的聚合的简化也比较有限,尽管如此,也算得上目前市面上开源框架中对es聚合支持得最好的框架了,大家在用得时候请轻喷,在聚合方式排列组合有上千种,以及灵活多变的树形桶得数据解析上,我们真的尽力了,奉劝大家抛弃幻想,准备迎接挑战,这不是mysql。es的聚合和mysql的聚合完全是两种不同的东西。 您现在看到的聚合也绝对不是ee对聚合支持的最终形态,我们还会持续探索进一步简化聚合,来减轻用户使用es聚合功能的烦恼。\n\n\n# 常规聚合\n\n在mysql中,我们可以通过指定字段进行group by聚合,ee同样也支持类似聚合:\n\n @test\n public void testgroupby() {\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.likeright(document::getcontent,"推");\n wrapper.groupby(document::getcreator);\n // 支持多字段聚合\n // wrapper.groupby(document::getcreator,document::getcreator);\n searchresponse response = documentmapper.search(wrapper);\n system.out.println(response);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n\n\n温馨提示\n\n尽管语法与mp一致,但实际上,es的聚合结果是放在单独的对象中的,格式如下所示,因此我们高阶语法均需要用searchresponse来接收返回结果,这点需要区别于mp和mysql.\n\n"aggregations":{"sterms#creator":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":"老汉","doc_count":2},{"key":"老王","doc_count":1}]}}\n\n\n1\n\n\n\n# 其它聚合:\n\n// 求最小值\nwrapper.min();\n// 求最大值\nwrapper.max();\n// 求平均值\nwrapper.avg();\n// 求和\nwrapper.sum();\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n如果需要先groupby,再根据groupby聚合后桶中的数据进行求最值,均值之类的,也是支持的,会按照您在wrapper中指定的顺序,管道聚合(pipeline aggregation).\n\n示例:\n\n @test\n public void testagg() {\n // 根据创建者聚合,聚合完在该桶中再次根据点赞数聚合\n // 注意:指定的多个聚合参数为管道聚合,就是第一个聚合参数聚合之后的结果,再根据第二个参数聚合,对应pipeline聚合\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.eq(document::gettitle, "老汉")\n .groupby(document::getcreator)\n .max(document::getstarnum);\n searchresponse response = documentmapper.search(wrapper);\n system.out.println(response);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\n> 另外ee还提供了可以配置是否开启管道聚合的参数,默认为开启,如果你想让多个字段聚合的结果出现在各自的桶中,那么你可以指定enablepipeline参数为false即可.\n\n @test\n public void testaggnotpipeline() {\n // 对于下面两个字段,如果不想以pipeline管道聚合,各自聚合的结果在各自的桶中展示的话,我们也提供了支持\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n // 指定启用管道聚合为false\n wrapper.groupby(false, document::getcreator, document::gettitle);\n searchresponse response = documentmapper.search(wrapper);\n system.out.println(response);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n\n# 去重聚合\n\n> 为了方便用户去重,我们针对字段的去重提供了极为友好的方式,解决用户根据字段进行去重及分页要写大量代码来实现的烦恼,使用ee单字段去重仅需1行即可搞定!\n\napi:\n\n // 去重,入参为去重列\n wrapper.distinct(r column);\n\n\n1\n2\n\n\n下面我用一段代码来演示根据指定字段去重:\n\n @test\n public void testdistinct() {\n // 查询所有标题为老汉的文档,根据创建者去重,并分页返回\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n wrapper.eq(document::gettitle, "老汉")\n .distinct(document::getcreator);\n pageinfo pageinfo = documentmapper.pagequery(wrapper, 1, 10);\n system.out.println(pageinfo);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\n\n坏味道\n\n对于多字段的去重支持,没有上述这么简单,因为多字段去重无法通过折叠去实现,数据会被置入桶中返回,桶中数据的解析,需要哪些字段,排序规则,覆盖规则是怎样的过于灵活,我们无法通过框架来帮用户屏蔽这些,市面上目前也无任何框架能够支撑,因此,我们对多字段的去重仅支持到了查询条件的封装,数据解析部分需用户自行完成,敬请谅解.好在多字段去重的场景并不是太多,用户如果有用到多字段去重,可参见本篇开头对groupby的介绍,可通过groupby对多字段实现去重。',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"问答",frontmatter:{title:"问答",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/453119/"},regularPath:"/v1.0.0/060.%E5%85%B6%E5%AE%83/010.%E9%97%AE%E7%AD%94.html",relativePath:"v1.0.0/060.其它/010.问答.md",key:"v-7814f9e3",path:"/pages/453119/",headersStr:null,content:'1.当碰到有一些需求EE提供的API不支持时怎么办? 没关系,作者早就帮主公们想到最优的解决方案了,请查看这里:混合查询\n\n2.试用过程中,报错:java.lang.reflect.UndeclaredThrowableException\n\nCaused by: [daily_document] ElasticsearchStatusException[Elasticsearch exception [type=index_not_found_exception, reason=no such index [daily_document]]]\n\n\n1\n\n\n如果您的错误信息和原因与上面一致,请检查索引名称是否正确配置,检查全局配置,注解配置,如果配置无误,可能是索引不存在,您可以通过es-head可视化工具查看是否已存在指定索引,若无此索引,可以通过EE提供的API快速创建.\n\n3.依赖冲突\n尽管EE框架足够轻量,我在研发过程中也尽量避免使用过多其它依赖,但仍难保证在极小概率下发生和宿主项目发生依赖冲突的情况,如果有依赖冲突,开发者可通过移除重复依赖或统一依赖版本号来解决,EE所有可能发生冲突的依赖如下:\n\n \n org.projectlombok\n lombok\n \t1.18.12\n \n \n org.elasticsearch.client\n elasticsearch-rest-high-level-client\n 7.10.1\n \n \n org.elasticsearch\n elasticsearch\n 7.10.1\n \n \n com.alibaba\n fastjson\n 1.2.79\n \n \n commons-codec\n commons-codec\n 1.6\n \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n\n 4. 报错NoSuchMethod,错误信息大致如下:\n\n> EasyEsException: no such method: at ExceptionUtils.eee(ExceptionUtils.java:36) at BaseCache.lambda$setterMethod$5(BaseCache.java:94) at java.util.Optional.orElseThrow(Optional.java:290)\n\n通常情况下是您实体类Model中无id字段,可复制我下面提供的示例,按需二选一,添加id字段即可,字段类型不限,但字段名称必须叫id.\n\n// 使用es自动生成的Id值\nprivate String id;\n\n// 如果你的id是自己指定值的,例如用MySQL中该id的值,请加注解\n@TableId(type = IdType.CUSTOMIZE)\nprivate Long id;\n\n\n1\n2\n3\n4\n5\n6\n\n\n当然也有个别用户反馈说已经加了Id还是报错,不妨去掉@TableId(value="id")注解中的value="id",因为id字段在es中的命名为_id,这点差异我已在框架中做了屏蔽处理,所以用户无需再去指定value.最简单的方式就是直接复制我上面提供的代码.\n\n5.使用wrapper.eq(xx::getXX,"查询内容")查不出来数据? eq对应的是es的TermQuery(),需要被查询字段的索引类型为keyword时才能查询,如果被查询字段的索引类型为text,那么该字段将无法被eq查询,在使用前不妨先看看自己的需求,是否需要分词匹配,如果需要分词匹配,把该字段的索引类型建立为text类型,然后使用wrapper.match(),wrapper.queryString()等方式查询;如果需要精确匹配,可将该索引字段类型建立为keyword类型,然后使用wrapper.eq()查询; 如果同一个字段,既需要用精确匹配查询,又需要被分词查询,可将其索引类型创建为keyword&text类型,在把它当作keyword类型查询时,需要传入字段名称为“字段名称.keyword”,在把它当text类型查询时,直接用字段名即可。或者不妨将该字段冗余,新增一个字段,值与该字段保持一致,一个索引用keyword,一个用text类型,这样就可以完美化解了,对es而言支持PB级数据,增加一个冗余字段,对性能影响微乎其微.\n\n温馨提示\n\n在框架使用中,难免会因为各种原因导致异常,我们不排除框架本身有缺陷导致,但目前发布的功能中,绝大多数都是比较稳定且有测试用例覆盖及大量用户生产环境验证过的,更多的时候是用户没有按文档使用,自由发挥,导致出现一些问题,这类用户通常还比较懒,一碰到鸡毛大点问题马上来群里问,或是抱怨框架垃圾,然后我们协助排查解决最后发现是xx地方没有按文档使用,而是胡乱搞,我们也很无奈,毕竟做开源,精力和时间也比较有限,我们想把时间花在刀刃上,比如收集真正的bug,去迭代解决,而不是把时间浪费在这些无谓的地方. 所以我们还是希望用户能在使用前多读文档,遇到问题不妨先从文档下手,看看我们提供的DEMO是怎么写的? 打断点找找原因,看看源码分析分析,经历了这些步骤,如果仍然解决不了,可以再来答疑群里问,这是一个码农基本的素养,而且对提升自身技术水平有很大帮助,如果碰到问题就抛出去,久而久之,自我独立解决和分析问题的能力会越来越差,长此以往,若有一天用了某款开源产品,碰到问题恰好没人答疑,又当何去何从?',normalizedContent:'1.当碰到有一些需求ee提供的api不支持时怎么办? 没关系,作者早就帮主公们想到最优的解决方案了,请查看这里:混合查询\n\n2.试用过程中,报错:java.lang.reflect.undeclaredthrowableexception\n\ncaused by: [daily_document] elasticsearchstatusexception[elasticsearch exception [type=index_not_found_exception, reason=no such index [daily_document]]]\n\n\n1\n\n\n如果您的错误信息和原因与上面一致,请检查索引名称是否正确配置,检查全局配置,注解配置,如果配置无误,可能是索引不存在,您可以通过es-head可视化工具查看是否已存在指定索引,若无此索引,可以通过ee提供的api快速创建.\n\n3.依赖冲突\n尽管ee框架足够轻量,我在研发过程中也尽量避免使用过多其它依赖,但仍难保证在极小概率下发生和宿主项目发生依赖冲突的情况,如果有依赖冲突,开发者可通过移除重复依赖或统一依赖版本号来解决,ee所有可能发生冲突的依赖如下:\n\n \n org.projectlombok\n lombok\n \t1.18.12\n \n \n org.elasticsearch.client\n elasticsearch-rest-high-level-client\n 7.10.1\n \n \n org.elasticsearch\n elasticsearch\n 7.10.1\n \n \n com.alibaba\n fastjson\n 1.2.79\n \n \n commons-codec\n commons-codec\n 1.6\n \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n\n 4. 报错nosuchmethod,错误信息大致如下:\n\n> easyesexception: no such method: at exceptionutils.eee(exceptionutils.java:36) at basecache.lambda$settermethod$5(basecache.java:94) at java.util.optional.orelsethrow(optional.java:290)\n\n通常情况下是您实体类model中无id字段,可复制我下面提供的示例,按需二选一,添加id字段即可,字段类型不限,但字段名称必须叫id.\n\n// 使用es自动生成的id值\nprivate string id;\n\n// 如果你的id是自己指定值的,例如用mysql中该id的值,请加注解\n@tableid(type = idtype.customize)\nprivate long id;\n\n\n1\n2\n3\n4\n5\n6\n\n\n当然也有个别用户反馈说已经加了id还是报错,不妨去掉@tableid(value="id")注解中的value="id",因为id字段在es中的命名为_id,这点差异我已在框架中做了屏蔽处理,所以用户无需再去指定value.最简单的方式就是直接复制我上面提供的代码.\n\n5.使用wrapper.eq(xx::getxx,"查询内容")查不出来数据? eq对应的是es的termquery(),需要被查询字段的索引类型为keyword时才能查询,如果被查询字段的索引类型为text,那么该字段将无法被eq查询,在使用前不妨先看看自己的需求,是否需要分词匹配,如果需要分词匹配,把该字段的索引类型建立为text类型,然后使用wrapper.match(),wrapper.querystring()等方式查询;如果需要精确匹配,可将该索引字段类型建立为keyword类型,然后使用wrapper.eq()查询; 如果同一个字段,既需要用精确匹配查询,又需要被分词查询,可将其索引类型创建为keyword&text类型,在把它当作keyword类型查询时,需要传入字段名称为“字段名称.keyword”,在把它当text类型查询时,直接用字段名即可。或者不妨将该字段冗余,新增一个字段,值与该字段保持一致,一个索引用keyword,一个用text类型,这样就可以完美化解了,对es而言支持pb级数据,增加一个冗余字段,对性能影响微乎其微.\n\n温馨提示\n\n在框架使用中,难免会因为各种原因导致异常,我们不排除框架本身有缺陷导致,但目前发布的功能中,绝大多数都是比较稳定且有测试用例覆盖及大量用户生产环境验证过的,更多的时候是用户没有按文档使用,自由发挥,导致出现一些问题,这类用户通常还比较懒,一碰到鸡毛大点问题马上来群里问,或是抱怨框架垃圾,然后我们协助排查解决最后发现是xx地方没有按文档使用,而是胡乱搞,我们也很无奈,毕竟做开源,精力和时间也比较有限,我们想把时间花在刀刃上,比如收集真正的bug,去迭代解决,而不是把时间浪费在这些无谓的地方. 所以我们还是希望用户能在使用前多读文档,遇到问题不妨先从文档下手,看看我们提供的demo是怎么写的? 打断点找找原因,看看源码分析分析,经历了这些步骤,如果仍然解决不了,可以再来答疑群里问,这是一个码农基本的素养,而且对提升自身技术水平有很大帮助,如果碰到问题就抛出去,久而久之,自我独立解决和分析问题的能力会越来越差,长此以往,若有一天用了某款开源产品,碰到问题恰好没人答疑,又当何去何从?',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"GEO地理位置查询",frontmatter:{title:"GEO地理位置查询",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/39b41e/"},regularPath:"/v1.0.0/040.%E9%AB%98%E9%98%B6%E8%AF%AD%E6%B3%95/070.GEO%E5%9C%B0%E7%90%86%E4%BD%8D%E7%BD%AE%E6%9F%A5%E8%AF%A2.html",relativePath:"v1.0.0/040.高阶语法/070.GEO地理位置查询.md",key:"v-6bd52905",path:"/pages/39b41e/",headers:[{level:2,title:"GeoBoundingBox",slug:"geoboundingbox",normalizedTitle:"geoboundingbox",charIndex:46},{level:3,title:"API",slug:"api",normalizedTitle:"api",charIndex:273},{level:3,title:"使用示例",slug:"使用示例",normalizedTitle:"使用示例",charIndex:885},{level:2,title:"GeoDistance",slug:"geodistance",normalizedTitle:"geodistance",charIndex:64},{level:3,title:"API",slug:"api-2",normalizedTitle:"api",charIndex:273},{level:3,title:"使用示例",slug:"使用示例-2",normalizedTitle:"使用示例",charIndex:885},{level:2,title:"GeoPolygon",slug:"geopolygon",normalizedTitle:"geopolygon",charIndex:79},{level:3,title:"API",slug:"api-3",normalizedTitle:"api",charIndex:273},{level:3,title:"使用示例",slug:"使用示例-3",normalizedTitle:"使用示例",charIndex:885},{level:2,title:"GeoShape",slug:"geoshape",normalizedTitle:"geoshape",charIndex:93},{level:2,title:"API",slug:"api-4",normalizedTitle:"api",charIndex:273},{level:2,title:"使用示例",slug:"使用示例-4",normalizedTitle:"使用示例",charIndex:885}],headersStr:"GeoBoundingBox API 使用示例 GeoDistance API 使用示例 GeoPolygon API 使用示例 GeoShape API 使用示例",content:'提示\n\n地理位置查询,与Es官方提供的功能完全一致,共支持4种类型的地理位置查询:\n\n * GeoBoundingBox\n * GeoDistance\n * GeoPolygon\n * GeoShape\n\n通过这4类查询,可以实现各种强大实用的功能\n\n应用场景\n\n * 外卖类APP 附近的门店\n * 社交类APP 附近的人\n * 打车类APP 附近的司机\n * 区域人群画像类APP 指定范围内的人群特征提取\n * 健康码等\n * ...\n\nEE对ES地理位置相关功能支持覆盖100%,且使用更为简单.\n\n注意事项\n\n 1. 在使用地理位置查询API之前,需要提前创建或更新好索引\n * 划重点:其中前三类API(GeoBoundingBox,GeoDistance,GeoPolygon)字段索引类型必须为geo_point\n * GeoShape字段索引类型必须为geo_shape,否则将导致功能无法正常使用,具体可参考下图\n 2. 字段类型推荐使用String,因为wkt文本格式就是String,非常方便,至于字段名称,见名知意即可.\n\n\n\npublic class Document {\n\t// 省略其它字段...\n\tprivate String location;\n private String geoLocation;\n}\n\n\n1\n2\n3\n4\n5\n\n\n\n# GeoBoundingBox\n\nGeoBoundingBox: 直译为地理边界盒,由左上点和右下点构成的矩形范围,在此范围内的点均可以被查询出来,实际使用的并不多,可参考下图:\n\n\n\n# API\n\n// 在矩形内\ngeoBoundingBox(R column, GeoPoint topLeft, GeoPoint bottomRight);\n\n// 不在矩形内 (0.9.7+版本支持)\nnotInGeoBoundingBox(R column, GeoPoint topLeft, GeoPoint bottomRight); \n\n\n1\n2\n3\n4\n5\n\n\n\n# 使用示例\n\n@Test\n public void testGeoBoundingBox() {\n // 查询位于左上点和右下点坐标构成的长方形内的所有点\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n // 假设左上点坐标\n GeoPoint leftTop = new GeoPoint(41.187328D, 115.498353D);\n // 假设右下点坐标\n GeoPoint bottomRight = new GeoPoint(39.084509D, 117.610461D);\n wrapper.geoBoundingBox(Document::getLocation, leftTop, bottomRight);\n\n // 查不在此长方形内的所有点\n // wrapper.notInGeoBoundingBox(Document::getLocation, leftTop, bottomRight);\n\n List documents = documentMapper.selectList(wrapper);\n documents.forEach(System.out::println);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n\n\n温馨提示\n\n 1. 上面使用示例仅演示了其中一种,实际上本框架中坐标点的语法支持非常多种,ElasticSearch官方提供的几种数据格式都支持,用户可按自己习惯自行选择对应的api进行查询参数构造:\n\n * GeoPoint:上面Demo中使用的经纬度表示方式\n * 经纬度数组: [116.498353, 40.187328],[116.610461, 40.084509]\n * 经纬度字符串: "40.187328, 116.498353","116.610461, 40.084509"\n * 经纬度边界框WKT: "BBOX (116.498353,116.610461,40.187328,40.084509)"\n * 经纬度GeoHash(哈希): "xxx"\n\n其中,经纬度哈希的转换可参考此网站:GeoHash坐标在线转换\n\n\n# GeoDistance\n\nGeoDistance:直译为地理距离,实际上就是以给定的点为圆心,给定的半径画个圆,处在此圆内的点都能被查出来,使用较为高频,比如像我们用的外卖软件,查询周围3公里内的所有店铺,就可以用此功能去实现,没错你还可以用来写YP软件,查询下附近三公里内的PLMM...\n\n\n\n\n# API\n\n// 查圆形内的所有点\ngeoDistance(R column, Double distance, DistanceUnit distanceUnit, GeoPoint centralGeoPoint);\n\n// 查不在圆形内的所有点 (0.9.7+ 版本支持)\nnotInGeoDistance(R column, Double distance, DistanceUnit distanceUnit, GeoPoint centralGeoPoint);\n\n\n1\n2\n3\n4\n5\n\n\n\n# 使用示例\n\n @Test\n public void testGeoDistance() {\n // 查询以经度为41.0,纬度为115.0为圆心,半径168.8公里内的所有点\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n // 其中单位可以省略,默认为km\n wrapper.geoDistance(Document::getLocation, 168.8, DistanceUnit.KILOMETERS, new GeoPoint(41.0, 116.0));\n\n //查询不在圆形内的所有点\n // wrapper.notInGeoDistance(Document::getLocation, 168.8, DistanceUnit.KILOMETERS, new GeoPoint(41.0, 116.0));\n\n // 上面语法也可以写成下面这几种形式,效果是一样的,兼容不同用户习惯而已:\n// wrapper.geoDistance(Document::getLocation,"1.5km",new GeoPoint(41.0,115.0));\n// wrapper.geoDistance(Document::getLocation, "1.5km", "41.0,115.0");\n\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n\n\n温馨提示\n\n 1. 同样的对于坐标点的表达形式也支持多种,和GeoBondingBox中的Tips介绍的一样,这里不再赘述.\n 2. 对于宠粉的EE来说,兼容各种用户的不同习惯是理所当然的,所以你在使用时会发现大量方法重载,选一种最符合你使用习惯或符合指定使用场景的api进行调用即可.\n\n\n# GeoPolygon\n\nGeoPolygon:直译为地理多边形,实际上就是以给定的所有点构成的多边形为范围,查询此范围内的所有点,此功能常被用来做电子围栏,使用也较为高频,像共享单车可以停放的区域就可以通过此技术实现,可参考下图:\n\n\n\n\n# API\n\ngeoPolygon(R column, List geoPoints)\n\n\n1\n\n\n\n# 使用示例\n\n @Test\n public void testGeoPolygon() {\n // 查询以给定点列表构成的不规则图形内的所有点,点数至少为3个\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n List geoPoints = new ArrayList<>();\n GeoPoint geoPoint = new GeoPoint(40.178012, 116.577188);\n GeoPoint geoPoint1 = new GeoPoint(40.169329, 116.586315);\n GeoPoint geoPoint2 = new GeoPoint(40.178288, 116.591813);\n geoPoints.add(geoPoint);\n geoPoints.add(geoPoint1);\n geoPoints.add(geoPoint2);\n wrapper.geoPolygon(Document::getLocation, geoPoints);\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n\n\n温馨提示\n\n 1. 同样的,关于坐标点的入参形式,也支持多种,与官方一致,可以参考GeoBoundingBox中的Tips,这里不赘述.值得注意的是多边形的点数不能少于3个,否则Es无法勾勒出多边形,本次查询会报错.\n 2. 索引类型和字段类型与GeoBondingBox中的Tips介绍的一样\n\n\n# GeoShape\n\nGeoShape:直译为地理图形,怎么理解?乍一看好像和GeoPolygon很像,但实际上,前面三种类型查询的都是坐标点,而此方法查询的是图形,比如一个园区,从世界地图上看可以把它当做一个点,但如果放得足够大,比如把地图具体到杭州市滨江区,园区就可能变成若干个点构成的一个区域,在一些特殊的场景中,需要查询此完整的区域,以及两个区域的交集之类的,就需要用到GeoShape了,如果你还不理解,不妨先接着往下看,以杭州为例,我举一个健康码的例子,假设黑色圈内区域为中风险地区,我现在要查出ES中所有在市民中心且处于中风险区域的人,把他们的健康码统统变成橙色,那实际上我要找的就是下图中橙色那块区域,此时红色箭头所构成的区域是整个市民中心,我可以把整个市民中心作为一个地理图形,然后把黑色大圆作为查询的图形,找出它们的交集即可.\n\n\n\n上图对应的ShapeRelation为INTERSECTS,看以看下面API.\n\n\n# API\n\n// 查询符合已索引图形的图形\ngeoShape(R column, String indexedShapeId);\n\n// 查询不符合已索引图形的图形 (0.9.7+ 版本支持)\nnotInGeoShape(R column, String indexedShapeId);\n\n// 查询符合指定图形和图形关系的图形列表\ngeoShape(R column, Geometry geometry, ShapeRelation shapeRelation);\n\n// 查询不符合指定图形和图形关系的图形列表\nnotInGeoShape(R column, Geometry geometry, ShapeRelation shapeRelation);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\n\n# 使用示例\n\n此API不常用,也可直接跳过看下面通过图形查询的.\n\n /**\n * 已知图形索引ID(不常用)\n * 在一些高频场景下,比如一个已经造好的园区,其图形坐标是固定的,因此可以先把这种固定的图形先存进es\n * 后续可根据此图形的id直接查询,比较方便,故有此方法,但不够灵活,不常用\n */\n @Test\n public void testGeoShapeWithShapeId() {\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n // 这里的indexedShapeId为用户事先已经在Es中创建好的图形的id\n wrapper.geoShape(Document::getGeoLocation, "edu");\n\n // 不符合的情况\n // wrapper.notInGeoShape(Document::getGeoLocation, "edu");\n\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n\n\n此API相较上面方式更常用,即用户可以自行指定要查询的图形是矩形,圆形,还是多边形...(具体看代码中注释):\n\n /**\n * 图形由用户自定义(常用),本框架支持Es所有支持的图形:\n * (Point,MultiPoint,Line,MultiLine,Circle,LineaRing,Polygon,MultiPolygon,Rectangle)\n */\n @Test\n public void testGeoShape() {\n // 注意,这里查询的是图形,所以图形的字段索引类型必须为geoShape,不能为geoPoint,故这里用geoLocation字段而非location字段\n LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>();\n // 这里以矩形为例演示,其中x,y为圆心坐标,r为半径. 其它图形请读者自行演示,篇幅原因不一一演示了\n Circle circle = new Circle(13,14,100);\n // shapeRelation支持多种,如果不传则默认为within\n wrapper.geoShape(Document::getGeoLocation, circle, ShapeRelation.INTERSECTS);\n\n // 不符合的情况\n // wrapper.notInGeoShape(Document::getGeoLocation, circle, ShapeRelation.INTERSECTS);\n\n List documents = documentMapper.selectList(wrapper);\n System.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n\n\n上述地图中的 市民中心(多边形)的WKT(Well-Known Text)坐标(模拟的数据,真实数据可从高德地图/百度地图等通过 调用它们提供的开放API获取):\n\n"POLYGON((108.36549282073975 22.797566864832092,108.35974216461182 22.786093175673713,108.37265968322754 22.775963875498206,108.4035587310791 22.77600344454008,108.41003894805907 22.787557113881462,108.39557647705077 22.805360509802284,108.36549282073975 22.797566864832092))";\n\n已经存储在Es中了,实际上我们在项目中都会把可能用到的数据或业务数据都事先存入Es了,否则查询也就无意义了,查个空气? 所以上面API根据GeoShape查询时,需要传入的参数的仅是你圈定的范围的图形(上面该参数是圆).\n\n温馨提示\n\nGeoShape容易和GeoPolygon混淆,需要特别注意,它俩其实是两种不同的东西,其索引类型也需要区别,前者为geo_point,后者为geo_shape。',normalizedContent:'提示\n\n地理位置查询,与es官方提供的功能完全一致,共支持4种类型的地理位置查询:\n\n * geoboundingbox\n * geodistance\n * geopolygon\n * geoshape\n\n通过这4类查询,可以实现各种强大实用的功能\n\n应用场景\n\n * 外卖类app 附近的门店\n * 社交类app 附近的人\n * 打车类app 附近的司机\n * 区域人群画像类app 指定范围内的人群特征提取\n * 健康码等\n * ...\n\nee对es地理位置相关功能支持覆盖100%,且使用更为简单.\n\n注意事项\n\n 1. 在使用地理位置查询api之前,需要提前创建或更新好索引\n * 划重点:其中前三类api(geoboundingbox,geodistance,geopolygon)字段索引类型必须为geo_point\n * geoshape字段索引类型必须为geo_shape,否则将导致功能无法正常使用,具体可参考下图\n 2. 字段类型推荐使用string,因为wkt文本格式就是string,非常方便,至于字段名称,见名知意即可.\n\n\n\npublic class document {\n\t// 省略其它字段...\n\tprivate string location;\n private string geolocation;\n}\n\n\n1\n2\n3\n4\n5\n\n\n\n# geoboundingbox\n\ngeoboundingbox: 直译为地理边界盒,由左上点和右下点构成的矩形范围,在此范围内的点均可以被查询出来,实际使用的并不多,可参考下图:\n\n\n\n# api\n\n// 在矩形内\ngeoboundingbox(r column, geopoint topleft, geopoint bottomright);\n\n// 不在矩形内 (0.9.7+版本支持)\nnotingeoboundingbox(r column, geopoint topleft, geopoint bottomright); \n\n\n1\n2\n3\n4\n5\n\n\n\n# 使用示例\n\n@test\n public void testgeoboundingbox() {\n // 查询位于左上点和右下点坐标构成的长方形内的所有点\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n // 假设左上点坐标\n geopoint lefttop = new geopoint(41.187328d, 115.498353d);\n // 假设右下点坐标\n geopoint bottomright = new geopoint(39.084509d, 117.610461d);\n wrapper.geoboundingbox(document::getlocation, lefttop, bottomright);\n\n // 查不在此长方形内的所有点\n // wrapper.notingeoboundingbox(document::getlocation, lefttop, bottomright);\n\n list documents = documentmapper.selectlist(wrapper);\n documents.foreach(system.out::println);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n\n\n温馨提示\n\n 1. 上面使用示例仅演示了其中一种,实际上本框架中坐标点的语法支持非常多种,elasticsearch官方提供的几种数据格式都支持,用户可按自己习惯自行选择对应的api进行查询参数构造:\n\n * geopoint:上面demo中使用的经纬度表示方式\n * 经纬度数组: [116.498353, 40.187328],[116.610461, 40.084509]\n * 经纬度字符串: "40.187328, 116.498353","116.610461, 40.084509"\n * 经纬度边界框wkt: "bbox (116.498353,116.610461,40.187328,40.084509)"\n * 经纬度geohash(哈希): "xxx"\n\n其中,经纬度哈希的转换可参考此网站:geohash坐标在线转换\n\n\n# geodistance\n\ngeodistance:直译为地理距离,实际上就是以给定的点为圆心,给定的半径画个圆,处在此圆内的点都能被查出来,使用较为高频,比如像我们用的外卖软件,查询周围3公里内的所有店铺,就可以用此功能去实现,没错你还可以用来写yp软件,查询下附近三公里内的plmm...\n\n\n\n\n# api\n\n// 查圆形内的所有点\ngeodistance(r column, double distance, distanceunit distanceunit, geopoint centralgeopoint);\n\n// 查不在圆形内的所有点 (0.9.7+ 版本支持)\nnotingeodistance(r column, double distance, distanceunit distanceunit, geopoint centralgeopoint);\n\n\n1\n2\n3\n4\n5\n\n\n\n# 使用示例\n\n @test\n public void testgeodistance() {\n // 查询以经度为41.0,纬度为115.0为圆心,半径168.8公里内的所有点\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n // 其中单位可以省略,默认为km\n wrapper.geodistance(document::getlocation, 168.8, distanceunit.kilometers, new geopoint(41.0, 116.0));\n\n //查询不在圆形内的所有点\n // wrapper.notingeodistance(document::getlocation, 168.8, distanceunit.kilometers, new geopoint(41.0, 116.0));\n\n // 上面语法也可以写成下面这几种形式,效果是一样的,兼容不同用户习惯而已:\n// wrapper.geodistance(document::getlocation,"1.5km",new geopoint(41.0,115.0));\n// wrapper.geodistance(document::getlocation, "1.5km", "41.0,115.0");\n\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n\n\n温馨提示\n\n 1. 同样的对于坐标点的表达形式也支持多种,和geobondingbox中的tips介绍的一样,这里不再赘述.\n 2. 对于宠粉的ee来说,兼容各种用户的不同习惯是理所当然的,所以你在使用时会发现大量方法重载,选一种最符合你使用习惯或符合指定使用场景的api进行调用即可.\n\n\n# geopolygon\n\ngeopolygon:直译为地理多边形,实际上就是以给定的所有点构成的多边形为范围,查询此范围内的所有点,此功能常被用来做电子围栏,使用也较为高频,像共享单车可以停放的区域就可以通过此技术实现,可参考下图:\n\n\n\n\n# api\n\ngeopolygon(r column, list geopoints)\n\n\n1\n\n\n\n# 使用示例\n\n @test\n public void testgeopolygon() {\n // 查询以给定点列表构成的不规则图形内的所有点,点数至少为3个\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n list geopoints = new arraylist<>();\n geopoint geopoint = new geopoint(40.178012, 116.577188);\n geopoint geopoint1 = new geopoint(40.169329, 116.586315);\n geopoint geopoint2 = new geopoint(40.178288, 116.591813);\n geopoints.add(geopoint);\n geopoints.add(geopoint1);\n geopoints.add(geopoint2);\n wrapper.geopolygon(document::getlocation, geopoints);\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n\n\n温馨提示\n\n 1. 同样的,关于坐标点的入参形式,也支持多种,与官方一致,可以参考geoboundingbox中的tips,这里不赘述.值得注意的是多边形的点数不能少于3个,否则es无法勾勒出多边形,本次查询会报错.\n 2. 索引类型和字段类型与geobondingbox中的tips介绍的一样\n\n\n# geoshape\n\ngeoshape:直译为地理图形,怎么理解?乍一看好像和geopolygon很像,但实际上,前面三种类型查询的都是坐标点,而此方法查询的是图形,比如一个园区,从世界地图上看可以把它当做一个点,但如果放得足够大,比如把地图具体到杭州市滨江区,园区就可能变成若干个点构成的一个区域,在一些特殊的场景中,需要查询此完整的区域,以及两个区域的交集之类的,就需要用到geoshape了,如果你还不理解,不妨先接着往下看,以杭州为例,我举一个健康码的例子,假设黑色圈内区域为中风险地区,我现在要查出es中所有在市民中心且处于中风险区域的人,把他们的健康码统统变成橙色,那实际上我要找的就是下图中橙色那块区域,此时红色箭头所构成的区域是整个市民中心,我可以把整个市民中心作为一个地理图形,然后把黑色大圆作为查询的图形,找出它们的交集即可.\n\n\n\n上图对应的shaperelation为intersects,看以看下面api.\n\n\n# api\n\n// 查询符合已索引图形的图形\ngeoshape(r column, string indexedshapeid);\n\n// 查询不符合已索引图形的图形 (0.9.7+ 版本支持)\nnotingeoshape(r column, string indexedshapeid);\n\n// 查询符合指定图形和图形关系的图形列表\ngeoshape(r column, geometry geometry, shaperelation shaperelation);\n\n// 查询不符合指定图形和图形关系的图形列表\nnotingeoshape(r column, geometry geometry, shaperelation shaperelation);\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n\n\n\n# 使用示例\n\n此api不常用,也可直接跳过看下面通过图形查询的.\n\n /**\n * 已知图形索引id(不常用)\n * 在一些高频场景下,比如一个已经造好的园区,其图形坐标是固定的,因此可以先把这种固定的图形先存进es\n * 后续可根据此图形的id直接查询,比较方便,故有此方法,但不够灵活,不常用\n */\n @test\n public void testgeoshapewithshapeid() {\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n // 这里的indexedshapeid为用户事先已经在es中创建好的图形的id\n wrapper.geoshape(document::getgeolocation, "edu");\n\n // 不符合的情况\n // wrapper.notingeoshape(document::getgeolocation, "edu");\n\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n\n\n此api相较上面方式更常用,即用户可以自行指定要查询的图形是矩形,圆形,还是多边形...(具体看代码中注释):\n\n /**\n * 图形由用户自定义(常用),本框架支持es所有支持的图形:\n * (point,multipoint,line,multiline,circle,linearing,polygon,multipolygon,rectangle)\n */\n @test\n public void testgeoshape() {\n // 注意,这里查询的是图形,所以图形的字段索引类型必须为geoshape,不能为geopoint,故这里用geolocation字段而非location字段\n lambdaesquerywrapper wrapper = new lambdaesquerywrapper<>();\n // 这里以矩形为例演示,其中x,y为圆心坐标,r为半径. 其它图形请读者自行演示,篇幅原因不一一演示了\n circle circle = new circle(13,14,100);\n // shaperelation支持多种,如果不传则默认为within\n wrapper.geoshape(document::getgeolocation, circle, shaperelation.intersects);\n\n // 不符合的情况\n // wrapper.notingeoshape(document::getgeolocation, circle, shaperelation.intersects);\n\n list documents = documentmapper.selectlist(wrapper);\n system.out.println(documents);\n }\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n\n\n上述地图中的 市民中心(多边形)的wkt(well-known text)坐标(模拟的数据,真实数据可从高德地图/百度地图等通过 调用它们提供的开放api获取):\n\n"polygon((108.36549282073975 22.797566864832092,108.35974216461182 22.786093175673713,108.37265968322754 22.775963875498206,108.4035587310791 22.77600344454008,108.41003894805907 22.787557113881462,108.39557647705077 22.805360509802284,108.36549282073975 22.797566864832092))";\n\n已经存储在es中了,实际上我们在项目中都会把可能用到的数据或业务数据都事先存入es了,否则查询也就无意义了,查个空气? 所以上面api根据geoshape查询时,需要传入的参数的仅是你圈定的范围的图形(上面该参数是圆).\n\n温馨提示\n\ngeoshape容易和geopolygon混淆,需要特别注意,它俩其实是两种不同的东西,其索引类型也需要区别,前者为geo_point,后者为geo_shape。',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"MySQL和EE语法对比",frontmatter:{title:"MySQL和EE语法对比",date:"2022-06-23T16:47:53.000Z",permalink:"/pages/6fea40/"},regularPath:"/v1.0.0/060.%E5%85%B6%E5%AE%83/030.MySQL%E5%92%8CEE%E8%AF%AD%E6%B3%95%E5%AF%B9%E6%AF%94.html",relativePath:"v1.0.0/060.其它/030.MySQL和EE语法对比.md",key:"v-57c32053",path:"/pages/6fea40/",headers:[{level:2,title:"MySQL和Easy-Es语法对照表",slug:"mysql和easy-es语法对照表",normalizedTitle:"mysql和easy-es语法对照表",charIndex:2}],headersStr:"MySQL和Easy-Es语法对照表",content:"# MySQL和Easy-Es语法对照表\n\nMYSQL EASY-ES\nand and\nor or\n= eq\n!= ne\n> gt\n>= ge\n< lt\n<= le\nlike '%field%' like\nnot like '%field%' notLike\nlike '%field' likeLeft\nlike 'field%' likeRight\nbetween between\nnotBetween notBetween\nis null isNull\nis notNull isNotNull\nin in\nnot in notIn\ngroup by groupBy\norder by orderBy\nmin min\nmax max\navg avg\nsum sum\nsum sum\n- orderByAsc\n- orderByDesc\n- match\n- highLight\n... ...",normalizedContent:"# mysql和easy-es语法对照表\n\nmysql easy-es\nand and\nor or\n= eq\n!= ne\n> gt\n>= ge\n< lt\n<= le\nlike '%field%' like\nnot like '%field%' notlike\nlike '%field' likeleft\nlike 'field%' likeright\nbetween between\nnotbetween notbetween\nis null isnull\nis notnull isnotnull\nin in\nnot in notin\ngroup by groupby\norder by orderby\nmin min\nmax max\navg avg\nsum sum\nsum sum\n- orderbyasc\n- orderbydesc\n- match\n- highlight\n... ...",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"与MP差异",frontmatter:{title:"与MP差异",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/98d3d3/"},regularPath:"/v1.0.0/060.%E5%85%B6%E5%AE%83/020.%E4%B8%8EMP%E5%B7%AE%E5%BC%82.html",relativePath:"v1.0.0/060.其它/020.与MP差异.md",key:"v-ffbd0264",path:"/pages/98d3d3/",headers:[{level:2,title:"1.命名差异",slug:"_1-命名差异",normalizedTitle:"1.命名差异",charIndex:118},{level:2,title:"2.移除了Service",slug:"_2-移除了service",normalizedTitle:"2.移除了service",charIndex:514},{level:2,title:"3.方法差异",slug:"_3-方法差异",normalizedTitle:"3.方法差异",charIndex:732}],headersStr:"1.命名差异 2.移除了Service 3.方法差异",content:'提示\n\n为了减少开发者的额外学习负担,我们尽量保持了和MP几乎一致的语法,但为了避免歧义,仍有个别地方存在些许差异,毕竟ES和MySQL有很多地方不一样,无论如何,在你看完这些差异和原因后,你肯定也会赞同这种差异存在的必要性.\n\n\n# 1.命名差异\n\n为了区别MP的命名带来的歧义问题,以下三处命名中我们加了Es字母区别于MP:\n\n MP EE 差异原因\n启动类注解 @MapperScan("xxx") @EsMapperScan("xxx") 一个项目中可能会同时用到MP和EE,避免同一系统中同时引入同名注解时,需要加全路径区分\n父类Mapper命名 BaseMapper BaseEsMapper 一个项目中可能会同时用到MP和EE,避免继承时误继承到MP的Mapper\n条件构造器命名 LambdaQueryWrapper LambdaEsQueryWrapper 一个项目中可能会同时用到MP和EE,避免错误创建条件构造器\n\n\n# 2.移除了Service\n\nMP中引入了Service层,但EE中并无Service层,因为我个人认为MP的Service层太重了,不够灵活,实际开发中基本不用,被很多人吐槽,所以EE中我直接去掉了Service层,在使用过程中你无需像MP那样继承ISevice,另外我把一些高频使用的service层封装的方法下沉到了mapper层,比如批量更新,批量新增等,大家可以在调用基类Mapper层中的方法时看到,灵活且不失优雅.\n\n\n# 3.方法差异\n\ngroup by 聚合在EE中使用groupBy方法时,调用查询接口必须使用获取原生返回内容,不能像MP中一样返回泛型T,这点是由于ES和MySQL的差导致的,所以需要特别注意\n\n\nLambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>();\nwrapper.groupBy(T::getField);\n\n// MP语法\nList list = xxxMapper.selectList(wrapper);\n// EE语法\nSearchResponse response = xxxMapper.search(wrapper); \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n因为Es会把聚合的结果单独放到aggregations对象中,但原来的实体对象中并无此字段,所以我们需要用SearchResponse接收查询返回的结果,我们所需要的所有查询信息都可以从SearchResponse中获取.\n\n"aggregations":{"sterms#creator":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":"老汉","doc_count":2},{"key":"老王","doc_count":1}]}}\n\n\n1\n\n\n移除了几个我目前还没看到使用场景的方法:\n\nhaving(String sqlHaving, Object... params)\nhaving(boolean condition, String sqlHaving, Object... params)\nfunc(Consumer consumer)\nfunc(boolean condition, Consumer consumer)\n\n\n1\n2\n3\n4\n\n\n新增了一些EE有但MP不支持的方法:\n\n// 索引创建相关\nBoolean existsIndex(String indexName);\nBoolean createIndex(LambdaEsIndexWrapper wrapper);\nBoolean updateIndex(LambdaEsIndexWrapper wrapper);\nBoolean deleteIndex(String indexName);\n\n// 权重\nfunction(字段, 值, Float 权重值)\n\n// Geo 地理位置相关\ngeoBoundingBox(R column, GeoPoint topLeft, GeoPoint bottomRight);\ngeoDistance(R column, Double distance, DistanceUnit distanceUnit, GeoPoint centralGeoPoint);\ngeoPolygon(R column, List geoPoints)geoShape(R column, String indexedShapeId);\ngeoShape(R column, String indexedShapeId);\ngeoShape(R column, Geometry geometry, ShapeRelation shapeRelation);\n\n// 其它...\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n\n\n除了需要注意以上列出的这些小差异,其余地方和MP并无明显差异,使用者完全可以像使用MP一样使用EE',normalizedContent:'提示\n\n为了减少开发者的额外学习负担,我们尽量保持了和mp几乎一致的语法,但为了避免歧义,仍有个别地方存在些许差异,毕竟es和mysql有很多地方不一样,无论如何,在你看完这些差异和原因后,你肯定也会赞同这种差异存在的必要性.\n\n\n# 1.命名差异\n\n为了区别mp的命名带来的歧义问题,以下三处命名中我们加了es字母区别于mp:\n\n mp ee 差异原因\n启动类注解 @mapperscan("xxx") @esmapperscan("xxx") 一个项目中可能会同时用到mp和ee,避免同一系统中同时引入同名注解时,需要加全路径区分\n父类mapper命名 basemapper baseesmapper 一个项目中可能会同时用到mp和ee,避免继承时误继承到mp的mapper\n条件构造器命名 lambdaquerywrapper lambdaesquerywrapper 一个项目中可能会同时用到mp和ee,避免错误创建条件构造器\n\n\n# 2.移除了service\n\nmp中引入了service层,但ee中并无service层,因为我个人认为mp的service层太重了,不够灵活,实际开发中基本不用,被很多人吐槽,所以ee中我直接去掉了service层,在使用过程中你无需像mp那样继承isevice,另外我把一些高频使用的service层封装的方法下沉到了mapper层,比如批量更新,批量新增等,大家可以在调用基类mapper层中的方法时看到,灵活且不失优雅.\n\n\n# 3.方法差异\n\ngroup by 聚合在ee中使用groupby方法时,调用查询接口必须使用获取原生返回内容,不能像mp中一样返回泛型t,这点是由于es和mysql的差导致的,所以需要特别注意\n\n\nlambdaesupdatewrapper wrapper = new lambdaesupdatewrapper<>();\nwrapper.groupby(t::getfield);\n\n// mp语法\nlist list = xxxmapper.selectlist(wrapper);\n// ee语法\nsearchresponse response = xxxmapper.search(wrapper); \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n因为es会把聚合的结果单独放到aggregations对象中,但原来的实体对象中并无此字段,所以我们需要用searchresponse接收查询返回的结果,我们所需要的所有查询信息都可以从searchresponse中获取.\n\n"aggregations":{"sterms#creator":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":"老汉","doc_count":2},{"key":"老王","doc_count":1}]}}\n\n\n1\n\n\n移除了几个我目前还没看到使用场景的方法:\n\nhaving(string sqlhaving, object... params)\nhaving(boolean condition, string sqlhaving, object... params)\nfunc(consumer consumer)\nfunc(boolean condition, consumer consumer)\n\n\n1\n2\n3\n4\n\n\n新增了一些ee有但mp不支持的方法:\n\n// 索引创建相关\nboolean existsindex(string indexname);\nboolean createindex(lambdaesindexwrapper wrapper);\nboolean updateindex(lambdaesindexwrapper wrapper);\nboolean deleteindex(string indexname);\n\n// 权重\nfunction(字段, 值, float 权重值)\n\n// geo 地理位置相关\ngeoboundingbox(r column, geopoint topleft, geopoint bottomright);\ngeodistance(r column, double distance, distanceunit distanceunit, geopoint centralgeopoint);\ngeopolygon(r column, list geopoints)geoshape(r column, string indexedshapeid);\ngeoshape(r column, string indexedshapeid);\ngeoshape(r column, geometry geometry, shaperelation shaperelation);\n\n// 其它...\n\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n\n\n除了需要注意以上列出的这些小差异,其余地方和mp并无明显差异,使用者完全可以像使用mp一样使用ee',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"参与贡献",frontmatter:{title:"参与贡献",date:"2022-06-20T17:45:48.000Z",permalink:"/pages/7d828w/"},regularPath:"/%E5%8F%82%E4%B8%8E%E8%B4%A1%E7%8C%AE.html",relativePath:"参与贡献.md",key:"v-1de24003",path:"/pages/7d828w/",headers:[{level:2,title:"要求",slug:"要求",normalizedTitle:"要求",charIndex:37},{level:2,title:"如何加入开发团队",slug:"如何加入开发团队",normalizedTitle:"如何加入开发团队",charIndex:143},{level:2,title:"如何认领任务",slug:"如何认领任务",normalizedTitle:"如何认领任务",charIndex:221},{level:2,title:"提交PR",slug:"提交pr",normalizedTitle:"提交pr",charIndex:322},{level:2,title:"注释以及Comment的要求",slug:"注释以及comment的要求",normalizedTitle:"注释以及comment的要求",charIndex:609},{level:2,title:"写代码时要注意的点",slug:"写代码时要注意的点",normalizedTitle:"写代码时要注意的点",charIndex:952},{level:2,title:"我想对Committer说的话",slug:"我想对committer说的话",normalizedTitle:"我想对committer说的话",charIndex:1182}],headersStr:"要求 如何加入开发团队 如何认领任务 提交PR 注释以及Comment的要求 写代码时要注意的点 我想对Committer说的话",content:"欢迎您加入和我们一起贡献Easy-Es,让这个项目变的越来越好。\n\n\n# 要求\n\n社区有很多童鞋愿意贡献这个项目,如果你想参与开发,成为committer,有以下要求:\n\n * 需要对开源有热情,技术扎实,有一颗用爱发电的心。\n\n * 需要有一定空余时间能参与开发和阅读源码。\n\n\n# 如何加入开发团队\n\n首先你需要加入Easy-Es的社区群,如何加入请参考加入社区讨论,然后私聊我,表示有意成为开发者。\n\n我会把你拉入开发者团队。\n\n\n# 如何认领任务\n\n我会不定期的在开发者团队群里push出一些issue,采用自己认领的方式。\n\n在相关issue下回复“认领”就可以了,不用在群里回复。如果已经有相关人员认领了,请不要重复认领。\n\n\n# 提交PR\n\nEasy-Es的PR统一在Gitee平台上进行提交,如果你不知道如何提交PR,可以在Gitee平台里去学习。这里不作说明。\n\n提PR有以下注意点。\n\n * fork后切换到feature分支,请以这个分支为开发基准。\n * 所有的PR提交到feature分支,这个分支为开发分支。\n * 如果你作了功能性的变动,请带上你的测试用例,测试用例规范可以参考之前的测试用例。\n * 所有的PR必须关联至少一个issue,如果没有相关issue,请自行创建一个。\n * 正式提交PR之前,请确保所有的测试用例都通过。\n * 提交信息,均要符合要求,下面有讲述。\n\n\n# 注释以及Comment的要求\n\n在文件头上,一定得有相关头注释信息,请按照规范,如下所示:\n\n/**\n * 这是你对这个类的描述,如比较长,多行也行\n * @author 老汉\n * @since 2.6.4\n */\npublic class YourClass{\n\t...\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n相关重要代码,为了保证阅读性,也请加上必要的注释, 并尽量遵循阿里巴巴代码开发规约\n\n提交的时候comment也要按照规范来填写:\n\n#bug/future/enhancement/ #issue号 这是你issue的中文描述\n\n\n1\n\n\n举例:\n\nenhancemnet #I595MU 在slot的元数据里增加每个组件执行的耗时和是否成功结果\n\n\n1\n\n\n\n# 写代码时要注意的点\n\n开源框架的代码质量的要求会比较高,不仅是实现那么简单,还要考虑到各个环境的兼容性,优雅性和可读性。\n\n所以在写代码时要多想一下。我相信,高标准高要求才能塑造一个优秀的框架, 这对您未来的技术成长也会非常有帮助。\n\n在代码合并时,我会在PR下面给出修改意见,可能会比较苛刻,吹毛求疵。请大家谅解,完全是针对代码质量而不是针\n\n对谁。开源项目要想长久发展,代码质量肯定是要严格把控的,否则这么多开发者,人手一套风格,最终将难以维护。\n\n\n# 我想对Committer说的话\n\n熟读代码+完成一个issue并合并到master分支的时候,我会邀请你成为LiteFlow的Committer,通常会在发版前统一邀请。\n\n虽然原则上只需要完成一个issue,issue本身难易程度也有区别,但我希望作为贡献者的你不要满足只提交一个issue,希望\n\n你能成为长期的Committer,来一起参与LiteFlow这个框架的迭代和发展和决策讨论中。只有这样,开源框架才能发展的更\n\n加蓬勃,开源也会作为你成长和技术提高的途径。",normalizedContent:"欢迎您加入和我们一起贡献easy-es,让这个项目变的越来越好。\n\n\n# 要求\n\n社区有很多童鞋愿意贡献这个项目,如果你想参与开发,成为committer,有以下要求:\n\n * 需要对开源有热情,技术扎实,有一颗用爱发电的心。\n\n * 需要有一定空余时间能参与开发和阅读源码。\n\n\n# 如何加入开发团队\n\n首先你需要加入easy-es的社区群,如何加入请参考加入社区讨论,然后私聊我,表示有意成为开发者。\n\n我会把你拉入开发者团队。\n\n\n# 如何认领任务\n\n我会不定期的在开发者团队群里push出一些issue,采用自己认领的方式。\n\n在相关issue下回复“认领”就可以了,不用在群里回复。如果已经有相关人员认领了,请不要重复认领。\n\n\n# 提交pr\n\neasy-es的pr统一在gitee平台上进行提交,如果你不知道如何提交pr,可以在gitee平台里去学习。这里不作说明。\n\n提pr有以下注意点。\n\n * fork后切换到feature分支,请以这个分支为开发基准。\n * 所有的pr提交到feature分支,这个分支为开发分支。\n * 如果你作了功能性的变动,请带上你的测试用例,测试用例规范可以参考之前的测试用例。\n * 所有的pr必须关联至少一个issue,如果没有相关issue,请自行创建一个。\n * 正式提交pr之前,请确保所有的测试用例都通过。\n * 提交信息,均要符合要求,下面有讲述。\n\n\n# 注释以及comment的要求\n\n在文件头上,一定得有相关头注释信息,请按照规范,如下所示:\n\n/**\n * 这是你对这个类的描述,如比较长,多行也行\n * @author 老汉\n * @since 2.6.4\n */\npublic class yourclass{\n\t...\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n\n\n相关重要代码,为了保证阅读性,也请加上必要的注释, 并尽量遵循阿里巴巴代码开发规约\n\n提交的时候comment也要按照规范来填写:\n\n#bug/future/enhancement/ #issue号 这是你issue的中文描述\n\n\n1\n\n\n举例:\n\nenhancemnet #i595mu 在slot的元数据里增加每个组件执行的耗时和是否成功结果\n\n\n1\n\n\n\n# 写代码时要注意的点\n\n开源框架的代码质量的要求会比较高,不仅是实现那么简单,还要考虑到各个环境的兼容性,优雅性和可读性。\n\n所以在写代码时要多想一下。我相信,高标准高要求才能塑造一个优秀的框架, 这对您未来的技术成长也会非常有帮助。\n\n在代码合并时,我会在pr下面给出修改意见,可能会比较苛刻,吹毛求疵。请大家谅解,完全是针对代码质量而不是针\n\n对谁。开源项目要想长久发展,代码质量肯定是要严格把控的,否则这么多开发者,人手一套风格,最终将难以维护。\n\n\n# 我想对committer说的话\n\n熟读代码+完成一个issue并合并到master分支的时候,我会邀请你成为liteflow的committer,通常会在发版前统一邀请。\n\n虽然原则上只需要完成一个issue,issue本身难易程度也有区别,但我希望作为贡献者的你不要满足只提交一个issue,希望\n\n你能成为长期的committer,来一起参与liteflow这个框架的迭代和发展和决策讨论中。只有这样,开源框架才能发展的更\n\n加蓬勃,开源也会作为你成长和技术提高的途径。",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"版权",frontmatter:{title:"版权",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/796d01/"},regularPath:"/v1.0.0/060.%E5%85%B6%E5%AE%83/060.%E7%89%88%E6%9D%83.html",relativePath:"v1.0.0/060.其它/060.版权.md",key:"v-deae6af8",path:"/pages/796d01/",headersStr:null,content:"本框架为了保持与MP一致的语法,有部分代码来源于开源框架Mybatis-Plus,或是对其做了修改,在此特别声明.\n\n本框架底层使用了ElasticSearch官方开源框架RestHighLevelClient,在此特别声明.\n\n本框架采用和Mybatis-plus一样的Apache2.0开源协议,并且承诺永不参与商业用途,仅供大家无偿使用.",normalizedContent:"本框架为了保持与mp一致的语法,有部分代码来源于开源框架mybatis-plus,或是对其做了修改,在此特别声明.\n\n本框架底层使用了elasticsearch官方开源框架resthighlevelclient,在此特别声明.\n\n本框架采用和mybatis-plus一样的apache2.0开源协议,并且承诺永不参与商业用途,仅供大家无偿使用.",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"更新日志",frontmatter:{title:"更新日志",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/b65406/"},regularPath:"/v1.0.0/060.%E5%85%B6%E5%AE%83/040.%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97.html",relativePath:"v1.0.0/060.其它/040.更新日志.md",key:"v-6b697dfa",path:"/pages/b65406/",headersStr:null,content:"...\n\nv0.9.12\n\nv0.9.13\n\nv0.9.14\n\nv0.9.15\n\nv0.9.16\n\n...\n\nv0.9.40\n\n持续更新中...\n\n提示\n\n已发布的版本会被用删除线标记",normalizedContent:"...\n\nv0.9.12\n\nv0.9.13\n\nv0.9.14\n\nv0.9.15\n\nv0.9.16\n\n...\n\nv0.9.40\n\n持续更新中...\n\n提示\n\n已发布的版本会被用删除线标记",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"更新计划",frontmatter:{title:"更新计划",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/e14b42/"},regularPath:"/v1.0.0/060.%E5%85%B6%E5%AE%83/050.%E6%9B%B4%E6%96%B0%E8%AE%A1%E5%88%92.html",relativePath:"v1.0.0/060.其它/050.更新计划.md",key:"v-4418951c",path:"/pages/e14b42/",headers:[{level:2,title:"版本更新计划",slug:"版本更新计划",normalizedTitle:"版本更新计划",charIndex:2},{level:2,title:"需求池",slug:"需求池",normalizedTitle:"需求池",charIndex:148}],headersStr:"版本更新计划 需求池",content:"# 版本更新计划\n\n期待已久的1.0稳定版连同全新官网和文档一起正式上线,届时将显著降低发版频率,因为功能已经基本上成熟且非常丰富了,可以放心的在生产环境投产使用. 后期的迭代也会更慢,力求稳如老狗,API稳定性将排在第一位,另外节省出来的时间会发更多力在项目推广上,让更多人用到EE.\n\n\n# 需求池\n\n> 需求池中需求待排期,看迭代规划,择期上线\n\n 1. xpack本地秘钥型权限校验模块配置功能 由网友@周立波邮件本人提出此需求支持 8.0+es才有,所以此需求预计将在很长时间之后才会支持\n 2. Percolate反向检索支持,由码云用户Earl提出\n 3. 提供插件支持按日/周/月/年等自定义规则自动生成索引并切换索引\n 4. 提供多数据源支持\n 5. 提供对各种非springboot框架的支持\n\n持续更新中...",normalizedContent:"# 版本更新计划\n\n期待已久的1.0稳定版连同全新官网和文档一起正式上线,届时将显著降低发版频率,因为功能已经基本上成熟且非常丰富了,可以放心的在生产环境投产使用. 后期的迭代也会更慢,力求稳如老狗,api稳定性将排在第一位,另外节省出来的时间会发更多力在项目推广上,让更多人用到ee.\n\n\n# 需求池\n\n> 需求池中需求待排期,看迭代规划,择期上线\n\n 1. xpack本地秘钥型权限校验模块配置功能 由网友@周立波邮件本人提出此需求支持 8.0+es才有,所以此需求预计将在很长时间之后才会支持\n 2. percolate反向检索支持,由码云用户earl提出\n 3. 提供插件支持按日/周/月/年等自定义规则自动生成索引并切换索引\n 4. 提供多数据源支持\n 5. 提供对各种非springboot框架的支持\n\n持续更新中...",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"鸣谢",frontmatter:{title:"鸣谢",date:"2022-06-21T09:02:50.000Z",permalink:"/pages/4d7703/"},regularPath:"/v1.0.0/060.%E5%85%B6%E5%AE%83/070.%E9%B8%A3%E8%B0%A2.html",relativePath:"v1.0.0/060.其它/070.鸣谢.md",key:"v-5a329570",path:"/pages/4d7703/",headersStr:null,content:'提示\n\n这里特别鸣谢国内最受欢迎的MySQL开源框架Mybatis-Plus的作者及所有参与开发者. 鸣谢ElasticSearch官方打造的开源框架RestHighLevelClient 的作者及其所有参与开发者. 感谢协助本人将语雀中数量庞大的Easy-Es英文文档悉数迁移至本站的"清风徐飘"先生,由衷感谢!\n\n感谢MP和ES官方开源如此强大又好用的框架,由此带来国内外无数开发者的解放,大幅提高了开发搬砖效率,由此给众多开发者节省了大量宝贵时间.也给我提供了创作灵感,可以说没有Mybatis-Plus就没有Easy-Es,当然未来也或许会有,但起码不会这么快和大家见面,也或许是其它作者开发. Mybatis-Plus和Easy-Es的关系,就像F22和歼20的关系,在框架开发的过程中,无论是为了兼容语法还是一些未知点的突破,MP都给予了恰到好处的指引,让我少走了很多弯路,把别人好几年走完的路,作为起点,站在巨人的肩膀上,由此打造出一款非常易用的ES-ORM框架.\n\n为了保持与MP99%相似度的语法,EE框架在开发过程中大量借鉴了MP源码,如果不深入底层看,仅看接口定义,会误以为是复制粘贴MP接口,但底层逻辑终究是不一样的,MP最终是将语法转换成String SQL, 而EE最终是将语法转换成JSON类型的ES语法,本质上还是有挺大差别,这里面依旧有很多创新点和难点需要突破,由于ES天然的复杂性和高门槛,开发EE的难度要远大于MP,期间有几个难点,一度让我产生放弃的念头,还好最后通过各种努力和思考,以及坚持不懈,完成了整个框架的开发,测试,文档撰写等.\n\n现在,我将此框架源码开源献给全球所有开发者,毕竟凝聚了国内外各路优秀开发者的思路,那才有可能打造真正的"Easyest",否则它只能是Easy-ES.\n\n如果本框架有在开发过程中帮您提高开发效率,节省了开发时间,不妨花几秒钟时间(打造此框架前后耗费大量光阴)给本框架在Git点个Star,让更多人看到并用到它,不做拿来主义者,从我做起!\n\n最后感谢每一位支持EE的您, 感谢您对EE的支持,谢谢! 也谢谢社区所有为EE贡献过建议及代码的伙伴,以及为了EE无私奉献的自己.\n\nby老汉',normalizedContent:'提示\n\n这里特别鸣谢国内最受欢迎的mysql开源框架mybatis-plus的作者及所有参与开发者. 鸣谢elasticsearch官方打造的开源框架resthighlevelclient 的作者及其所有参与开发者. 感谢协助本人将语雀中数量庞大的easy-es英文文档悉数迁移至本站的"清风徐飘"先生,由衷感谢!\n\n感谢mp和es官方开源如此强大又好用的框架,由此带来国内外无数开发者的解放,大幅提高了开发搬砖效率,由此给众多开发者节省了大量宝贵时间.也给我提供了创作灵感,可以说没有mybatis-plus就没有easy-es,当然未来也或许会有,但起码不会这么快和大家见面,也或许是其它作者开发. mybatis-plus和easy-es的关系,就像f22和歼20的关系,在框架开发的过程中,无论是为了兼容语法还是一些未知点的突破,mp都给予了恰到好处的指引,让我少走了很多弯路,把别人好几年走完的路,作为起点,站在巨人的肩膀上,由此打造出一款非常易用的es-orm框架.\n\n为了保持与mp99%相似度的语法,ee框架在开发过程中大量借鉴了mp源码,如果不深入底层看,仅看接口定义,会误以为是复制粘贴mp接口,但底层逻辑终究是不一样的,mp最终是将语法转换成string sql, 而ee最终是将语法转换成json类型的es语法,本质上还是有挺大差别,这里面依旧有很多创新点和难点需要突破,由于es天然的复杂性和高门槛,开发ee的难度要远大于mp,期间有几个难点,一度让我产生放弃的念头,还好最后通过各种努力和思考,以及坚持不懈,完成了整个框架的开发,测试,文档撰写等.\n\n现在,我将此框架源码开源献给全球所有开发者,毕竟凝聚了国内外各路优秀开发者的思路,那才有可能打造真正的"easyest",否则它只能是easy-es.\n\n如果本框架有在开发过程中帮您提高开发效率,节省了开发时间,不妨花几秒钟时间(打造此框架前后耗费大量光阴)给本框架在git点个star,让更多人看到并用到它,不做拿来主义者,从我做起!\n\n最后感谢每一位支持ee的您, 感谢您对ee的支持,谢谢! 也谢谢社区所有为ee贡献过建议及代码的伙伴,以及为了ee无私奉献的自己.\n\nby老汉',charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"支持",frontmatter:{title:"支持",date:"2022-06-01T19:01:33.000Z",permalink:"/pages/fb599d/"},regularPath:"/%E6%94%AF%E6%8C%81/01.%E6%94%AF%E6%8C%81.html",relativePath:"支持/01.支持.md",key:"v-7b689745",path:"/pages/fb599d/",headers:[{level:2,title:"用爱发电",slug:"用爱发电",normalizedTitle:"用爱发电",charIndex:2},{level:2,title:"成为赞助商",slug:"成为赞助商",normalizedTitle:"成为赞助商",charIndex:184},{level:2,title:"致谢",slug:"致谢",normalizedTitle:"致谢",charIndex:495}],headersStr:"用爱发电 成为赞助商 致谢",content:"# 用爱发电\n\n如果您正在使用这个项目并感觉良好,或是想支持我们继续开发,您可以通过如下方式支持我们:\n\n1.Star并向您的朋友推荐或分享Easy-Es🚀\n\n2.轻轻点击一次上面的广告链接🙃\n\n2.通过Gitee直接捐赠,或者扫描下面二维码进行一次性捐款赞助,请作者喝一杯咖啡☕️\n\n非常感谢您对开源精神的支持!❤\n\n\n\n微信(左图)| 支付宝(右图)\n\n\n# 成为赞助商\n\n1.赞助任意金额,您将获得赞助者列表的永久留名。\n\n2.赞助达到20元,您将获得赞助者列表的永久留名,并可附上在赞助者列表里的投放链接。\n\n3.赞助达50元,您额外获得Easy-Es的私下VIP 1对1的技术咨询服务(长达1年)。\n\n4.赞助达100元,您将额外同时获得Easy-Es文档首页的赞助者广告展示栏位(长达1年),\n\n并可为您量身定制健身计划一份。\n\n5.赞助超过100元? 壮士请留步,老汉愿以身相许!\n\n> Easy-Es官网目前每月大约有10w+的浏览量。\n\n相关联系方式(添加烦请注明来意):\n\n * 微信|QQ:252645816\n\n * 邮件:xpc@dromara.org\n\n\n# 致谢\n\n感谢给予支持的朋友,您的支持是鼓励我们前行的动力❣",normalizedContent:"# 用爱发电\n\n如果您正在使用这个项目并感觉良好,或是想支持我们继续开发,您可以通过如下方式支持我们:\n\n1.star并向您的朋友推荐或分享easy-es🚀\n\n2.轻轻点击一次上面的广告链接🙃\n\n2.通过gitee直接捐赠,或者扫描下面二维码进行一次性捐款赞助,请作者喝一杯咖啡☕️\n\n非常感谢您对开源精神的支持!❤\n\n\n\n微信(左图)| 支付宝(右图)\n\n\n# 成为赞助商\n\n1.赞助任意金额,您将获得赞助者列表的永久留名。\n\n2.赞助达到20元,您将获得赞助者列表的永久留名,并可附上在赞助者列表里的投放链接。\n\n3.赞助达50元,您额外获得easy-es的私下vip 1对1的技术咨询服务(长达1年)。\n\n4.赞助达100元,您将额外同时获得easy-es文档首页的赞助者广告展示栏位(长达1年),\n\n并可为您量身定制健身计划一份。\n\n5.赞助超过100元? 壮士请留步,老汉愿以身相许!\n\n> easy-es官网目前每月大约有10w+的浏览量。\n\n相关联系方式(添加烦请注明来意):\n\n * 微信|qq:252645816\n\n * 邮件:xpc@dromara.org\n\n\n# 致谢\n\n感谢给予支持的朋友,您的支持是鼓励我们前行的动力❣",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"关于项目",frontmatter:{title:"关于项目",date:"2022-06-20T17:45:48.000Z",permalink:"/pages/55wa9d/"},regularPath:"/%E5%85%B3%E4%BA%8E%E9%A1%B9%E7%9B%AE.html",relativePath:"关于项目.md",key:"v-64e509e5",path:"/pages/55wa9d/",headersStr:null,content:"话说东汉末年,天下动荡,豪杰纷起,群雄逐鹿。天下苦ES语法久矣,十八路猪猴人人愿得而诛之,此间有一\n\n乡勇,名曰“老汉”,布衣出身,此人生得头脑复杂,四肢发达,有匹夫不当之勇。 正当众人无计可施之际,\n\n只见此人仰天长叹,吟得一首好诗:\n\n《韭菜》 -老汉\n\n键盘敲得肌无力,秃头枸杞曾太拼。\n\n编码未捷身先死,长使老汉泪满襟。\n\n闻此诗者,无不临诗涕零。 正此间,有一人破口大骂:大丈夫不为天下效力,何故在此痛哭? 尔等能哭死ES乎?\n\n何不用MP语法简化之!老汉顿悟,撸起衣袖,麒麟臂显露,一顿操作猛如虎,日以继夜,攻城拔寨数载,终于...\n\n时间来到了2021年,Easy-Es诞生了,最初是用于公司一核心项目上,经过生产大量验证后,开始大幅改造并全面\n\n开源,旨在帮助全球众多开发者减轻开发负担。开源后,迅速获得了很多人的关注,曾长期占据Gitee热搜榜首位。\n\n目前Easy-Es被运用在国内很多知名的公司核心项目上,为很多一线开发者带来了福音,大幅降低了ES搜索引擎使用\n\n门槛。Easy-Es社区活跃,维护和迭代工作也一直进行着,代码活跃度>85%,流行趋势>99%,开源半年收获累计\n\n2K+ Star,捐赠金额超1K,社区群累计成员超500人...Easy-Es是一个年轻有生命力的开源项目,自开源以来,\n\n已经上线的功能,在功能丰富度和易用度上已经全面超越SpringData-Elasticsearch,跃居ES-ORM框架 领域\n\nNO.?,我不说用户心里也自有答案。由于ES高门槛,高复杂性,项目中使用低频等特性,导致投入和产出不成正比,\n\n因此这个赛道开源几乎没什么竞争对手,国内仅此一家,国外仅Spring在做,我们的目标就是在各方面全面 超越它,\n\n我们不做老二,为国产开源争口气!\n\n如果您也喜欢Easy-Es,可以在Gitee,Github上watch,star和fork三连支持我们,并进入社区群提问和探讨技术。\n\nEasy-Es的Gitee仓库:https://gitee.com/dromara/easy-es\n\nEasy-Es的Github仓库:https://github.com/dromara/easy-es\n\n您也可以添加作者微信, 和作者共同交流开源技术,或是探讨健身问题,作者热爱健身,目前健身8年,洛奇健美认证。\n\n作者那糟老头子,还是个车迷,懂车帝,爱钓鱼,户外,是个兴趣爱好广泛的斜杆青年,喜欢结交天下豪杰,如果您也\n\n臭味相投,不妨扫描下面二维码添加我微信,交个朋友。\n\n",normalizedContent:"话说东汉末年,天下动荡,豪杰纷起,群雄逐鹿。天下苦es语法久矣,十八路猪猴人人愿得而诛之,此间有一\n\n乡勇,名曰“老汉”,布衣出身,此人生得头脑复杂,四肢发达,有匹夫不当之勇。 正当众人无计可施之际,\n\n只见此人仰天长叹,吟得一首好诗:\n\n《韭菜》 -老汉\n\n键盘敲得肌无力,秃头枸杞曾太拼。\n\n编码未捷身先死,长使老汉泪满襟。\n\n闻此诗者,无不临诗涕零。 正此间,有一人破口大骂:大丈夫不为天下效力,何故在此痛哭? 尔等能哭死es乎?\n\n何不用mp语法简化之!老汉顿悟,撸起衣袖,麒麟臂显露,一顿操作猛如虎,日以继夜,攻城拔寨数载,终于...\n\n时间来到了2021年,easy-es诞生了,最初是用于公司一核心项目上,经过生产大量验证后,开始大幅改造并全面\n\n开源,旨在帮助全球众多开发者减轻开发负担。开源后,迅速获得了很多人的关注,曾长期占据gitee热搜榜首位。\n\n目前easy-es被运用在国内很多知名的公司核心项目上,为很多一线开发者带来了福音,大幅降低了es搜索引擎使用\n\n门槛。easy-es社区活跃,维护和迭代工作也一直进行着,代码活跃度>85%,流行趋势>99%,开源半年收获累计\n\n2k+ star,捐赠金额超1k,社区群累计成员超500人...easy-es是一个年轻有生命力的开源项目,自开源以来,\n\n已经上线的功能,在功能丰富度和易用度上已经全面超越springdata-elasticsearch,跃居es-orm框架 领域\n\nno.?,我不说用户心里也自有答案。由于es高门槛,高复杂性,项目中使用低频等特性,导致投入和产出不成正比,\n\n因此这个赛道开源几乎没什么竞争对手,国内仅此一家,国外仅spring在做,我们的目标就是在各方面全面 超越它,\n\n我们不做老二,为国产开源争口气!\n\n如果您也喜欢easy-es,可以在gitee,github上watch,star和fork三连支持我们,并进入社区群提问和探讨技术。\n\neasy-es的gitee仓库:https://gitee.com/dromara/easy-es\n\neasy-es的github仓库:https://github.com/dromara/easy-es\n\n您也可以添加作者微信, 和作者共同交流开源技术,或是探讨健身问题,作者热爱健身,目前健身8年,洛奇健美认证。\n\n作者那糟老头子,还是个车迷,懂车帝,爱钓鱼,户外,是个兴趣爱好广泛的斜杆青年,喜欢结交天下豪杰,如果您也\n\n臭味相投,不妨扫描下面二维码添加我微信,交个朋友。\n\n",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"加入社区讨论",frontmatter:{title:"加入社区讨论",date:"2022-06-20T17:45:48.000Z",permalink:"/pages/kd129d/"},regularPath:"/%E5%8A%A0%E5%85%A5%E7%A4%BE%E5%8C%BA%E8%AE%A8%E8%AE%BA.html",relativePath:"加入社区讨论.md",key:"v-fb1b2cdc",path:"/pages/kd129d/",headersStr:null,content:"Easy-Es是轻量,快速,易用,自动化程度较高的ES搜索引擎ORM框架,自从开源以来,我们收到了很多人\n\n的使用反馈,并听取这些反馈进行迭代和新特性开发。如果您在使用中有问题,或者想咨询了解,可以加入\n\n群聊,我会细心答复每一个人的疑问。由于微信群二维码有效期只有7天,所以这里不方便放微信群二维码,\n\n您可以添加我微信,加好友时备注EE,我会拉你入群。 如果您不习惯用微信,我们也有QQ群,QQ群相对\n\n回复较慢,我们以微信群为主。\n\n\n\n微信(左图)| QQ群(右图)",normalizedContent:"easy-es是轻量,快速,易用,自动化程度较高的es搜索引擎orm框架,自从开源以来,我们收到了很多人\n\n的使用反馈,并听取这些反馈进行迭代和新特性开发。如果您在使用中有问题,或者想咨询了解,可以加入\n\n群聊,我会细心答复每一个人的疑问。由于微信群二维码有效期只有7天,所以这里不方便放微信群二维码,\n\n您可以添加我微信,加好友时备注ee,我会拉你入群。 如果您不习惯用微信,我们也有qq群,qq群相对\n\n回复较慢,我们以微信群为主。\n\n\n\n微信(左图)| qq群(右图)",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"谁在使用",frontmatter:{title:"谁在使用",date:"2022-06-20T17:45:48.000Z",permalink:"/pages/6f829d/"},regularPath:"/%E8%B0%81%E5%9C%A8%E4%BD%BF%E7%94%A8.html",relativePath:"谁在使用.md",key:"v-3fb4db14",path:"/pages/6f829d/",headersStr:null,content:"公司名称 LOGO 公司名称 LOGO\n成都岸靠网络科技有限公司 世纪开元智印互联科技集团股份有限公司 \n杭州益仓网络科技有限公司 杭州知友网络科技有限公司 \n成都梦柠科技 富航百悦电子商务有限责任公司 \n东华软件股份公司 东华云都技术有限公司 \n\n登记\n\n为了更好地为您提供服务,请在此登记。\n\n展位资源有限,先到先得,公司不论大小,排序以issue中提交时间为准,越早提交排名越靠前.\n\n感谢您的支持!",normalizedContent:"公司名称 logo 公司名称 logo\n成都岸靠网络科技有限公司 世纪开元智印互联科技集团股份有限公司 \n杭州益仓网络科技有限公司 杭州知友网络科技有限公司 \n成都梦柠科技 富航百悦电子商务有限责任公司 \n东华软件股份公司 东华云都技术有限公司 \n\n登记\n\n为了更好地为您提供服务,请在此登记。\n\n展位资源有限,先到先得,公司不论大小,排序以issue中提交时间为准,越早提交排名越靠前.\n\n感谢您的支持!",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"赞助者列表",frontmatter:{title:"赞助者列表",date:"2022-06-02T11:37:17.000Z",permalink:"/pages/b52ac5/"},regularPath:"/%E6%94%AF%E6%8C%81/02.%E8%B5%9E%E5%8A%A9%E8%80%85%E5%88%97%E8%A1%A8.html",relativePath:"支持/02.赞助者列表.md",key:"v-5b2b8848",path:"/pages/b52ac5/",headersStr:null,content:"赞助人 金额 TA的留言/分享 赞助渠道 赞助时间 投放链接\nCon ¥1 无 码云 2022-04 无\n*头 ¥100 无 微信 2022-06-13 无\n*慢 ¥6 希望EE做的越来越好 微信 2022-06-12 无\nL*e ¥20 为EE而来,大佬加油 微信 2022-06-06 无\n*天 ¥6.66 无 微信 2022-05-16 无\n*蓝 ¥6.66 大力支持,希望成为mp 微信 2022-05-13 无\n*。 ¥20 大佬牛逼,可以公开 微信 2022-04-23 无\n以梦为马,不负韶华 ¥50 加油 微信 2022-04-15 无\n*🐝 ¥66.66 Easy-Es🐮 微信 2022-04-14 无\n*钧 ¥0.1 无 微信 2022-04-08 无\n*吗 ¥0.1 无 微信 2022-04-08 无\n*⑧ ¥20 请大佬喝☕,牛批 微信 2022-04-04 无\n很拽の土豆 ¥10 无 码云 2022-04 无\n很拽の土豆 ¥10 无 码云 2022-04 无\n*🐸 ¥50 请大佬喝咖啡 加油 微信 2022-03-29 无\n**尨 ¥ 150 无 支付宝 2022-03-26 无\n**兵 ¥ 199 无 支付宝 2022-03-24 无\nS*B ¥5 很喜欢你的项目 支持 微信 2022-03-23 无\n*来 ¥50 无 微信 2022-03-22 无\n**洲 ¥10 开源不易 感谢大佬 喝杯咖啡 支付宝 2022-03-19 无\nr*n ¥5 无 微信 2022-03-16 无\n以梦为马,不负韶华 ¥50 加油 微信 2022-03-10 无\n神秘的凯 ¥1.88 无 码云 2022-03 无\njackkang ¥20 无 码云 2022-03 无\nchenzf ¥1 无 码云 2022-03 无\n*y ¥50 Es顶,一杯咖啡请笑纳 微信 2022-02-25 无\n*松 ¥2 无 支付宝 2022-02-16 无\n橘子皮 ¥6.66 无 微信 2022-01-19 无\ncj ¥5 无 微信 2022-01-19 无",normalizedContent:"赞助人 金额 ta的留言/分享 赞助渠道 赞助时间 投放链接\ncon ¥1 无 码云 2022-04 无\n*头 ¥100 无 微信 2022-06-13 无\n*慢 ¥6 希望ee做的越来越好 微信 2022-06-12 无\nl*e ¥20 为ee而来,大佬加油 微信 2022-06-06 无\n*天 ¥6.66 无 微信 2022-05-16 无\n*蓝 ¥6.66 大力支持,希望成为mp 微信 2022-05-13 无\n*。 ¥20 大佬牛逼,可以公开 微信 2022-04-23 无\n以梦为马,不负韶华 ¥50 加油 微信 2022-04-15 无\n*🐝 ¥66.66 easy-es🐮 微信 2022-04-14 无\n*钧 ¥0.1 无 微信 2022-04-08 无\n*吗 ¥0.1 无 微信 2022-04-08 无\n*⑧ ¥20 请大佬喝☕,牛批 微信 2022-04-04 无\n很拽の土豆 ¥10 无 码云 2022-04 无\n很拽の土豆 ¥10 无 码云 2022-04 无\n*🐸 ¥50 请大佬喝咖啡 加油 微信 2022-03-29 无\n**尨 ¥ 150 无 支付宝 2022-03-26 无\n**兵 ¥ 199 无 支付宝 2022-03-24 无\ns*b ¥5 很喜欢你的项目 支持 微信 2022-03-23 无\n*来 ¥50 无 微信 2022-03-22 无\n**洲 ¥10 开源不易 感谢大佬 喝杯咖啡 支付宝 2022-03-19 无\nr*n ¥5 无 微信 2022-03-16 无\n以梦为马,不负韶华 ¥50 加油 微信 2022-03-10 无\n神秘的凯 ¥1.88 无 码云 2022-03 无\njackkang ¥20 无 码云 2022-03 无\nchenzf ¥1 无 码云 2022-03 无\n*y ¥50 es顶,一杯咖啡请笑纳 微信 2022-02-25 无\n*松 ¥2 无 支付宝 2022-02-16 无\n橘子皮 ¥6.66 无 微信 2022-01-19 无\ncj ¥5 无 微信 2022-01-19 无",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3},{title:"生态",frontmatter:{title:"生态",date:"2022-06-20T17:45:48.000Z",permalink:"/pages/1a819d/"},regularPath:"/%E7%94%9F%E6%80%81.html",relativePath:"生态.md",key:"v-248149e0",path:"/pages/1a819d/",headers:[{level:2,title:"关于Dromara",slug:"关于dromara",normalizedTitle:"关于dromara",charIndex:31},{level:2,title:"更多生态资源",slug:"更多生态资源",normalizedTitle:"更多生态资源",charIndex:307}],headersStr:"关于Dromara 更多生态资源",content:"Easy-Es由国内知名开源组织Dromara孵化。\n\n\n# 关于Dromara\n\nDromara是由国内顶尖的开源项目作者共同组成的开源社区。\n\n提供包括开源网关,分布式事务,流行工具,企业级认证,微服务RPC,运维监控,Agent监控,分布式日志,调度编排等\n\n一系列开源产品、解决方案与咨询、技术支持与培训认证服务。技术栈全面开源共建、保持社区中立,致力于为全球用户提\n\n供微服务云原生解决方案。让参与的每一位开源爱好者,体会到开源的快乐。Dromara开源社区目前拥有10+GVP项目,\n\n总star数量超过十万,构建了上万人的开源社区,有成千上万的个人及团队在使用Dromara社区的开源项目。\n\n\n# 更多生态资源\n\n请移步至Dromara码云首页 查看。",normalizedContent:"easy-es由国内知名开源组织dromara孵化。\n\n\n# 关于dromara\n\ndromara是由国内顶尖的开源项目作者共同组成的开源社区。\n\n提供包括开源网关,分布式事务,流行工具,企业级认证,微服务rpc,运维监控,agent监控,分布式日志,调度编排等\n\n一系列开源产品、解决方案与咨询、技术支持与培训认证服务。技术栈全面开源共建、保持社区中立,致力于为全球用户提\n\n供微服务云原生解决方案。让参与的每一位开源爱好者,体会到开源的快乐。dromara开源社区目前拥有10+gvp项目,\n\n总star数量超过十万,构建了上万人的开源社区,有成千上万的个人及团队在使用dromara社区的开源项目。\n\n\n# 更多生态资源\n\n请移步至dromara码云首页 查看。",charsets:{cjk:!0},lastUpdated:"2022/06/28, 17:45:31",lastUpdatedTimestamp:1656409531e3}],themeConfig:{nav:[{text:"首页",link:"/"},{text:"文档",link:"/pages/ec7460/"},{text:"💖支持",link:"/pages/fb599d/"},{text:"🌻生态",link:"/pages/1a819d/"},{text:"🚀关于项目",link:"/pages/55wa9d/"},{text:"加入社区讨论",link:"/pages/kd129d/"},{text:"参与贡献",link:"/pages/7d828w/"},{text:"谁在使用",link:"/pages/6f829d/"},{text:"💞推荐",items:[{text:"健身计划一键生成系统",link:"https://gitee.com/easy-es/fit-plan"}]},{text:"Gitee",link:"https://gitee.com/dromara/easy-es"},{text:"Github",link:"https://github.com/dromara/easy-es"},{text:"💫语言选择",items:[{text:"简体中文",link:"https://easy-es.cn"},{text:"English",link:"https://en.easy-es.cn"}]}],sidebarDepth:2,logo:"/img/logo.png",searchMaxSuggestions:10,lastUpdated:"上次更新",docsRepo:"xpc1024/ee-home",docsDir:"docs",editLinks:!0,editLinkText:"帮助我们改善此文档",sidebar:{"/v1.0.0/":[{title:"快速入门",collapsable:!1,children:[["010.快速入门/010.简介.md","简介","/pages/ec7460/"],["010.快速入门/020.适用场景.md","适用场景","/pages/258e80/"],["010.快速入门/030.顾虑粉碎.md","顾虑粉碎","/pages/6e2197/"],["010.快速入门/040.避坑指南.md","避坑指南","/pages/0867bd/"],["010.快速入门/050.快速开始.md","快速开始","/pages/949ac4/"],["010.快速入门/060.springboot集成demo.md","springboot集成demo","/pages/12283a/"],["010.快速入门/070.配置.md","配置","/pages/9a3e4c/"],["010.快速入门/080.注解.md","注解","/pages/4eb7db/"]]},{title:"核心功能",collapsable:!1,children:[["020.核心功能/010.索引处理.md","索引处理","/pages/06b5d9/"],["020.核心功能/020.CRUD接口.md","CRUD接口","/pages/c5999a/"],["020.核心功能/030.条件构造器.md","条件构造器","/pages/1cebb8/"]]},{title:"拓展功能",collapsable:!1,children:[["030.拓展功能/010.混合查询.md","混合查询","/pages/a19563/"],["030.拓展功能/020.原生查询.md","原生查询","/pages/4446a5/"],["030.拓展功能/030.分页查询.md","分页查询","/pages/0cf11e/"],["030.拓展功能/040.嵌套类型.md","嵌套类型","/pages/05702c/"],["030.拓展功能/050.父子类型.md","父子类型","/pages/0bbd7e/"],["030.拓展功能/060.获取DSL语句.md","获取DSL语句","/pages/981130/"]]},{title:"高阶语法",collapsable:!1,children:[["040.高阶语法/010.查询字段过滤.md","查询字段过滤","/pages/c9c57f/"],["040.高阶语法/020.排序.md","排序","/pages/274da8/"],["040.高阶语法/030.聚合查询.md","聚合查询","/pages/b508b3/"],["040.高阶语法/040.分词查询.md","分词查询","/pages/2688d1/"],["040.高阶语法/050.权重.md","权重","/pages/e6fc8d/"],["040.高阶语法/060.高亮查询.md","高亮查询","/pages/899c12/"],["040.高阶语法/070.GEO地理位置查询.md","GEO地理位置查询","/pages/39b41e/"]]},{title:"插件",collapsable:!1,children:[["050.插件/010.插件.md","插件","/pages/6431d1/"]]},{title:"其它",collapsable:!1,children:[["060.其它/010.问答.md","问答","/pages/453119/"],["060.其它/020.与MP差异.md","与MP差异","/pages/98d3d3/"],["060.其它/030.MySQL和EE语法对比.md","MySQL和EE语法对比","/pages/6fea40/"],["060.其它/040.更新日志.md","更新日志","/pages/b65406/"],["060.其它/050.更新计划.md","更新计划","/pages/e14b42/"],["060.其它/060.版权.md","版权","/pages/796d01/"],["060.其它/070.鸣谢.md","鸣谢","/pages/4d7703/"]]}],catalogue:{},"/支持/":[["01.支持.md","支持","/pages/fb599d/"],["02.赞助者列表.md","赞助者列表","/pages/b52ac5/"]]},updateBar:{showToArticle:!1},category:!1,tag:!1,author:{name:"老汉",href:"https://gitee.com/easy-es/"},social:{icons:[{iconClass:"icon-youjian",title:"Mail",link:"mailto:xpc@dromara.com"},{iconClass:"icon-gitee",title:"Gitee",link:"https://gitee.com/dromara/easy-es"},{iconClass:"icon-github",title:"GitHub",link:"https://github.com/dromara/easy-es"}]},footer:{createYear:2022,copyrightInfo:'老汉| MIT License'},htmlModules:{pageT:'\n
\n \n '}}};var Ys=t(92),nl=t(93),el=t(11);var tl={computed:{$filterPosts(){return this.$site.pages.filter(n=>{const{frontmatter:{pageComponent:e,article:t,home:r}}=n;return!(e||!1===t||!0===r)})},$sortPosts(){return(n=this.$filterPosts).sort((n,e)=>{const t=n.frontmatter.sticky,r=e.frontmatter.sticky;return t&&r?t==r?Object(el.a)(n,e):t-r:t&&!r?-1:!t&&r?1:Object(el.a)(n,e)}),n;var n},$sortPostsByDate(){return(n=this.$filterPosts).sort((n,e)=>Object(el.a)(n,e)),n;var n},$groupPosts(){return function(n){const e={},t={};for(let r=0,o=n.length;r{t&&(e[t]||(e[t]=[]),e[t].push(n[r]))}),"array"===Object(el.n)(a)&&a.forEach(e=>{e&&(t[e]||(t[e]=[]),t[e].push(n[r]))})}return{categories:e,tags:t}}(this.$sortPosts)},$categoriesAndTags(){return function(n){const e=[],t=[];for(let t in n.categories)e.push({key:t,length:n.categories[t].length});for(let e in n.tags)t.push({key:e,length:n.tags[e].length});return{categories:e,tags:t}}(this.$groupPosts)}}};Oo.component(Ys.default),Oo.component(nl.default);function rl(n){return n.toString().padStart(2,"0")}t(235);Oo.component("Badge",()=>Promise.all([t.e(0),t.e(3)]).then(t.bind(null,364))),Oo.component("CodeBlock",()=>Promise.resolve().then(t.bind(null,92))),Oo.component("CodeGroup",()=>Promise.resolve().then(t.bind(null,93)));t(236);var ol=[({Vue:n,options:e,router:t,siteData:r,isServer:o})=>{o||t.afterEach(()=>{var n;n=function(){setTimeout((function(){void 0===window._AdBlockInit&&function(){const n=document.getElementsByClassName("wwads-cn"),e=document.querySelector(".wwads-content");n[0]&&!e&&(n[0].innerHTML="")}()}),3e3)},"complete"===document.readyState||"interactive"===document.readyState?setTimeout(n,1):document.addEventListener("DOMContentLoaded",n),setTimeout(()=>{const n=document.querySelector(".page-ad");if(!n)return;const e=n.querySelector(".wwads-hide");e&&(e.onclick=()=>{n.style.display="none"}),"none"===n.style.display&&(n.style.display="flex")},900)})},({Vue:n,options:e,router:t,siteData:r})=>{r.pages.map(n=>{const{frontmatter:{date:e,author:t}}=n;"string"==typeof e&&"Z"===e.charAt(e.length-1)&&(n.frontmatter.date=function(n){n instanceof Date||(n=new Date(n));return`${n.getUTCFullYear()}-${rl(n.getUTCMonth()+1)}-${rl(n.getUTCDate())} ${rl(n.getUTCHours())}:${rl(n.getUTCMinutes())}:${rl(n.getUTCSeconds())}`}(e)),t?n.author=t:r.themeConfig.author&&(n.author=r.themeConfig.author)}),n.mixin(tl)},{},({Vue:n})=>{n.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},()=>{"undefined"!=typeof window&&function(n,e,t){function r(n){var t=e.createElement("div");t.className="heart",o.push({el:t,x:n.clientX-5,y:n.clientY-5,scale:1,alpha:1,color:"#FF9797"}),e.body.appendChild(t)}var o=[];n.requestAnimationFrame=n.requestAnimationFrame||n.webkitRequestAnimationFrame||n.mozRequestAnimationFrame||n.oRequestAnimationFrame||n.msRequestAnimationFrame||function(n){setTimeout(n,1e3/60)},function(n){var t=e.createElement("style");t.type="text/css";try{t.appendChild(e.createTextNode(n))}catch(e){t.styleSheet.cssText=n}e.getElementsByTagName("head")[0].appendChild(t)}(".heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}"),function(){var e="function"==typeof n.onclick&&n.onclick;n.onclick=function(n){let t=!0;n.path&&n.path.forEach(n=>{1===n.nodeType&&"string"==typeof n.className&&n.className.indexOf("theme-vdoing-content")>-1&&(t=!1)}),t&&(e&&e(),r(n))}}(),function n(){for(var t=0;t{"undefined"!=typeof window&&(window._hmt=window._hmt||[],function(){var n=document.createElement("script");n.src="https://hm.baidu.com/hm.js?f0770f1d975c50a091d76f04a1dd2df5";var e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(n,e)}(),n.afterEach((function(n){_hmt.push(["_trackPageview",n.fullPath])})))}],al=[];class il extends class{constructor(){this.store=new Oo({data:{state:{}}})}$get(n){return this.store.state[n]}$set(n,e){Oo.set(this.store.state,n,e)}$emit(...n){this.store.$emit(...n)}$on(...n){this.store.$on(...n)}}{}Object.assign(il.prototype,{getPageAsyncComponent:Bi,getLayoutAsyncComponent:Ri,getAsyncComponent:$i,getVueComponent:Ni});var sl={install(n){const e=new il;n.$vuepress=e,n.prototype.$vuepress=e}};function ll(n,e){const t=e.toLowerCase();return n.options.routes.some(n=>n.path.toLowerCase()===t)}var cl={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(n){const e=this.pageKey||this.$parent.$page.key;return Ui("pageKey",e),Oo.component(e)||Oo.component(e,Bi(e)),Oo.component(e)?n(e):n("")}},pl={functional:!0,props:{slotKey:String,required:!0},render:(n,{props:e,slots:t})=>n("div",{class:["content__"+e.slotKey]},t()[e.slotKey])},ul={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},dl=(t(237),t(238),Object(Ks.a)(ul,(function(){var n=this.$createElement,e=this._self._c||n;return e("span",[e("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[e("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),e("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),e("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),ml={functional:!0,render(n,{parent:e,children:t}){if(e._isMounted)return t;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};Oo.config.productionTip=!1,Oo.use(_i),Oo.use(sl),Oo.mixin(function(n,e,t=Oo){!function(n){n.locales&&Object.keys(n.locales).forEach(e=>{n.locales[e].path=e});Object.freeze(n)}(e),t.$vuepress.$set("siteData",e);const r=new(n(t.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),a={};return Object.keys(o).reduce((n,e)=>(e.startsWith("$")&&(n[e]=o[e].get),n),a),{computed:a}}(n=>class{setPage(n){this.__page=n}get $site(){return n}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:n={}}=this.$site;let e,t;for(const r in n)"/"===r?t=n[r]:0===this.$page.path.indexOf(r)&&(e=n[r]);return e||t||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:n}=this.$page.frontmatter;return"string"==typeof n&&n}get $title(){const n=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const t=this.$siteTitle,r=n.frontmatter.home?null:n.frontmatter.title||n.title;return t?r?r+" | "+t:t:r||"VuePress"}get $description(){const n=function(n){if(n){const e=n.filter(n=>"description"===n.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return n||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(n,e){for(let t=0;tt||(n.hash?!Oo.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(n.hash)}:{x:0,y:0})});!function(n){n.beforeEach((e,t,r)=>{if(ll(n,e.path))r();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const t=e.path.replace(/\/$/,"")+".html";ll(n,t)?r(t):r()}else r();else{const t=e.path+"/",o=e.path+".html";ll(n,o)?r(o):ll(n,t)?r(t):r()}})}(t);const r={};try{await Promise.all(ol.filter(n=>"function"==typeof n).map(e=>e({Vue:Oo,options:r,router:t,siteData:Xs,isServer:n})))}catch(n){console.error(n)}return{app:new Oo(Object.assign(r,{router:t,render:n=>n("div",{attrs:{id:"app"}},[n("RouterView",{ref:"layout"}),n("div",{class:"global-ui"},al.map(e=>n(e)))])})),router:t}}(!1).then(({app:n,router:e})=>{e.onReady(()=>{n.$mount("#app")})})}]); \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index dcab8607..661c179d 100644 --- a/dist/index.html +++ b/dist/index.html @@ -62,7 +62,7 @@ - + @@ -98,7 +98,7 @@ Theme by Vdoing | Copyright © 2022-2022 - 老汉 | MIT License
- + diff --git a/dist/pages/05702c/index.html b/dist/pages/05702c/index.html index b4d54132..f61f90e4 100644 --- a/dist/pages/05702c/index.html +++ b/dist/pages/05702c/index.html @@ -62,7 +62,7 @@ - + @@ -86,7 +86,7 @@ 简体中文 (opens new window)
目录

嵌套类型

+ (opens new window)
目录

嵌套类型

-

# 简介

Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发.

理念 把简单,易用,方便留给用户,把复杂留给框架.

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

logo

# 优势

  • 全自动索引托管: 全球开源首创的索引托管模式,开发者无需关心索引的创建更新及数据迁移等繁琐步骤,索引全生命周期皆可托管给框架,由框架自动完成,过程零停机,用户无感知,彻底解放开发者
  • 屏蔽语言差异: 开发者只需要会MySQL语法即可使用Es,真正做到一通百通,无需学习枯燥易忘的Es语法,Es使用相对MySQL较低频,学了长期不用也会忘,没必要浪费这时间.开发就应该专注于业务,省下的时间去撸铁,去陪女朋友陪家人,不做资本家的韭菜
  • 代码量极少: 与直接使用RestHighLevelClient相比,相同的查询平均可以节省3-5倍左右的代码量
  • 零魔法值: 字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值,提高代码可读性,杜绝因字段名称修改而代码漏改带来的Bug
  • 零额外学习成本: 开发者只要会国内最受欢迎的Mybatis-Plus语法,即可无缝迁移至EE,EE采用和前者相同的语法,消除使用者额外学习成本,直接上手,爽
  • 降低开发者门槛: Es通常需要中高级开发者才能驾驭,但通过接入EE,即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发,可以提高人员利用率,降低企业成本

# 特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper,仅仅通过少量配置即可实现大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错段
  • 支持主键自动生成:支持2 种主键策略,可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置分页插件:基于RestHighLevelClient 物理分页,开发者无需关心具体操作,且无需额外配置插件,写分页等同于普通 List 查询,且保持和PageHelper插件同样的分页返回字段,无需担心命名影响
  • MySQL功能全覆盖:MySQL中支持的功能通过EE都可以轻松实现
  • 支持ES高阶语法:支持高亮搜索,分词查询,权重查询,Geo地理位置查询,IP查询,聚合查询等高阶语法
  • 良好的拓展性:底层仍使用RestHighLevelClient,可保持其拓展性,开发者在使用EE的同时,仍可使用RestHighLevelClient的功能

...

# 框架架构

EasyEsJG.jpg

# 代码托管

码云Gitee (opens new window)✔ | Github (opens new window)

# 参与贡献

尽管目前Easy-Es诞生不算太久,但由于站在巨人的肩膀上(RestHighLevelClient和Mybatis-Plus),这是一款出道即巅峰的框架,这么说并不是说它写得有多好,而是它融合了两款目前非常优秀框架的优点,以及MP的用户习惯和用户生态,这决定了它起点的高度,未来可期,所以在此欢迎各路好汉一起来参与完善 Easy-Es,我们期待你的 PR!

  • 贡献代码:代码地址 Easy-ES (opens new window),欢迎提交 Issue 或者 Pull Requests
  • 维护文档:文档地址 [Easy-ES]https://github.com/xpc1024/easy-es-home-pages),欢迎参与翻译和修订
上次更新: 2022/06/28, 17:45:31
上次更新: 2022/06/28, 17:45:31
- + diff --git a/dist/pages/fb599d/index.html b/dist/pages/fb599d/index.html index cdb0c9ee..8cc6e45f 100644 --- a/dist/pages/fb599d/index.html +++ b/dist/pages/fb599d/index.html @@ -62,7 +62,7 @@ - + @@ -86,7 +86,7 @@ 简体中文 (opens new window)
目录

支持

+ (opens new window)
目录

支持