00:00
好,那接下来我们在这里实现的过程当中,大家也会想到我这里边要有一个。No movie哦,我这里就叫movie df吧,这个没关系啊,Data frame,对吧?把它传进来外面还应该有一个影视的参数implicit ES configig,呃,ES configig对吧?我们把它传进来后边还是没有返回值,所以直接就是一个unit类型,好那么接下来大家会看到我们是不是就是要创建到ES的连接,然后对S里边的呃数据做操作了啊,首先大家看一下这里边的配置,稍微有点复杂啊,我们这里就是。大家只要看一下是怎么写的就可以,大家如果习惯用那个just去做这个ES的连接的话,也可以按大家熟悉的方式来,我这里边的话是做了一个什么呢?大家看新建配置的时候是用到了呃,EES它连接的这个库里边用到的一个settings,这个settings,大家因为Java本身里边也有settings对象,对不对,大家不要影错啊,然后我们呃,可能这里边就只给了这个class name,然后build出来,我们就创建这个ES客户端,接下来是做这个事情,那这里边调用的大家看到啊,比较奇怪,就是pre built transport client啊,那这个是要跟这个transport。
01:28
Host是不是要有关联啊,所以大家看到后面这个ES client是不是要有一个a transport address这样一个过程,那么这个过程里边大家会想到我们肯定是从已经写好的es.transport host里边去拿,对不对?那这里边考虑到一个什么问题呢?是不是考虑到我们有可能传进去的是逗号分割的一组织,所以接下来这里边做的这个操作相当于是干了什么事情,就是要按照这个逗号分割,然后一个一个拿出来,然后把对应的主机名和pot填进去,对不对?其实就是做了这件事情,尽管看起来很复杂,但做的事情还是比较简单,比较直白的啊。好,那现在我们还是把这个代码还是敲一遍吧,尽管有点复杂啊,大家还是应该得手敲手敲一遍,所以我们新建一个配置啊,新建ES配置。
02:25
这里我们还是就叫做setting,它的类型是一个叫做settings的类型,大家看到这里边我们在选择的时候选哪个呢?我们是不是应该选这个es.common.settings啊,肯定不要去选这个SKY兔子里边的东西,对吧?呃,我们肯定是选这个跟ES相关的东西啊,那么呃,把它定义出来之后,它应该等于settings。点,呃,大家看到应该有一个builder对不对,然后后边可以去put一个参数,那么我们这里就叫cluster.name里边要传入ES config里边的classster name对不对啊,就是这样的一个做法,然后后边再调用它的一个点Bill的方法啊,这这样才能创建出这样的一个ES。
03:25
好,那接下来我们要创建一个到ES的连接,对不对,相当于创建一个ES client对吧?新建一个ES客户端,那这个我们就叫做ES client,它的创建是用到了一个叫做pre built built transport client这样的一个方法,它里边把settings穿进去,这是这样的一个创建方式,后边我们做的事情是什么呢?大家会想到我们要把transport host里边所有的每一个host name和这个po要提取出来,对不对?所以我们这里的提取方式是大家看比较,特别是用了一个用了一个正则来做提取,对吧?我我把这个先copy过来吧,大家如果看这个写的有点奇怪的话,这个这个名字比比较。
04:26
哦,这个找扣,我们把这个引入,然后大家会想到它应该是一个什么东西呢?我们这里定义的是一个正则对吧,大家看后面是不是点R啊,呃,是这样做的操作,那里边是怎么定义的,我们看一眼啊,里边是怎么定义的这样。大家看这其实是冒号分割开的两部分对不对?我们要按照冒号分割开的两部分去做这个政策匹配,前面这一部分大家认识么?这个叫什么点是表示什么,任意字符加表示多个对不对?所以其实前面就是任意字符多个任意字符对不对?
05:21
所以大家会看到冒号前边的这个主机名是不是确实是任意字符都可以啊啊,当然这里边没有做,就是那种复杂的筛选对不对?呃,默认主机名什么都可以,所以就直接用这种方式把它表示出来了,那大家会想到啊,前边冒号前边是主机名,后边是什么?对,后边是不是端口号啊,端口号是不是必须得是数字对吧?所以大家看这里同样还有加号,这是不是多个啊,那前边是不是杠杠D表示什么?对,就是在正则里面表示数字对不对?因为本身杠D这个转移字符表示数字,那本身斜杠反斜杠是不是也要做一重转义啊,所以杠杠D本身表示一个数字,然后加号表示多个数字对不对?呃,简单的复习一下正则啊,相当于用这个也是杠杠D加号好,我们通过这样一个正则就可以筛选出匹配的这种形式,对不对,冒号分割。
06:21
前面是host,后面是po,呃,所以接下来我们要做的是什么呢?其实就是呃,ES。我们应该从config里边拿到它的是不是transport host啊,要去对它做一个什么处理,是不是按照逗号把它分割开来啊,啊,这是我们要做的一件事情,然后分割开来之后怎么办呢?那这里边我们可以定义一个fo each里边做什么操作,是不是根据前边定义好的这个正则去对它做匹配啊,模式匹配对不对?那么匹配成什么样子呢?哎,我这里边定义就是如果前边的是一个,如果匹配到的话,前边我定义成host对不对啊,匹配之后我做这样的一个。
07:19
一个赋值模式匹配的赋值,那后边就是一个pot对不对?那大家想我们匹配模式匹配到之后,拿到了对应的host和po,然后是不是就把这个添加到我们定义好的这个客户端里边去就可以了啊,大家看这个客户端是一个呃,Transport client对不对?我们把这个东西要添加进去,好,那这里边就是ES client,我就应该ADD,大家看啊,Transport address对不对?一个一个添加,然后里边就new一个,这个我要稍微看一眼啊,大家会看到里边new的是一个叫做I net socket transport address这样的一个东西啊,那大家看这个东西我们需要引入一下对不对?
08:12
好,它引入进来之后,里边还有参数,里边的参数是什么呢?啊,里边的参数其实就是一个host,一个po,对不对,Host又用了另外一个。大家看到我要用一个I net address。呃,这里面好像没有办法直接引入,对吧,我们看一眼是叫I net address吧,对,所以这个东西现在没有的话,等一下我们需要从别的地方来引入。大家看一下这个到底是哪里的东西啊,I net address,它是Java里面net里面本身就有的东西,所以大家想到我们相当于是什么呢?把这个已经配置好的,就是已经提取出来的host的信息,是不是用Java的net里边的方法先把它包装成Java对象对不对?先把它提取出来,然后传给这个ES里边的I net soet transport address这样一个对象去做一个构建,对不对?因为大家知道ES底层是Java写的嘛,所以我们这里的一些尽管看起来操作有点复杂啊,大家知道他做了什么事情就可以了,就这些东西其实并不是特别的重要啊。呃,我们接下来是应该用一个get by name去把host传入就可以了,当然了,后边是不是还有这个portt啊portt,呃,当然本身它是一个,大家看我们要传入的上面这个address是一个I net address类型对不对。
09:50
Portt是不是应该是一个int类型啊,所以我们要把它做一个to int操作对不对啊,所以大家看这所有的里边的这种转换,其实就是我们这里边的这个I net soft transport address,它要求的参数数据类型决定的,对不对,所以我们把它转成一个Java里边的it address类型。
10:13
好,呃,这个稍微有点绕啊,大家如果习惯是用just去做操作,那就用just就好了,我这里边就是给大家用这种方法实现,呃,然后接下来大家会想到我们是不是要去考虑往里边写数据了,那写数据之前按照标准流程还是应该怎么样呢?先清理已经有的数据对不对?先清理呃,遗留的数据,所以我们先要考虑在这个是不是在在我们当前建建立的这个数据库里边有没有我们想要的那个index对不对,我们想要建立的index名字就叫做recommender,所以这里边我们去判断一下if ES client里边怎么样去判断它这个有没有。
11:09
我们想要的这个recommender呢?大家看在ES client里边用调用这个admin里边的方法,它里边有什么呢?呃,Indexes in in inexes,对吧,这是操对索引的操作,那么它可以怎么去操作呢?去找它是否存在对吧?Exist,那么大家再看一下这个exist里边又要传什么是东西啊,这个就它的这个操作比较复杂啊,就要new一个inexist,大家看exist request,因为大家知道对于ES的所有操作,是不是就是在往ES服务器发送HTV请求啊,所以我们每一次要做一个操作,是不是就要new一个这样的一个request,呃,这里边的这个参数参数,大家再看一下这个有哪些东西啊?呃,New了这个request之后啊,其实其实就是里边把我们这。
12:09
个对应的index传进来就可以了,对不对啊,我们就把这个看它是否存在啊,所以这里边把ES conig里边的index传入,好呃,那这里大家会想到我这里边就已经相当于已经判断它是否存在了,那后边我要是不是要把这一个request要发出去啊,大家看它发送这个request的过程是用了一个get请求对不对,所以是action.get后边get回来之后是不是要判断一下结果啊,所以后边是is exist,所以大家看这个尽管写的稍微有点绕,但是整个逻辑应该还是比较好理解的,对不对,只不过就是说一步一步稍微的有点复杂,看起来好,那接下来就是衣服里边如果拿到的话,那怎么办呢?呃,大家会想到是不是拿到的话就把它删掉啊,同样e plant。
13:09
里边做做一个admin,大家会想到还是in对吧,那后边就不是一个exist了,是不是我们可以直接delete啊?呃,那delete的时候里边传什么参数呢?大家看同样还是new一个请求对吧?所以它这个请求叫诶,Delete应该可以吧,大家看delete index request对不对?那这里边我们同样还是把ES con里边的index传进去,所以大家看接下来它里边所有的调用这个ES client的操作,其实都是这种模式。就是哎,我们调这个ES plan.admin然后它的indices我们去做对应的操作就可以了,这里边我们已经把它清除掉了,那如果清除掉的话,是不是接下来就可以创建了啊,清除就是为了创建做准备的,所以创建还是类似,是不是indeses后边就应该是点对create,大家是不是想到能想到的呀?那这个在new的时候是不是就应该new一个create index request啊,呃,所以尽管他写一长串,大家如果熟悉之后就会发现,其实它就是这么一个一个写就完事了,那现在我们就已经创建了这样一个,呃,叫做我们这里边定义的是叫做呃,Recommender,对吧?
14:36
大家看这个index是不是叫做recommend,我们定义已经定义了这样的一个index,接下来是不是要把我们定义好的数据这个movie df要写入到对应的index里面去啊,所以接下来什么方法呢?那是不是还是调用data frame对不对?大家看跟上面那个mango的操作其实非常像,那这里边我们要传es.node。
15:08
大家想前面我们配置的时候配置了transport host,那我们还没有把http host传进去的对不对?那htp host在哪里传呢?这里传给es.notes。在我们创建这个就是Spark跟ES连接的时候,作为这个option传进去,这里边给的是ES config里边的HTTP,对吧?然后接下来option我们还应该传什么呢?传,比方说我们给一个http timeout,定义一个它的这个timeout的时间,呃,我们这个给大一点吧,在我们例子里边应该给了100M,大家知道是什么意思吧?给个100分钟对不对,稍微大一点,然后options还可以继续设定,比方说我们设定一个mapping ID,那这个操作,这相当于是要指定映射的主键对不对,在我们这里边主键应该是哪个。
16:16
我们这里边movie里边对,肯定是mid对不对?所以我们这里边映射主件指定成mid,好,那接下来还是一样类似的一些操作,是不是会有moded overight对不对?然后大家会想到还有一个format,对吧?之前我们mango里边form ma的时候啊,用的是这个mongo db.spark CQ对不对?那这里边我们当然就要用ES了,对吧,ES是org elastic search.spark.cq好,我把它们form成这样,然后点C这样就可以了,对不对啊,当然这个点save的时候,我们最好是得把它这个,呃,就是里边的路径还是要写清楚啊,那我们这里边是不是要写入到ES conig.index里面去啊啊,如果我们还想在里边加上一个type的话。
17:16
那我们就加上斜杠,因为大家记得前面我们是不是定义过一个叫做ES movie index这样的一个东西啊,啊,所以我们把这个当做type,后边再传进去对不对?因为如果我们在这个索引recommend索引里面还有别的东西的话,我们方便去区分啊,这个大家应该熟悉啊,就是在ES里边下面还可以加一个type对不对?好,那我们把这些写完之后,数据就应该能够正常的写入到ES里面去了,好,现在我们看一眼这个,诶,这是之前的啊,看一下现在ES还起着吗?哎,是起着的对吧,那刚才大家看到,呃,我们要看这个当前的就是所有的索引,我们是不是可以用这个cat,然后indices去去查找一下啊,然后我们看到当前是不是并没有什么索引啊,对吧?呃,所以大家会想到,如果我们运行程序之后,是不是应该能够找到一个新的索引,好接下来我们还是运行一下,看一看效果怎么样。
18:23
好,回复录屏我们来看一下,呃,我们首先还是看一下这个mango里边是不是还是正常的对吧?如果mango里边都没写进来的话,这三个看起来是不是没什么问题啊,跟之前一样对吧?Find我们count一下啊,这个看起来没问题,还是一样的2791条数据对不对?那么啊,大家有什么问题吗?应该没问题吧,好,然后大家会想到我们接下来是不是应该去看看这个里边到底有没有对应的数据写进去,对吧?那首先大家看一下,我们先查询一下当前ES里边所有的索引,大家会看到是不是多了一个叫做recommend recommend的索引啊啊,所以这是这是这一部分,我们首先已经可以看到有了recommend这个呃,它对应的数据,然后大家自然会想到那我。
19:24
我们是不是接下来应该去看一下recommend里边有什么东西对吧?这个东西呃,怎么查大家还记得吗?是不是可以直接去找这个recommender下边我们是不是发请求的时候可以去给这个search对吧?呃,然后应该直接search就可以了啊,Pretty这样可以对吧?诶大家看现在是不是就拿到了我们这里所有的数据啊,然后我们可以看一下直接返回的这个结果里边我们是不是his有多少条。对,2791,那是不是相当于说把所有的电影是不是应该都插入进去了呀?啊,大家应该能够想到啊,我们应该是这样的一个状态,呃,当然我们可以具体看一看里边的内容,呃,我们好像没看到诶,大家看到终于看到一个,这里是不是有这个taps啊,所以大家看我们是不是不是所有的电影都能够有这一列,因为前面我们看到用户给电影打标签的数据是比较少的,对吧?所以前面我们看了两个电影好像都没有TS这个标签,诶这里看到这里的时候是不是发现它是有这个标签的啊,所以这符合我们的预期啊,大家如果能够看到这样的结果的话,其实就没有什么问题了,呃,当然这个好像看起来只看到有一个对吧?呃,那大家可能想这个如果说。
20:51
我现在是运气好,一查的话,这一页里边还看到一个如果要是如果要是我们看到这一页什么都没有怎么办呢?那我们可能就只能是加一些参数去做一些复杂查询条件查询了,对吧?那比方说可以怎么查呢?呃,我们这个嗯,克一下local host 9200,呃,然后recommend search pretty,呃,首先如果我们这么查的话,当然查出来跟刚才是一样的,对吧?那如果说我们想要去加一些条件的话,是不是可以加上这个杠D参数啊,这个这个大家之前在讲LIS shell的时候,是不是讲过克命令。
21:42
没啊,没有讲过啊,啊,大家可以看一下,就是客命令是一个非常强大的一个命令啊,用这样一个命令它可以实现就是发送,呃,就是各种各样的HTP请求,大家看我们这里边如果不指定参数的话,默认发送的是一个get请求,前面我们也可以加上杠X参数,可以指定发送post delete啊都是可以的,Put都是可以的,所以这里的话,我们就直接在这里加入一个杠D参数,指定这个query条件,Query,呃,那大家会想到这个query条件里边我们是怎么一个表达式呢?这个ES里边比较奇怪,它是层层嵌套,里边得是一个布尔对吧?然后呃,里边是must对不对,然后应该是。
22:42
对不对,一个Z,最后我们是不是要找到,找到什么呢?F,呃,F1LD对吧,Field的应该是什么?是不是TS啊对,我们找到这个field的存在的对应的所有的数据对不对啊,我们看一眼啊,现在找到的这是不是就是啊,大家看到这个有TS所有的这些数据啊,啊,当然我们可以看一眼,他一开始命中的时候到底有多少条呢?啊,我们看到hits有202条数据,所以2000多多多个电影里边是不是只有202个,它有用户的这个,呃标签啊,有TS这个标签啊,所以大大家可以看到就是确实这个数据还是比较少的,呃,我们后面只是把这个作为一个展示,就不会用它做电影的内容分析。
23:42
了,不会用在这里了,好,这就是这一部分内容。
我来说两句