00:01
OK,来,那我们接着往后聊吧,呃,然后下面的话我们就介绍一下这个ES本身啊,看看它有哪些特点啊。呃,这个特点的话呢,我们先这个有一个这个直观的认识就行了啊,我们在后面讲的时候呢,都会给大家怎么再去强化的啊行先来看第一个就是呃,天然的这个分布式数据库,啥叫这个天然的呢?啥叫这个分布式呢?对吧,哎,这个的话你要理解一下啊,首先分布式这个东西我们不陌生,那啥叫天然的呢,就说白了啊,这哥们呢。它本身就是一个分布式的。本身就是一个分布式的啊,就哪怕说,哪怕说我们搭的是一个节点的这个ES,它也要尽可能帮你去做这个分布式的一个存储啊,那么从哪个方面体现出来的,从这个方面体现出来的啊,就是我们的ES呢?它会将来把我们要存储的数据,比如说这是我要存储的一份数据哈,它会尽可能的给你什么分成多个这个Sha的,这个Sha的叫什么,这个就叫做分片。
01:01
啊,类比到我们HD法的块能听懂吧,就是你在不同的这个技术里面,它的叫法不一样,但是呢,其实原理都一样。好吧,所以你就把这个东西呢,类比成我们的一个块啊,你看一下我们的HDS是把你的完整的一份数据,然后呢,给你什么按照大小,比如说128兆呀,或者什么256兆啊,然后呢,给你什么做这个分块的一个处理,那这方也是一样的,我有一份完整的数据,他会尽可能给什么,给我去分成什么多个片,那至于你要分成几个片啊,这个我们也是可以去设置的。OK吧,那你这个分成几个票以后呢,那我的每个票我就什么可以什么单独去做存储了。明白吧,你看这不就是一个分布式的了吗?是吧,好,然后呢,呃,多个S的可以组成一个完整的数据啊,你看我们给了一个图啊。看这个图啊,呃,现在我总共有三个节点,这是我ES的节点啊,NOTE1,然后呢,NOTE2和NOTE3有三个节点,就你可以理解为是三台机器啊,三台机器好,然后呢,我们现在有一份数据,然后这一份数据的话呢,我们分成了三个片啊,分别是我们的P0 p1 p2。
02:05
对吧,三个三个三个这个什么萨啊萨。就是这么三个分片啊,然后呢,这个绿颜色框起来的话呢,可以理解为是我们的主分片啊,主分片啊,那你有主分片,我们就会有另外一个概念,叫什么叫副本分片啊,叫副本分片,啥叫这个副本分片呢?就其实就是对你这个数据的一个什么。备份啊,就那个副本,比如说你看啊,我P0的备份是R0对吧,我P1的备份呢是R1,然后P2的备份呢是R2。就说白了,他也是有这个副本的。能听懂啊,你就你就类比到你这个HD法那个副本就完事了啊,你要存几个副本,这里面我也是可以设置的,你存几个副本。能听到吧,只不过呢,我们存了这个,比如说啊,在你的HDFS中,你存了三个副本,那就是三个副本,他们之间是没有什么角色划分的啊,都叫什么,都叫这个副本,但是呢,放在我这个ES中的话呢,比如说我的一个文件,我存了这个我的一份数据啊,我存了这个三个副本啊,就是我存了三个副本啊,那你们它里面会有一个是主副本。
03:09
剩下两个是这个副本啊,就叫叫叫这个呃副的吧,对吧,哎,叫什么叫主分片啊,主分片,然后剩下的就是什么,就就你这个副本分片,它是有一个什么角色划分的。啊,那么将来我们读写数据的时候呢,就会涉及到这个主,还有这个什么副。好吧,哎,他们这个功能是不一样的啊,OK,所以你看啊,这个机制整体上跟你的这个HDS是一样的,就是你的一份数据,我要给你拆开去存啊,存成什么,存成这个多个Sha的啊,每个Sha的话,我们又可以什么都再去给你设置多个副本。理解吧,而且呢,它会尽可能的把你的这个多个S呢,会存到什么呀,存到不同的机器里面。而且要尽可能啊,不是尽可能这这是111定要去做的啊,就是你的同一个下的它的什么多个副本一定不在同一台机器里面,比如说啊PE在这儿,那我的R1在这对吧,你的R2在这,那我的P2在这。
04:03
你的P0在这,那我的R0在这。就他们绝对不在一台机器里面。能明白吧,你比如说我存了三个副本,我就放到一台机器里面,那我这个机器一挂,那你不就全家都完蛋了吗。对吧,全军覆没了啊,所以这个呃,从负面角度来讲,大家都能够理解的好吧,所以这个整体你就拿上你们这非常熟悉的那个HDFS去理解它就可以了。啊,只不过它这个叫法不一样了啊,叫成什么叫成这个了啊,以前我们叫的是block,叫什么叫块。对吧。行,这是一个啊。然后第二个是这个天然这个索引啊之倒排索引。啥玩意叫天然索引呢?就是自带的啊,天生就自带。好,那么它自带了一个什么玩意儿呢?叫倒排索引。呃,这个概念呢,我不知道大伙这个之前有没有接触过哈,嗯,但是从这个字面意思我先给你去解释一下啊,他不是说倒着排啊,明白吧,同学们。倒派索引,倒派索引不是说我这个索引给你倒着排,不是的啊,它表达的是一种索引的插座方式。
05:05
啊,所有的查找方式啊,我们来解释一下啊,先解释这个天然啊,天然就是ES,所有的数据呢,我们都是默认会进行索引的,就说白了,我们在ES中,只要你数据进来了,它默认情况下,只要你是能够建索引的,我就会给你建索引。啊,当然我们这个索引的话,其实就只针对于我们这个字符串数据哈,明白了吧,针对于这个字符上数据,然后给你建索引,好,只要你是字符上数据你进来了,OK,那我就会给你自动建索引,这个是。ES内置的一个特点。就不用你说啊,只要你数据进来了,我就给你建索引,这点其实正好和这个MYSQL相反啊,MYSQL是默认不给你建任何索引的,你想去建索引,你需要在买SQ中,你要单独指定我要给谁谁谁建索引。而我的ES就是你进来以后呢,我直接给你建索引,明白了吧,当然如果说我不想去给某个字段建索引的话,那你需要单独指定说,哎,你不要给他建索引。
06:03
就说白了,买搜狗的时候要指定给谁建索引,ES指定不给谁建索引。所以这叫什么叫天然的啊,明白了吧。行,呃,那如果我们想说明这个倒排索引的话呢,那我们就得,呃,简单的对比一下,这个就是常规的这种索引方式啊,你比如说我们举个例子,就是传统的这个关系型数据库,它的这个索引的查找方式。表示现在我有这么个数据。我有这么个数据。一小米手机二华为手机三锤子手机四等等等等,对吧,假如说这是一个表的话,那么大家应该能够想明白,这个肯定是我们的主将。对吧,肯定是我们的主件,那我们主件一般都是有索引的,好,那我将来我想去找这个小米手机,或者找这个华为手机,或者找这个锤子手机,那我一般都会什么,通过你的记录去找到你的单词,比如说我会通过你的ID为一,对吧,找到你的这个对应的单词,通过ID为二找到它,通过ID为三找到它。
07:02
能明白我的意思吧,通常我们是这么去做的。能听懂我的意思吧,啊,这是我们这个常规的一种这个索引的方式,好,呃,然后呢,呃,我们如果说用这个倒排索引的话,它是怎么做的啊,听我说。假如说啊,这是我们要保存的这个数据啊,还是啊,一就对应的什么,比如说红海行动影评,二对应的什么红海事件始末,比如说三对应的什么湄公河行动导演。是吧,现在这个数据呢,我想交给这个ES去存了。好,首先说一下啊,这个如果说你交给这个买骚货去存,那我就这么去存就完事了。听到了吧,就是你的每一个ID对应一个什么数据,每个ID对应一个数据啊,但如果说你要把它交给这个ES去存的话。他这么去存的。啊,怎么存在呢?给大家去说一下啊,你的红海行动影评,红海事件始末,湄公河行动导演,注意,这是我们将来要去存储的这个文档啊,它就是我们要存储的这个文档,理解吧,你的一个文档可以是一行字符串,可以是什么一大篇的这个文章啊,都可以。
08:11
好,那么大家注意它在存的时候呢,它首先呢,会对你的什么东西啊,会对你的数据呢,进行分词操作,啥叫分词呢?就是我要尽可能的把你的这一段话呢,给你做一个分词,比方说红海,行动,影评,那我大概率情况下可以分成红海是一个单词,行动是一个单词,影评是一个单词。对吧,红海事件始末,那红海是一个单词,事件是一个单词,石墨是一个单词,湄公河行动导演,那就湄公河是一个单词,行动是一个单单词,导演是一个单词,我会这么去给你分。理解了吧,好,那我分完以后你就看一下啊,你就对比一下这个东西。我把它拿过来对比一下啊,同学们。好看好了啊,我红海分别在我的一号和二号这个ID中出现过。
09:01
对吧,那我就记录下来了啊,红海这个单词在我的一号和二号记录中出现过,行动这个单词呢,在我的一号和三号中出现过,你看到没有,对吧?影评这个单词呢,在一号里面出现过。对吧,然后呢,事件这个单词呢,在二号。呃,出现过,然后呢,始末呢,也是在二号出现的,然后呢,这个湄公河呢,在三号出现的,然后呢,导演呢,在这个三号出现的。对吧,他这么去做的,他是把你的单词拆出来,然后呢,通过单词去记录一下,我都在哪个文档中出现过这个词。理不理解?好,那么你把这个分词做完以后,然后呢,这就是我们最后做出来的倒排索引。它的方式是通过你的单词去找记录的,就说白了,我通过这个单词,我可以知道我要去找哪几条记录。明白了吧,啊,他这样去构建的,而你这个买so是什么,通过你的记录去找你的单词,通过你的记录去找你的单词。
10:05
好吧,行,那你看一下啊呃,假如说啊,现在我这么去存了,听好了啊,我这么去存了,然后呢,现在呢,我想去搜索一个红海行动。对吧?哎,我想去搜索一个红海行动,那么其实你在搜索的时候呢,它也会把你这个词呢,作为一个分词啊,那就分成了红海和行动了,那我就匹配,诶红海我能够匹配到一号和二号文档,行动我能够匹配到一号和三号文档。那我一看,我最终这个词所匹配到的这个文档就是一号二号和三号。那我就可以去把你的一号二号三号文档给它调出来,调出来以后呢,然后呢,给你显示出来就可以了。明白我的意思了吧,他这么去做的。好,那我们就来看一下啊,他为什么要采用这种方式来去做哈。你回到这,如果说我使用的是这种方式来去存储的,那现在我想去搜索一个记录对吧,比如说我就搜索一个叫小蜜手机,注意啊,是小蜜手机,这种手机肯定没有对不对,那你到这里面去搜索的时候,比如说你拿MY色去做的,那我只能这么去写like,写个什么小蜜手机对吧?Like小蜜手机,那那我问你能跟他匹配上吗?
11:21
匹配不上吧,因为你like前面写百分号,后面写百分号,中间的这个内容是要连续性出现的,所以说你搜索一个不存在的这个数据的时候,那最后呢,是给你匹配不到任何记录的,你的记录为空。对吧,但是你想想哈。你说我在这个电商中,比如说我就搜索一个什么小米手机对不对,小米手机秘密,诶不对,不是秘密啊,秘密秘密啥呀。来小米手机对吧,你说啊,我收手这个东西的时候,假如说他是没有这个手机的,那你说我最终给他展不展示这个结果呀。
12:03
你得给我展示吧,同学们。对吧。他说诶,我这个我为你显示的小米手机,你看说的还比较智能对吧,说明什么,说明他没有这个东西,但没有这个东西你看一下人家是依旧会给你展示一些东西的。理解吧,那如果说你想想啊,我通过这个数据库来去存这个数据,然后呢,我通过这个like呢去查,你根本是查不到任何数据的,那你就说白了,我将来在页面中我是不可能给你展示任何记录的,这个是很不好的一种用户习惯,我没有说出来东西。理解吧,但如果说啊,我们通过倒排索引的方式来存的话,你看一下啊,假如说我把这个东西做一个存储,怎么存的,那我的小米这个单词我会对应什么,我会对应这个一号文档对吧?然后这个华为对应的是这个二号文档,然后呢,锤子对应的是这个三号文档,对吧?然后呢,手机对应的是一号文档,二号文档,三号文档。那我将来我再去搜索这个小蜜手机的时候,那我就把小蜜诶做一个拆分手机拆出来,你匹配不上任何东西,但是我能够匹配上呀,我一匹配一看哟,123号文档都有手机好,那我就会把这个记录给你调出来。
13:13
我呢,我支持你做一部分的匹配。明白吧,这是它的一个好处。好吧,所以这就是我们这个,呃,它使用的一种方式叫这个倒排索引啊,这个我们就先大概了解一下它怎么去存的啊,怎么去的就完事了,然后后面我们还会这么具体去说啊,用多了你就知道了。OK吧,行。呃,然后呢,最后一个啊,是这个。呃,这个就不说了啊,哎哟,这个还得说啊,嗯,来吧,那我把它说一下啊。呃,我们还对比了一下,就是。买搜狗的这个索引结构啊,和我们这个倒排索引的这个就是索引结构啊,这我首先首先给大家去说一下这个买搜狗这个索引结构啊,这个东西大家可能没有讲过哈,说这个对比起来也也就没有太大的一个意义啊,那我简单几句话给大家去聊聊一下啊。
14:04
这个MYSO的索引结构的话,我们用的是这个B加tree。啊,这个玩意儿翻译过来就是我们的平衡术啊,平衡术,平衡术啊,它其实也是一个树的一种结构啊,它叫平衡术。那这种树的结构里面,最典型的就是二叉树,是不是最典型就是二叉树,但是你的二叉树的话呢,嗯,在一些极端情况下面会出现问题,比如说我们都知道哈,二杀术,小的往左放,大的往右放,对吧?那如果说我的数据是这样子的,诶,我比他小放在这,比它小放在这,比他小放在这,比它小放在这,比大小放在这,我的数据是这样子的。如果说你的数据是这样子的,那你就变成了一个列表。对吧,这是极端情况下,你的性能就会什么降的很低,你再去做二分查找,那就基本上跟从列表查找是一个道理。对吧,所以说啊,我们从这个二叉数里面,我们就演变过来的,另外一个叫做B加税叫平衡数,啥叫平衡数呢?当他发现你的数据变成这个比较极端的情况的时候呢,他会给你自平衡一下。
15:07
那怎么就自平衡了呢?比如说我把它作为一个顶点,那比它小的往左放,比它大的往右放。对吧,它就又会平衡了。能听懂吧,好,那我们这个B加税的话,应该是平衡数里面的一种演变哈,它是这么这种过,它是这样的一个过程啊,就是我们在每个节点中,我们会维护几个,维护三个吧,对吧,维护三个节点,然后呢,15~56中间的我就去往左边放,然后呢,56~77中间的往这放,然后呢,比77大的往右边去放。它就是相当于什么,相当于这个三叉啊,相当于什么三叉。对吧,那么这样我们依次去定位我们这个小的数据,比如说我想定位20了,好,那我20怎么定位呢?我过来以后呢,一看20应该在中间往这找。对吧,往这找。能听到吧,然后呢,20~49,哎,应该是在这个中间好往这找,你就找到这个20了。能听懂我的意思吧,啊,大概是这样的一个过程啊,这是我们这个买sole的啊这个呃,其实放到这我觉得意义不大啊,因为大家也没有讲过啊好,那我们重点还是想说一下,这个就是我们ES啊,他做了这个倒排索引。
16:12
啊,他怎么去存的啊,呃,其实ES啊,它底层的这个什么道派索引,是由它的这个最核心的这个主将叫lon来去实现的。啊,叫lon去实现的啊,他们俩的关系你可以理解为是ES呢,是一个,呃,对外的一个什么这个包装啊,最核心的东西呢,是lon。明白吧,最核心的东西是N啊,你要举个例子的话,就是你把这个ES呢想象成是一辆。车对吧,一辆车啊,然后这个Lucy呢,就是那个发动机。明白了吧,就你车上这个最核心的一个主件啊,就那个发动机。明白吧,同学们好,那么它是怎么做的啊,同学们来看一下,首先啊,我们先看这个地方。这一部分我们叫做term,叫什么?呃,Dictionary对不对,叫什么?这叫什么分词字典啊字典啥叫分词字典呢?就是我会把你存储的所有的数据按照分词,一个一个的词呢拆出来,拆出来以后呢,我会去记录一下你的每个词都在哪一个文档中出现过啊,这个一二三四五六七八九十表示的是你的文档的ID啊,就是表示你是哪一条数据。
17:25
我会记录下来你都在哪个文档中出现过。理解吧。就是我们的倒排索引啊,就是我的哪一个词在哪个文档出现过,这个词在哪些文档出现过,这个词在哪些文档中出现过。好,这是我做好的大牌索引,实际上啊,大家注意引我们后面还得有东西,后面是什么呀,后面就是挂上你具体的文档,比如说你的一号文档的数据,诶什么什么,二号文档的数据诶什么什么什么,三号文档的数据什么什么什么,四号文档的数据什么什么什么。你真正的数据你也得存进去,这只是对索引的一个维护,你能听懂吧,后面是你真正真正去存的那个数据。
18:03
OK,好,那我们将来去找数据怎么找呢?首先比如说我就去找一个,就找一个什么ada吧,诶,我就搜索了一个什么adapt a啊,当然你这个英文的话,它不会这么去分啊,我就搜索一个,比如我就搜索一个island,好吧,我现在要搜索一个什么名字叫land啊,那你去搜索它的时候呢,这个英文单词的分词很简单,就是一个单词一个单词帮你分啊,那我一看我定位它。我一定位,诶,你这个aen在什么,在这个12号文档和15号文档出现过,好,那我就会到你的数据里面,把12号和15号文档给它调出来,就给你返回回去了。能明白吧。好,那么大家想想哈。这种结构看起来是非常非常好的,但是呢,也会存在一种情况,就是当我的分的这个词特别特别多的情况,比如说我的字典,你看它叫字典dictionary,是不是叫字典啊?如果说我的字典里面的东西特别特别多的时候,我从字典中找东西就找这个词,是不是也要找很长时间啊?
19:05
对吧,你得找很长时间。所以说呢,它又为你的这个字典单独去建了一个索引,我们叫做term index。这个索引是帮助你去找字典的。对吧,就比如说啊,大家这个小时候应该都老师教过你们怎么去查那个新华字典,对吧,你可以什么按照这个拼音啊,按照拼音去查,可以什么按照这个偏方部首去查,它是有一定的规律的。对不对?好,那我往我将来去找,你这个字也是可以去按照索引查的,比如说我要找Alan,好,那我去专门维护一个,就是你这个字典的一个索引,比如说从某个字开始,你的A在左边,你的S呢在右边,对吧,然后呢,比如说你要找艾伦,那我一看啊,A应该是在这个位置,那我去找找。那我就找到A开头的单词,找到A开头单词以后,我就过来去读,那我就能读到你的这个L了。对吧,说明什么,说明他对自己的这个刀牌索引呢,又做了一个索引。
20:02
能明白吧,啊就相当于什么呀,相当于我们通过它定位到它,通过它呢,诶再定位到你在哪些个文档里面,再通过它呢,去定位到我后面所挂的那个数据上面啊,挂的那个数据上。那我就可以把你最终的数据给它定位出来,就可以给你调出来了。这就是大牌索引。明白了吧,啊,这是倒牌手印啊,行,所以它这个结构还比较多啊,我们通过什么通过这个term index,我们找到什么这个term dictionary,然后找到这个post list啊,它是这个post list叫那个,呃,这个post list应该就是我们的分词的,嗯,那个什么这个。叫什么叫这个list子的集合吧,对吧,就那个叫什么叫倒排集合是吧?哎,倒排集合啊,OK,像这是它的一个倒排索引啊,你要这个先理解一下好。呃,还有一个啊,我们把它说完啊,同学们,我们耽误几分钟啊,也是一个天然索引啊,我们把它称之为是一个正牌索引,它不仅有倒牌的,他还会正牌的啊,当然其实这个正牌索引吧,呃,可能一般人不会这么去聊啊,那么他聊的更多的是另外一个东西。
21:13
叫劣势存储。啊,这两个是一个道理啊,我们把它叫劣势存储,就是大多数人呢,会直接去说ES的劣势存储啊,什么意思呢,听我讲。刚才我们讲的这个倒排索引啊。他从搜索的角度来讲,你是非常非常高效的,比如说你想去查指定的词条,就是你要通过某个字啊,或者某个什么词,然后去定位数据,那你通过大盘索引做非常非常高效。但是相仿啊,这个相仿啊,你的操作就是比如说。你在一些什么相反的这个操作的时候呢,表现很差。表现很差。比如说我们想查询一个文档中包含哪些词条,你这个操作就太差了,比如说你你你想你你想这么去查,我想拿到一号文档。
22:03
对吧,我想看一下一号文档中我都包含了哪些词条,对吧,你看它肯定要包含一个ada,还有什么包含一个什么Siri,对吧,等等等等一些,你这么去查,那这这这太扯了。你所以不能倒着走。对吧,所以说啊,我们在这个ES中啊,你除了要去做这个全文检索之外,我们还要再去做一些排序聚合。对吧,然后呢,做这种操作,那你这种操作你基于道派收银做就非常非常费劲,好那我们会怎么做呢?我们会基于你的劣势存储来去做。啊,基于你的劣势存储来去做,那就说白了。我们还会对你的数据呢,做列式存储,比如说啊,这是我的那个DO1啊文档一,然后呢,这是它的那个什么词对吧,DO2就随便举个例子啊,将来我在存的时候怎么存呢?一列一列进行存储。好,那我对你的这个数据呢,做一列一列的存储有什么好处呢?你想想你的排序,你排序怎么排啊,是不是基于你的一列进行排序的,对吧,你的聚合,你聚合怎么聚合呀,是不是基于你的一列进行聚合的。
23:12
那你将来聚合以后的分析统计,比如说我想求count,求max对吧,求什么avg,你是不是基于你的一列一列进行分析的。能明白我的意思吧,所以说啊,大家注意在ES中它的列式存储。是帮助我们去做数据的分析统计的,而你的倒排索引是帮助我们去做数据的检索的。理解我的意思了吧,啊,它有两种存储方式,一种是列式存储,一种是倒排索引的存储。啊,这两个都是有的。而且呢,默认情况下,我们每个字段的这个劣势存储呢,都是激活的,就说白了你的一个字段过来以后,我会按照情况。给你去存储,比如说你是一个普通的字段,不是一个字符串的,那不是字符串的,我就不用去做这个倒排索引,那我就直接什么列式存储,如果你是一个字符串的啊,这个后面也会说它会存两种,一种是你的盗版索引,一种是你的劣势存储,盗版索引呢方便你去做检索,劣势存储的方便你去做聚合分析。
24:14
理解了吧,啊,这个大家要知道一下啊,OK,呃,然后这个劣势存储的好处的话,大家之前应该都接触过啊,就是非常适合排序啊聚合呀。对吧,而且的话呢,呃,我们将来做压缩的时候呢,也能够大大的减少你的磁盘空间。你们之前应该都感受过吧,就你们在讲have的时候,应该讲过那个什么劣势存储是不是讲过什么orc啊什么呀。为什么他们这个压缩率会非常非常高呢?那是因为我一列的数据我是放到一起存的,就说白了,我这一列的数据的类型都是一样的,比如都是数字,都是字符串。那我就可以使用相同的压缩算法对它进行压缩,那我压完以后呢,我的压缩率是特别高的。但如果你是行式存储,那我的一行中又有数字对吧,又有字符串啊,又有什么日期啊,各种各样类型,那你在压缩的时候呢,你就不能使用同一种方式进行压缩。
25:06
不能使用同一种算法进行计算,那你的压缩率可能就没有那么高。对吧,首先电视存储呢,会有很多好处啊,像。那这个东西就是大家需要去理解的啊,我们的ES它整个的特点呢,就是第一个它有分布式的,天然的这个分布式数据库啊,就它的数据呢,是分布式存储的,再一个呢,就是它有一个非常关键的东西叫倒派索引啊,这个大家应该是第一次接触,而这个列式存储的话呢,应该还是比较熟悉的啊同学们。OK,所以你就重点把那个倒排索引呢,自己下去以后呢,去把它看一看啊,等我们这个后面讲的时候呢,还会带你去分析的。好吧,嗯,行,那就先说这么多了啊。
我来说两句