00:01
OK啊,那这个基于ID的这个读和写呢,我们就聊这么多啊,他两个很简单啊,呃,下面这个稍微会麻烦一些啊,我们知道这个搜索流程。这个啥玩意叫销售流程呢,就是我们用这个search。对吧,用这个search的时候,那你想想啊,你在使用这个search的时候,你会给那个什么文档ID吗。不给吧,我们在使用search的时候一般都是什么?给query是不是给条件了啊,Query里面会有什么?会有什么filter那些东西。对吧,啊,会有什么可以条件了啊,那就说白了,我们的搜索流程呢,它可能会从你的ES中呢,去调出来很多条数据。那你既然你要调出来很多条数据,那我这个数据呢,就可能会什么出现到不同的你的。分片中,你要从不同的分片里面去调这个数据。对吧,好,那我们就需要去看一下他这个搜索流程,它到底怎么去做的啊。它其实这个相对会这个复杂一点啊,来我们看一下吧,整个这个搜索呢,我们被分成了两个阶段。
01:05
啊,整个这个搜索流程呢,是分成两个阶段去执行的啊,然后呢,我们称之为什么query than fetch,就说白了,我们先做query,然后呢再去做fetch,操作两步操作,这是第一步,这是第二步。啊,那这个query阶段做什么操作呢?啊,给大家去说一下。首先啊,我们这个在初始的这个查询阶段。就是你的这个query阶段啊,我要去查什么对吧,它会把这个查询呢,广播到索引中的每一个分片。能听懂吧,广播到这个索引中的每一个分面,那么至于是主还是副?至于是主还是副,哎,那这个叫什么,看情况了。对吧,主分面或者什么副分面,我要广播广播给你们了啊,那我广播给他们以后,他们干嘛呢?因为我也不知道你这个分片中啊,到底有没有这个数据啊。能理解吧,我也不知道你里面到底有没有这个数据啊,所以说我只能什么呀,广播啊,广撒网,我就想告诉你们,来,你们从内部先把我看一看,有没有我现在所搜索的这个数据,如果有的话报告给我。
02:09
能理解吧,就先广播给他们,让他们什么自己去内部去查看看有没有,如果有的话报告给我,OK,那么这个过程啊,大家注意了。我们每一个这个分票收到这个广播以后,他会怎么在内部的去查。查完以后呢,它会什么呀,构建出来一个对立,这个对立的什么叫优先对立啊,就这个优先对立OK吧,这也是啊,每个都都会有一个这个优先队列啊,那这个队列里面会放什么东西呢?它不会把真正的数据给你放进去,因为你这个数据要还是不要。还决定不下来。他会干嘛呢?他会给你返回一个就是呃,From加size一个什么优先队列,查到这个from加size呢,因为我们查数据的时候,我们是可以写分页操作的,对不对,就是我我说啊,比如说我要查什么,从第二页开始查,然后呢查什么查十条数据。
03:00
能听懂我的意思吧,啊,从第二页查查十条数据就说白了,你将来会算出来一个from加size。那你总共你就要十条数据,那你想想啊,你总共就要十条数据,你说我的每一个啥的,我需要给你返回11条吗。不需要吧,我就不需要给你返回什么大于十条的数据,我就什么给你返回十条数据就OK了。明白吧,就比如说诶,我把我满足条件的时效数据给你找出来,他把它满足条件的时效数据找出来,他把它满足条件的时效数据找出来。理解吧,都构建到什么各自的什么这个队列中啊,各自的队列中,然后呢,呃,接下来就把这队列给你返回回来了,注意啊,这个队列中不包含你真正的数据,它只包含你的数据的那个ID啊,就第一次的时候,我只给你返回ID,就是把这个名单先报给你啊,把名单报给你。听懂了吧,那这个时候呢,诶我们的这个。就是你可以理解为这个协调节点啊,我们的协调节点的话就是什么收到来自于什么,各个分片返回的什么这个队列。
04:01
这个队列中包含的就是你这个文档的ID啊,当然还有这个排序啊,就是谁在前谁在后是吧?啊,它是负排序的啊,就是我知道你的数据是怎么排的,理解吧,那么这个时候我的协调节点它会这么去做啊,你看啊,你给我返回一个队列,你给我返回一个队列,你给我返回一个队列,那么你们都通通的返回到了我的协调节点,那我的协调节点会干嘛呢?会把这些东西呢,给它组合成一个更大的一个队列。明白了吧,啊,组合成一个更大的队列,然后呢,这种情况下,他就要什么按照自己的条件呢,去把一些数据去掉。什么数据去掉了,就是我不要的数据给它去掉,就说白了,我会什么对你们这个数据呢,做一个整体的一个排序啊,做一个什么整体的一个排序,然后做一个数据的一个筛查。理解吧,那筛查完了以后呢,我的数据就我的这个队列呢,正常情况下,比如说按照我们刚刚讲的,它里面也是十个。因为你本身的查询,你就说我就要十条数据,对不对啊,那么他给你返回十个,他给你返回十个,他给你返回十个。对于他来讲这十个是最优的,对于他来讲这十个是最优的,对于他来讲这十个也是最优的,但是你们整体放到一起以后呢,就不一定谁是最优的,所以说我什么从这每每一个什么十个中再挑选出最优的十个来。
05:13
就综合起来,我去挑选出什么最优的时刻来。理解了吧,好,那这个就相当于我最终确定下来的,我要真正去调取的数据。这个时候我确定下来的,他们里面都是有ID的,对吧,你的每一条文档的ID我都是有的,那我既然有文档的ID的,那下一步的操作就是一个取回阶段,叫什么范阶段我都知道了,现在我要去取哪些文档了,对吧,这个时候呢。它会把你的ID听好了啊,这个就相当于什么,相当于基于ID的读了,你能明白吗?我这意思吧,我都有ID了,那我就知道知道什么读什么数据了吧,它会什么走一下基于ID的读的流程,比如说诶这个ID我打给哪个啥的,这个ID我打给哪个啥的,这个ID我打给哪个啥,说来你们把数据给我反馈回来。那么最后的话呢,他收到了诶读的请求,那把数据给他返还回去,他也收到读的请求返还回去,他也收到读的请求返还回去,那最后呢,我就把这十条数据就给他取回来。
06:10
明白吧,是这么一个过程。好吧,所以你看这整理这个图啊,就是两步操作,第一步操作呢。我不明确谁里面的数据满足我,那我就什么广撒网,你们都给我去调取一定量的,一定数量的数据,调取回来以后呢,先返回给我,返回给我以后呢,我整体去看一下,我最终确定下来什么,我最终想要用的数据,然后呢,再按照这个每一个ID呢,我打给什么每一个啥的说来,你帮我取哪条数据,你帮我取哪条数据,你帮我取哪条数据,最后呢,他们把数据取出来以后呢,再返回给我的协调节点,他就得到了最终的结果。那当然这个结果就可以返回给你的客户端了。明白吧,就分两个阶段,一个是fight啊,一个是query,一个是什么fight。啊,这个我们举个例子啊,举个比较形象的例子,就比如说这个选什么选国家队。
07:01
对吧,各大什么体育赛事啊,比如说以这个国家为名去做参参加参赛的啊,像那个什么奥运会对吧,国家队,那你想想啊,你在选这个国家队的时候,你怎么选啊。啊,你怎么选。那你肯定是这样子的呀,就是你的各个省队对不对,各个省队先给我网上报名的啊,比如说我们最终啊,这个国家队我们出多少个人呢?假如说这个田径对吧,我们出十个人好不好?哎,田径就总共有十个人参与,OK,那各个省队干嘛呢?各个省队先给我出上十个大名单啊,十个名单对吧,那就说白了,你在你的省队里面,这十个名单你怎么出啊,那肯定挑你们省里面最优的呀。是不是就说白了,我在我的每个省里面,我先去内战对吧,我先去自己去比啊,我比出来十个人,就这十个人是最优的,那么同样每个省都是一样子的啊,他们都什么挑出十个人来,是不是每个省都什么挑出十个人来?好吧,那把这个敲出来,这个十个人的什么名单啊,注意啊,他就直接把人送过去了,不是因为人家要不要你还两回事呢,对吧,我把名单先报上去。
08:04
对吧,名单报上来,名单报上来,报上来以后我这个国家队呢。综合去看你们的成绩。对吧,综合去看你们成绩,那我会最终怎么确定,诶十个什么大名单就说白了,我从你们这N多个人里面又挑出来最优的那十个人。这是一个名单,好,接下来呢,再把这个名单呢,挨个看一下,诶哪一个人属于哪个省,那我再把这个独立请求打回这个省,说来你把谁谁谁哪个人给我送过来,对吧?你把谁谁谁哪个人给我送过来啊,你把谁谁谁给我送过来。就最后一步是一个取回阶段,就是你要真正的把数据给他送过去。能明白吧,啊,大概就这么个过程啊,大家可以自己去类比的,去记一记啊,这就是我们的这个搜索的一个流程。好吧,这个要知道的啊,同学们就是分两个阶段啊,怎么分的,每个阶段干什么事儿?好吧,行,那就说完了啊。
我来说两句