00:00
前面我们通过NX搭建了我们I开分词器的自定义词库,那接下来我们就来使用Java来操作search,比如我们这里边有这么一个检索场景,当来选中一些检索条件的时候,那我们就需要给ES发送请求来检索我们真正的商品,检索过来呢,我们就需要给页面来展示数据,当然这个请求呢,应该由我们一段Java程序来接收,并且呢发给ES进行处理,将处理的结果呢最终再返回给前端页面。而对于Java来操作ES,它呢有这么两种方式,第一种通过操作ES的9300端口,9300呢,它是一个TCB端口,ES集群节点之间通信也都使用9300端口,那如果我们通过9300来操作ES,那它呢就要与ES建立一个长连接,而支持这种操作的,我们是在spring data项目里边有transport API来对应我们这些ES的操作。
01:00
包括呢,官方的search点炸这依赖也能支持这个操作,但是呢,我们说我们不在9300操作,主要有两个原因,第一个原因由于版本的不同。Data里边整合的ES的版本也都不同,而且呢,Spring data目前的最新版本都没有整合到我们现在的ES7.4,所以呢,我们spring的版本只整合到了ES的6.3.8,所以我们想要用这种,那出现版本不适配,那语法就有问题,这是第一个,第二个连官方也说不建议来使用通过9300端口来操作ES,而且呢,八以后官方也将会废弃E的search,通过9300端口来操作的,直接炸包,所以呢,我们仍然是通过9200来操作ES,更简单,那就是给ES来发送请求就行了,那给ES发送请求那就有非常多种方式了。首先第一种市面上呢有一个第三方的just clean,它可以操作EAS search,它就是呢,通过给ES的9200端口来发送各种请求,如果是查询就发我们的DSL来对ES来进行操作的。但是它的缺。
02:13
点呢,它不是一个官方项目,而且呢更新比较慢,比如我们来可以从me仓库里边来看一下,在me。Repository里边来点开,如果我们要使用G也是可以的,来写一个。这有一个search box g,我们来点开,我们发现呢,最近一次更新是一八年的,而且呢,目前只支持到了6.3版本的ES,虽然说7.4版本很新,目前市面上呢还没有大量使用,但是在我们这个项目里边,那他就没法用了。第二个。既然是给EL search发请求,只要所有能发请求的都算,所以呢,Boot加自带的rest templt,它能发送各种get post delete请求,那么就可以通过它来给ES的9200端口发请求,来操作ES,但它的缺点就是它只是用来发请求的,那如果我们要操作ESSE复杂的DSL语句,那么就得自己封装,自己拼装,所以呢,它本身跟ES的关联性基本上是没有的,那这样呢,我们很多操作都自己封装起来的话,那就太麻烦了,包括发请求的工具更多,Htp client kttp等等等等,只要能发,那E有一个,那E这些杂操作要我们自装,这两个呢,我不用了,上面这个呢,我们也不用了,留下我们可选择的是elas search rest client,这是官方为我们提供的一个rest client,由来DES。
03:50
阿送rest请求的,而且呢,他把里边对ES的一些复杂操作都给我们封装成各种不同的对象,它层次分明,用起来也非常简单,而且呢,官方的ES发布的几个几版本,它就会更新到几版本,所以呢,我们会优先选择官方提供的rest,包括我们来参照官方文档,在mapping里边来找到它的这个DOS,好,我们来打开DOS,这是ES的官方文档,我们之前学习ES看它的getting start,但我们现在来看ES的客户端,ES这一块呢,就有一个叫e search clients。
04:27
这是他的我们之前阅读的文档,这是他客户端相关的文档,来把它点开。那ES官方呢,就支持很多种语言对它操作,比如go语言的rub北GS包Java客户端,Java的客户端等等,还有Python PHP的支持,而且我们发现这诶这有一个javascript API,有的同学就想了说我们为什么不能从页面直接通过GS来给我们ES发送请求,在页面展示,我们就不需要过我们Java这一层了,虽然说这种操作是可以的,但是由于ES是属于我们后台集群服务器,这个端口呢,我们一般不对外暴露,那如果对外暴露了,那会被别人恶意利用,这是第一个出于安全原因,当然这也是一个最大的原因,所以呢,所有请求都应该发给我们Java项目,由我们Java来操作我们的后台集群。第二个原因,GS的客户端本身对ES的这个支持度稍微有点低。
05:29
其实说白了,如果我们要用GS操作,那我完全可以不用ES官方提供的这个GS相关API,那我们直接发送AJS请求,那不就行了吗?我们要进行什么查询,自己来写好们的quary d SL发送出去,所以说呢,基于这两点,我们就不需要用GS来直接操作我们的ES,我们还是将页面的所有请求转给我们的Java程序,让我们的后台业务操作我们的后台存储集群,好最终呢,我们在这儿来找到使用Java client,注意这是两种,一个Java API,这种呢是基于9300端口来操作ES的,而Java它基于920端口来操作E,包括看Java API,它这一块操作呢,文档里边都有详细的,包括它的地址,但是呢,就来阅读一下它这个首页提示,他上来了就说transport这个东西呢,在7.0已经被标记为过时了,而且呢。
06:29
8.0也一定会把它移除掉,所以呢,完全推荐我们来使用我们这个Java high level rest就是这个高阶rest客户端,那么呢,最终还是选用我们这个rest client来用它,而且呢,这分两个,一个是低阶的rest client,一个是高阶的rest,那高阶呢就对低阶做了更深层次的封装,他俩的关系就类似于MYBC的关系一样。我把把jbb CE封装,我们再来操作数据库,那就简单多了,而不需要像以前操作数据库一样拿到连接干一大堆活,所以我们呢,我们最终选择高阶rest client来点开所有的文档呢,在这儿都有非常详细,我们要起步,开始我们就可以看getting start,所以呢,我们最终就来使用它来操作我们的ES,那这样呢,我来单独创建一个项目,因为作为检索我们需要做做成一个单独的项目,好来写一个model。
07:28
还是使用spring初始化向导group,我们就来写。com点硅谷,我们现在是鼓励email。Artifact,我们来鼓励mail杠我们的search,这个呢是我们的检索服务,我们在这来写上我们的检索服务,主要是用elastic search来进行检检索的search。包名我们来改一下,我们就叫search,第二好,我们来选择下一步,首先呢,我们来选中,我们是一个web项目。
08:03
我们要整合ES,我们可以在no circle里边选择spring data的这个ES,但我们之前说了spring ES的这个支持现在最多支持到6.3版本,所以呢,我们在这一块就没必要选它了。当然如果版本是我们6.3几的spring对应的版本,那选它也是非常不错的。data呢,对它做了更简化的封装,那我们就除了选择web,我们直接导入原生的ES操作的客户端。好,我们现在来把这个项目我们先来创建出来。然后呢,来看怎么使用ES的这个rest client,首先要做第一步肯定来导me依赖,我们就把它直接点开,在这一块呢,我们有没的依赖地址,我们直接将这个依赖地址来复制来我们高阶API,好,我们把这个复制来,我们放到我们的这个search模块里边,给web下边我们来放到ES的高阶API,但是这个呢,我们是用742版本。
09:02
我们将我们的版本来改过来,然后呢,我们改好以后,我们来看一下我们的高阶API search里边的里边只要导入了我们这个search,我们这个high client好导入了它呢,会帮我们来导入search对应的相关版本,包括它的client的这一些版本。当然这个版本呢,我们发现这个EL search有个685这个版本相当于就不配套了,那这一块呢,来搜一下elastic search,来搜一下它的这个版本。这个版本呢,每一个都有它自己对应的版本,那为什么我们这一块是685呢,来点开给大家看一下,因为我们是spring boot项目,在spring boot的这个depend里边。我们来搜一下关于ES的版本EL search,我们发现诶BOT其实对ES的版本也做了管理,当前springbot如果默认整合spring data来操作ES,那它的版本呢是685,所以呢,我们把这个版本一定要改掉,那么在这把他的刚才的那个版本信息复制来,把这一块直接改成742,那这样一改以后呢,我们整个spring BOO的这一块依赖就需要改掉了,我把它刷新一下,那看它有没有自动改掉,好这块保证ES呢也是742版本的,那至此我们这个ES的这个高阶API就导入了,我们第一步导入ES的咱们这个高阶rest client。
10:31
Rest high level c,那么最终使用它来操作ES,那么这个导入进来以后呢,我们如何来操作ES,那么就得配置,如果我们是导的spring data来操作ES,那配置就非常简单,只需要在配置文件里边指定好ES的这些地址就行了,但是呢,我们是自己做的,所以我们自己就要对ES来做一个配置,我们来专门来写一个config,我们在config目录下,我们就写一个elastic config,这是我们鼓励mail的,这个conflict鼓励mail elastic search conflict。
11:09
来写一个叫configuration,诶我们这儿怎么没有configuration,那我们写这个也是可以的,Spring boot configuration代表这是一个spring boot的配置类,这个configuration呢没有导入来,可以看一下我们这个问题,这一块的being configuration都没有导进来,那说明我们这个工程的这个依赖还是有问题的,我们boot的副项目是2.2,可能是之前我的这个仓库的2.2出现了问题,那我把这个跟别人都统一,我们用2.1.8好。鼓励mail search,好,我用这个2.1.8,现在呢,我们这儿就能写configuration了,我们来试一下configuration,好,一定要保证自己赢得这依赖都没问题。同样的,我们这个检索服务还是之前那一套,我们先来导入我们的common包,来写一个dependency,鼓励mail common,这里边呢有我们的注册中心等各种信息,那么就先在这儿来配置一下注册中心,比如NAS discovery server a drr,就写127.0.0.1,本机的8848,那么呢就要启动NAS,那在这儿来先启动起来。
12:23
使用startup。然后呢,我们还一定要配上spring.application name应用的名字,好,我们把这一套呢,都全部默认就写完上来呢,我们要启用服务的注册发现。那这样呢,我们这个服务一启动,它自己也能注册到注册中心,也能调用别人了,当然整合ES呢,还是这三步我们继续来做完,首先第一步导入依赖,这个依赖呢我们已经倒了,第二步编写配置。这个配置呢,仍然是要参照官方文档来点开,我们找到官方文档rest client的这一块,我们来看这有一个安装来点进来。
13:08
他这呢,就说我们这个rest client的实例是这么来创建的,所以呢,我就直接把这一块的代码我们来复制来,我们给容器中就放一个这个实例,以后我们用它来操作ES,我来复制一下,我们在这儿我来写一个方法public,好我们先来写一个world返回我们就叫ES rest client,我们来把这段代码呢复制过来,导入相关依赖import好我们都导入进来,导入进来那发现呢,这一块是这样子的。如果我们ES有多个,我们只需要来指定每一个ES的地址以及端口号以及协议名就行了,因为我们现在没有装集群,现在只有一个ES,所以呢,我把这个new hostt,我把这个删掉,我们ES的地址呢,我们来指定一下192.16 8.56.10,那这样呢,指定完返回一个这个client,我们将它直接返回就行了,来return它。
14:11
所以呢,那最终我们这个方法就返回它,我们把它放到容器中,那以后我们操作ES就用它来操作,包括上面这一段代码,其实我们抄一遍大家就知道它是什么意思了,因为我们要返回一个它,那我们就需要new一个rest high level client好来创建出它,但是创建的时候呢,我们也发现在这一块呢,构造器需要传入一个参数,传什么呢?我们来点进来看一下,需要传入一个rest client build,所以呢,这个builder该怎么创建,那我们就得写一下了,假设呢,我们这有一个rest build,这build呢,我们。如果创建完了给它里边一传,那么它呢,最终就会返回这个,那当然这个build我们先来给它初始化,它最终返回的就是这个client,那么最终要给前边返回的就是它,那这个build又该怎么创建,那参照文档就是用这个rest client,好rest client点一个build,我们发现呢,我们能传入节点或者这个htp host都行,所以呢,我们就应该传一个有一个http host,而这个host里边呢,我们点开看它的构造器。
15:26
有三个参数,这三个参数呢,分别代表这个意思,我来复制过来,其中host name代表我们ES的IP地址,Port代表端口号,包括schema代表我们协议的名字,那默认呢,这个协议的名字就是HTTP,不传也行,所以呢,我们这个host相当于要用这三个,那这三个我们就自己来写上192.16 8.56.10,包括端口号,我们是特类型的9200,还有chema,我们是HTTP端口,HTP协议al,我们把这个创建出来,那么这个builder呢就好了,所以呢,我们这个builder。
16:05
就是通过用这个方法来创建出来的,我来复制过来走,那分解出来就是这三句话,这都是参照我们官方文档拿过来的,那这就是第二步编写配置,主要呢是给容器中,给容器中注入一个我们叫rest high level client,它主要来操作我们的9200端口,那接下来我们要操作ES,怎么操作呢?那么接下来在测试类里边测一下。我们在测试类里边,先来看我们能不能拿到我们容器中的这个,那这块单元测试呢,还有点问题,那这就是我们之前改boot版本,218版本,那218版本的单元测,我们就得复制来,是这个2.2最新版本的单元测试已经在这排除了这个解unit这一块的依赖了,好,我们现在把这个拿过来,我们来继续来进行测试。
17:02
所以这一块我们把这个就删掉,我们来使用我们自己测试的API,那首先呢,我们注入我们的这个ES client们把这个拿过来。OK,来写一个client,我们进行O,那先来看我们容器中能不能注入这个console,诶不是consolo c4out,那们先将我们这个客户端呢,我们来打印一下运行这个方法,那这一块呢,这是它之前生成的单元测试的这个功能,我们来写成我们兼容的这个类型,好,我们现在来运行这个方法走,那么这儿报错,说我们这个方法呢,也得加帕里克。2.2的单元测试跟218是区别很大的,好,我们现在来测一下,我们发现呢,我们这儿写了一个呢,那说明呢,我们这个autowa注解它都没有解析成功,那如果解析成功了,要么就注入不到,那也不可能是一个now,那spring boot默认的这个测试它还缺,我们要选一个叫runways。
18:00
在这里边呢,要指定使用spring的驱动来跑我们的单元测试,所以呢,我们这一块要写一个叫spring runner,好点一个class,这才是我们以前兼容的这种单元测试,我们现在来测试一下走运行起来大家一定要注意我们新版的2.2版本的spring boot跟2.1的这个测试。好,我们看到呢,这有一个错误,错误呢说不能加载我们这个IOC容器,原因是我们没有这个指定数据源,那这就是由于我们这个系统工程导入的这个common里边还有数据源的相关配置,所以呢,我们一定要在这儿不要用到数据源的情况下,把数据源呢排除掉,Data source auto configuration,那这是由于我们common里边默认是有数据源的,只要有数据源呢,我们就得配数据源有关的自动配置,比如我们MYSQL的驱动,包括马贝斯plus的依赖也都在这儿,但是呢,我们现在这个又不操作数据库,好,我们把这个去掉,现在呢,我们再来测试一下走。
19:09
我发现这呢,测试通过能打印出这个对象,那说明我们这个就创建出来了,它就可以操作ES了,那具体怎么操作ES,我们就接下来就可以参照官方文档,参照官方的API我们进行操作就行了,那这个操作呢,我们下一节课来给大家演示,主要所有的操作全部都在我们官方文档high level rest client里边,我们照着它来进行操作,无论是进行检索还是索引,包括对集群的一些操作等等,在这儿呢都有啊,我们把这个API地址放在这儿。那下节课呢,我们就来测试一下对ES的这些API。
我来说两句