00:02
好呃,那把这个它所存的这个结构我们搞明白以后啊,接下来我们就可以开始慢慢的去往后做了啊,我们就开始来去研究了啊好,那我们这个具体的操作的话呢,其实我们正常情况也分什么,就所谓的什么DDL啊,还有什么什么DML啊。对吧,DDL就是什么。对,你这个就你要放到这个数据库里面讲,比如什么建表建库,删表删库,改表改库那些东西对吧?DML就什么对数据的操作。是不是,那其实我们在这个ES中呢,也是大概可以这么去划分的啊,什么DDL,比如说键索引啊,删索引啊,改索引啊。对吧,查索引啊,这个DML呢,就是插入数据,修改数据,删除数据,查询数据。是不是啊,这要能够知道的啊,这但是我们也没必要说这个,就这给大家这么完全按照什么DDL和什么DML去分啊,我们就把它这个基本的操作给大家去讲一遍。OK吧啊,所以我没有什么太多这个这个划分的啊,行,那我们先从这个键索引来说起吧,因为你想操作你就就得有索引。
01:07
对吧,先从这个键索引来说起啊。这个索引怎么建呢?就索引我们现在说的这个索引就是那个表了啊同学们啊,就是那个表啊,OK,那我们要建一个索引,然后呢,将来呢,去网塔里面上插入数据,那这个索引怎么建呢?非常简单,就这么直接,什么put put就是什么。差的意思。对吧,然后后面的话写的什么,就是你的这个收银的名字啊呃,我得起我的服务啊,这服务忘起了啊,每次都忘起服务啊,其他服务啊,起他服务以后我们把这个演示一下啊。这个就什么,直接骑ES就行了哈,别的不用写了啊,直接骑个ES啊。然后打开一个浏览器啊。行呃,先让他起着哈,然后呢,我们先去解释一些东西,你看一下啊,那你说你这个建索引的话呢,你指定的光指定一个索引的名字就能行吗。
02:01
这就相当于你建表啊,你相当于你建表的时候呢,你光指定一个表的名字,你没有指定任何什么这个字段,对吧,没有指定什么字段的名字,没有指定字段的。类型。对吧,这些东西都没有,你就光有一个表的名字而已。大家想想啊,这个情况在你的买生活中允许吗?不允许。对吧,不允许啊,但是呢,我们在这个ES中,我是可以这么去做的,就是我在建索引的时候呢,我是可以什么不指定任何的字段的。啊,那么这个时候大家可能会在会在想啊,那你说你不指定字段,那我将来这里面怎么去存数据呢?我存哪些数据啊。注意啊,它为什么按照你的第一条数据呢,自动做这个推断。自动会做推断的,就是你加好这个索引以后呢,你说它那边有什么字段呢,我也不知道。啊,目前我是不知道的,当我把我的第一条数据插入进来以后呢,诶,它就会按照你的第一条数据,然后呢,自动做推断,我就能推断出来你的数据中有哪些字段,以及你字段的类型是什么,它会什么,帮你自动做一个推断。
03:03
OK吧,说现在我们先不考虑这个,就是怎么指定这个字段呀,怎么指定这个类型啊,先不考虑那么多,我们就先把这个索引建出来,先正常去使用好吧,来现在应该起的差不多了哈,我们来这个访问一下,那为什么直接访问那个K班了哈,对吧,5601啊,直接访问K班的啊。好过来以后呢,进来进来来到我们的这个来到这儿啊。对吧,这是我们昨天写的吧。小一点啊。好,这是我们这个中间写的啊,那我怎么接着往后写吧。行,来这个写个注释啊,这是我们的这个就是数据操作啊,好,首先第一个就是我们这个创建索引,创建索引,然后呢,不指定这个字段啊好,咱们创建呢,就什么直接put put后面就写你说音名字,比如说我们就叫什么movie index。理解吧,就是那个电影啊,电影来more index OK,来执行一下,呃,前面那个斜杠,你想写就写,不想写就不写啊,同学们找一下。
04:03
好呃,他每次执行完成以后,都会有一个结果给你返回啊,大家看一下,这就是他返回的结果啊,那这个结果就是什么成功了啊,就是没有什么任何报错信息的啊,如果有报错的话,它那个报错信息会比较多哈。所以说你每次这个点完这个三角以后呢,你大概去瞅一下这个结果哈。如果说报错了,你就什么别别急,别着急往后走了,你先把这个错给他解决一下,理解吧。行,那你看啊,这个索引我就把它建好了,那建好以后呢,呃,我想看一下有没有这个索引,我们昨天不是讲过这个,就查看你这个索引吗。在上面。对吧,看看你这个索引啊,那我们可以去看一下啊,就是get,然后呢,下滑下catch,然后呢,Indexes就这个东西吧,你就慢慢的去用起来啊,用的多了以后呢,你自然而然的就把它记住了啊找一下。你看一下这里面是不是有我们的一个索引了呀,在这个地方more index。看明白了吧,它默认情况下,你看一下是不是有一个。
05:01
下的呀,而且的话他会给你带一个副本哈,它默认会给你带一个副本的啊同学们。看明白了吧,啊,就只不过现在它里面没有任何的东西啊,你看这个没有任何的数据哈,OK。行,这是我们这个创建索引,那这个索引你创建好以后,我们可以怎么做删除,对吧?比如说我将来不想要了,那我可以怎么删除索引。对吧,我先把这个DDL给你简单讲一下啊,我可以怎么删除索引,那这个索引怎么删啊,简单delete对吧,直接写什么写这个movie index,就是把它删掉来删一下。好,删了以后你再来查就没了啊,你看一下还有那个什么more index吗。没了吧,对吧,你可以去删啊,就可以建可以删。啊,可以建可以删啊,OK行,你这个里面都有啊,这个删除和这个呃,创建和这个删除。然后呢,呃,这个。呃,修改的话呢,我们主要是改数据啊,对这个所有的这个修改我们不讲啊。
06:00
行呃,那这个删除了,删除我们再来建出来吧,啊就把我就把这个动作给你简单说一下,因为后面我会用啊,就简单说一下就行了啊,因为一般呃不会用它,就是你这个,比如说你测试的多了,然后呢,不想要它了,你可以把它删掉啊来下面我再把它建出来啊,那还有这个东西把它建出来。好,建出来以后啊,接下来我们往里面放数据了啊,来插入数据啊好往索引中写入数据啊OK,这个写数据啊,注意我们有两种方式,一种是密灯写入,一种是非密等写入,写入数据啊,一种是非密的,一种是密的啊OK。这个啥玩意叫密等,啥玩意叫不非密等啊,说一下密等就是密等写入啊,要指定do ID,就是要指定一下你的什么文档的ID,就是我知道你是同一条数据。
07:01
明白吧,那这个非密灯写入。非的写的什么,就是不指定do ID就是我不指定ID,你的每一条数据过来以后呢,我认为你都是一条新的数据。明白吧,好来,那我们试一下吧啊,现在我就要往它里面放数据了啊,这个数据的话呢,呃,我要去复制一下的啊。走过三条数据啊,这三条数据是我们讲整个ES中反复会用到的数据啊,把它拿过来。好,放到这儿来看一下啊。呃,数据很简单啊,我们就什么样看了啊put,然后呢,Movie index,就是往我刚刚创建好的这个索引中放数据了啊,你看这个位置下划线dock。就只要你看到这个下滑的do,你就理解一下,它原来就是那个type那个位置啊,只不过呢,现在没有把它废除干净啊,我们是需要什么呀,需要使用一个占位符的啊,然后后面这个东西,这就是我的dock的ID,就是我当前整条数据啊,注意是当前我整条数据的一个ID。
08:03
就是这条数据在我的ES中存的时候,它会有一个什么独立的一个ID,就是这个一。理解吧,啊,就这个一啊行,然后下面就是整条的整个战胜数据,你能看明白吧,这是一个整个战胜数据啊,你看这个电影的名字,电影的ID是一,诶这个需要讲强调一下,你说这个这个一跟这个一有什么关系吗?同学们。啊,这两个一没有任何关系,没有任何关系啊,这个是我整条数据的,注意啊,是我整条数据在这个ES中存的时候,它需要有一个什么这个ID的,而这个ID是什么,是我数据中的某个字段的值。所以说这个一跟这个一没有任何关系啊,你你完全可以写,比如说我写个100。对吧,这都可以的啊,行,那我就写一吧,好,你看一下啊,这是我的电影的,呃,ID就是电影的名字,电影的评分,下面就是你看act list,它是一个数组啊,这个格式化一下你就能看得更清楚一点。对吧,这是一个数组,然后呢,他里面的话,我有三个演员啊,你看演员的ID是一对吧,叫张译,演员的ID是二叫海清,对吧,演员的ID是三叫什么张涵宇。
09:10
南航明白。对吧,这是一条数据,然后呢,你看啊第二条数据,一个一个道理啊,我给了个ID叫二,因为你所有的这个幂等写入啊,所有的幂等写入你都要指定这个do ID的啊,行,你看这个是。电影的名字,电影的ID是二,然后这个是叫湄公河行动对吧,然后呢,豆瓣评分多少分,然后呢,下面是演员列表,演员列表,他这个只有一个演员啊。对吧,他这个只有一个演员啊,就是叫张涵宇啊,随便写的啊行,然后最后一个是这个第三号文档啊,然后呢,电影的名,电影的ID是三,然后这个叫做红海事件对吧,随便写的啊,然后豆瓣评分,然后呢act list这个演员列表谁呢?演员是爱丽硅谷啊,这是我随便捏造的啊,随便你照的小数据啊OK。行,那你看吧,我们总共有三条数据,我要进到我的这个进到什么,进到我这个表中了啊,进到我这个索引中了,好,那我们在这个进索引之前哈。
10:06
进索引之前,先给大家去说这么一个事儿,就是我们可以怎么查看,查看这个索引的这个mapping啊,这个mapping是什么意思啊,Mapping其实你可以理解为就这个东西就是DSC table。就是你的表的结构,你能明白吗?你类比的去记啊,就是你这个操作在你的MYSQ中是不是查看表结构的呀,那这个mapping就是什么,查看我这个索引的结构,当然我刚刚建好了这个索引啊,它里面没有任何东西,所以说你现在看其实没有什么意义啊,这地方都有。对吧,都有啊,来我查看一下叫什么get,叫movie index后面的什么叫mapping,你看啊,你现在查看其实没有什么东西空的,因为我们在见你这个索引的时候,我就压根没有指定过任何东西,对吧,但是你看了啊,接下来往它里面放数据。啊,这个得放在一起啊,来,我把它往它里面放数据,你看我选中啊这个光标点到这,然后我去执行走。
11:04
这个成功了吧。对吧,这成功了啊,成功以后来这个时候你再去看这个卖品走有东西了吧。那你说这个东西怎么来的呢?这个东西就是它按照你的这条数据。做了一个推断,然后呢,我推断我自己推算出来的,你看啊,他推算出来什么东西啊,这个mapping里面我们主要看这个东西啊,就看这个pro啊,这么一个mapping吗?对吧,这个pro其实就是我们整个表中的字段,你看啊,它首先有一个叫act list。然后呢,有一个多半score对吧,然后呢有一个什么,有一个ID,有一个name。你看一下是不是跟你这个一样的呀,你看有个ID,这个ID就是这个ID啊,然后呢,有个name就是这个name,然后呢,有个什么多半score就这个好,有一个什么act list,好,那你再往上看,这就是那个什么act list,但是我的act list里面你看又是一个对象对不对,所以说呢,这又是一个什么战胜对象,OK,它又什么,又存了一个什么problem好,里面它有个ID,你看就我有ID,有一个什么name,你看我有个name。
12:08
对吧,它会自动帮你去做这个推算,然后就能够推算出来了。啊,然后呢,你在这个简单看一下啊,我们这个整个数据中啊,这个电影的名字和演员的名字是字符串,其他的都不是字符串,你看这个是一个数字,这也是个数字。对吧,这也是个数字,所以你会发现啊,我们的。电影的这个ID,它自动推算成了浪类型,对吧,然后你的评分呢,是有一个有一个小数的,它推算成了什么float类型,然后呢,你这个演员的ID呢,他推算的也是一个什么浪类型,你看一下是不是也是一个浪类型啊。但是你看啊,我们的字符串注意啊,我们的字符串类型的,来看它这这个字符串吧,它的类型它推算的是一个text。然后呢,在它下面呢,又有一个叫field,这个叫做属性啊,注意这个属性的话叫keyword,这个keyword。
13:04
不是,我们这里面我们没有任何属性叫keyword对不对,但是呢,它会有这个东西,这个东西是什么呢?这个就是ES自动帮你加的。自动帮你加的,啥意思呢?听我讲。字符串的类型有两种,一种是text,一种是keyword,这个我先提前说一下啊,后面我们会去研究的啊,一种是text,一种是keyword。Text表示倒排索引,就是要给你什么纯倒牌了,这个keyword表示列式存储。能明白了吗?这就是字符串的类型啊,字符串有两种类型,一种是text,一种是keyword。就说白了啊,现在我的这个名字啊,就我这个电影的这个名字啊,他既帮我做了大盘索引,又帮我做了劣势存储。OK吧,同样你看这个这个这个演员的名字也是一样的啊,演员的名字也一样,你看一下是不是既做了大牌索引,又做了这个历史存储啊。
14:01
能看到吧,又做了一个存储啊,只不过呢,它会什么,通过一个新加的一个字段,这个字段是属于什么,属于我内的一个子字段啊,就说白了,我们现在看内蒙下面什么都没有,对吧,但其实它现在表中存的时候呢,你在name的下面,它有一个子字段,这个字段叫keyword,就这个字段它的类型也是一个keyword类型的。啊Q,我的类型的这个是做了一个什么,做了一个劣势存储的,就说白了,将来我既可以对他什么做。全文检索对吧,做倒排查询,然后呢,也可以什么呀,也可以对它做分析统计,因为它也做了一个类似存储的。好吧,先把这个指导一下啊,那你看其他的话,就像我们的什么浪类型啊,什么float类型啊,这个什么完全都是什么历史存储的啊,就没有什么大盘索引。明白吧,先把这个能够大概的去看,看懂就行了啊,这个后面我们会呃慢慢去接触到啊,然后慢慢给他去说啊行来吧,这个第一条数据进去了啊,再来进第二条进去,好,第三条进去,行,现在我走过进去了三条数据,然后呢,接下来我们讲的就是哦,查看对吧,写到这呃,写到这吧,好来这个查看就是查询啊,索引中所有的数据啊,所有的这个dock啊,这个咱们查了,这个很简单啊,就直接什么get get,什么get moving index。
15:20
然后来吧,那你看啊,这样能不能把它查出来啊走。呃,这样还不行,这样不行,你看这样他查到什么东西啊同学们。啊,这样查到什么东西,这样查到是这样的。他把你这个当前这个more index的这个消息给你查出来了,你看到没有。是不是啊,一些setting啊,还有什么这个别的东西,还有你这个,呃,Mapping给你查出来了啊,我们想查数据的话,你你这样还不行啊,呃,查所有的话,那就这么写吧,Search一下,就是我要查出来所有的数据啊,这样就可以了啊来找一下。好,你看一下吧,总共有三条数据啊,这是我们总共查到了三条数据,接下来就是我们的数据了啊,这个黑字里面就是我们数据,你看啊,这是你的第一条数据。
16:08
对吧,这是你的第一条数据,然后再往下你的第二条数据,好,你的第三条数据。对吧,这就什么都把它查出来了。OK吧,好行,那接下来我们演示一下什么叫这个幂等写入啊,注意了。现在我总共就三条数据啊,然后接下来你看了哈,我再把他们的作为一个写入,你看再写成了吧。我无限的点,我写了N多次。对不对,我写了N多次,然后呢,你再去查数据走一下。好吧,你看下。还是三条数据。那不还明白还是三角数据。那怎么实现这个幂等写呢?注意其实主要就是看什么呀,主要是看你的这个doc ID,只要你写入的数据啊,这个doc ID是一样的,那他就认为这是相同的数据,它就会把你ES中已经存在的那个什么doc ID为一的数据呢,做一个覆盖。
17:05
这就实现了密等血,你比方说啊,我怎么给你演示一个效果,你看啊,现在我这个数据呢,我刚刚执行了N多次,我可以再给你执行啊,对吧,再给你执行,其实你发现啊,我每点一次,它是有变化的,你看这个位置啊。你看。对吧,我点一次它是有变化的,它这个版本是在变的。能理解吧,版本是在变的啊,OK,好,但实际上呢,因为我们的数据没有没有做过任何改动,说你这个查出来数据呢,它还是一模一样子的啊,一模一样子的,你看这个位置啊,这个一号文档是不是还在这呀,来,那我就把它截个图吧,你看了哈,这是我查出来这个一号文档啊,截个图放到这儿好,然后接下来呢,你看啊,我的doc ID不变,但是我把他那边东西呢,稍微改一改,比如说我刚才张翰雨雨对不对。看到了吧,改成了什么张翰雨雨,然后呢,这个red CC哈。能写吧,同学们好,Red CC来走一下,好,我又写入了一次,你发现这个又变了。但实际上我的数据啊,你看了哈,最后的数据来走一下,你看一下是不是还是三角数据啊,但是你注意看啊,我们的。
18:06
数据变成什么了呀?你对比一下。呃,来对比一下。不一样了吧?你原来是什么red c,现在是red CC,你是张涵宇,现在什么张翰宇宇?但是呢,你看看吧,我的do ID do ID是不是一样子的。这说白了啊,我本次的写入就是我这个数据的写入,其实是把你这个数据给它做了一个覆盖的。能听懂吧,这个叫密等写,那怎么实现的密等写呢?就是基于你的什么doc ID来实现幂等写的,只要我看到你的dock ID是一样的,OK,那我就是做一个什么覆盖的操作,如果说你已经有这个了,那就做做覆盖,如果说你没有,那我就写进去。所以说密登写的关键点就是需要什么指定你的dock ID。OK哈,来,接下来我们再来说这个非幂等的写啊,这个非幂等的写的话呢,我们不能用put了啊,我们用的是post。
19:01
能理解吧,其实你只要把这个拿过来就行了啊,来我把它,呃,再把这个拿过来啊复制。好,你只要把这个改一下,把put改成post,把ID干掉就行了,这就是一个非密的写。那啥叫分必得写呢啊,听好了,同学们。呃,这个我已经有这条数据了,对不对,我已经有这条数据了啊,但是呢,我这个数据我刚才写的时候,我是指定过它的do ID是一的,好接下来你看啊,我再次把这个数据呢往里面去放,但是我放的时候呢,听好了啊,我不指定你的ID,并且呢,我用的是post,好这个时候来往里面放走进去了。你仔细看这个ID啊,同学们。我这是我插入的第一次啊,插我的第一次。好,放到这儿来,我再执行一次啊,走又一次。好,再执行一次啊。走好,又一次。OK,来,这个时候我们来仔细看一下啊。
20:00
首先我先去查数据啊,咱们查数据呢,还是一样的,查数据就是直接什么get get movie index,然后呢,下划线search,就查所有的数据啊来走一下。好,这个时候你查到几条数据呢?我们总共查到六条数据。哪六条数据你仔细看啊,首先我的IDV2的数据,这是我刚刚写入的,对不对,这是我IDV3的数据,我写入的还有一个IDV1的数据,这是我们以前的三条数据吧,然后后面我又执行了三次,你仔细来看啊。相同的数据进来了吧?但是他认为这是不同的,为什么呢?因为你的ID不一样,你看到没有这个ID哪个呀,是这个。对吧,再往下。KK叉七看到吗?对吧,再往下。这个什么K37看到没。好,那你看看啊,他把这个三条,实际上是把这个三条相同的数据呢都写进去了,但是呢,ES认为这可不一样哈,为什么不一样呢?因为你没有指定过ID,而且你用的是这个post,他就认为这是一个非密的写,那么他就会把这个数据呢,真正的写入到你的这个index中,但是你写到index中,你得有一个什么doc ID啊,但是我没有给你指定啊,那么他会帮你什么生成一个doc ID?
21:15
看到了吧,所以说非密的写就是你不要自己指定doc ID了,它为什么自动帮你去生成一个唯一的一个什么doc ID,把它当成一条什么新的数据,然后呢,写入到你的index中,这就是我们的非等的写。好吧,行,那你看看,我们讲到这以后,大家可以去想想了,我们之前。就是我们在这个实施项目中啊,数据重复问题可不可以解决了。对吧,啊,应该什么叫叫什么这个应该这么说啊,实项目中啊,我们叫什么精确一次,精确一次的这个问题啊好,那我们怎么解决的,我们在项目中啊,在项目中现在什么做到了,做到了就是这个至少一次了,对不对。
22:07
是吧,那至少一次它的问题就是什么会有重复,是不是会有重复数据啊啊,那我们将来在写入ES的时候啊,在写入ES时采用幂等写不就搞定了吗?因为你有重复数据,我跟你讲你什么叫重复数据,你的两条数据是一模一样子的,这叫重复数据是不是?那既然你是一模一样的,那我只需要从你的数据中呢,我去找一个什么,找一个能够唯一标识这个数据的一个什么字段,比如说叫ID对吧,那你们两个的ID肯定是一样的。将来我这两个ID如果都一样的话,那我就什么采用这个密,等写我写入到这个ES中的这个index中的时候。后写入的就会把之前写入的给它覆盖掉,那我最终保留的就是一条数据。能明白吧,我最终保的就是一套数据,就哪怕说你这两套数据是不一样的。
23:00
对吧,但是我认定你是重复的数据,比如说呃,像我们那个日活对吧,我们那日活,那我日活的话,我就是什么呀,只要你的mid。对吧,只要我的mid是一样的,那我认为你就是什么重复的数据,OK,那我就什么把我的这个往我的ES中写的时候,我把那个mid呢,叫什么通过m mid来去什么指定,只要你的m mid是一样的,OK,那写进来以后呢,你都是重复的数据,那我为什么会给你做覆盖,我只会保留你最后写的那条数据。听懂了吧?同学们,我只保留最后写的那条数据,这样我就可以保证你的数据不会有重复的。好吧,说你看这就解决这个问题了啊,就是因为我们的ES它是支持这个叫这个幂等写和这个非幂等写的。记住了吧,啊,幂等就是put,要指定do ID,非幂等就是post,然后呢,不指定do ID。啊,但这个这个占位服得有啊,但占卜得有啊行呃,先说这么多啊。
我来说两句