温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
接下来我们来讲解一下文档搜索。早期的全文检索呢,它会为整个文档集合建立一个很大的倒排索引,并将其写入到磁盘当中,一旦新的索引就绪,旧的就会被替换掉,这样的话,最近的变化便可以被检索到。倒排索引被写入到磁盘之后是不可改变的,那么这样的话呢,我们在多线程并发执行,并行执行的时候就不会对它进行修改操作,也就不会产生所谓的线程安全问题,数据就不会出现冲突,对不对?还有一个因为你不可变,所以把你的内容读取到内存当中的时候,这个内存就不会发生变化。那么这样的话,我们在匹配数据的时候,会大量的请求匹配到内存当中,这样的话就减少了磁盘的IO,性能可以得到一个极大的提升,还有一个当一个大的倒排索引。被生成之后,它是可以呢进行压缩的,减少磁盘IO,并且呢,可以将我们缓存到内存的所引的使用量减少,那这样的话不是挺好的吗?对不对?同学们,所以这都是它的优势,但是不好的地方在哪呢?不好的地方在于当你创建好之后,你不能发生改变,如果你频繁的修改它的话,就会导致它要重建整个索引,那么你的更新频率比较高,你的性能就会变差,就是因为你的倒排索引它的不可修改,不可变,那我们如何能够解决这个问题呢?诶大家可以看到我们采用一种方式叫做什么呢?叫新的补充索引,就意味着之前呢确实不变,但是一旦有了修改之后,之前的还是不变,我现在干嘛呢?添加一个新的补充索引来体现最近的修改,而不是将整个之前的索引重新建立。不是这样的。
01:44
那这样的话,在我查询的时候,我只要保证每一个倒排索引都能被查到,然后将我们匹配的结果做合并不就可以了吗?诶,就是这个意思,那么这样的话呢,在我们查询过程当中就有一个段的概念,一段一段的概念,那么每一段其实就是一个倒排索引,这个大家能明白吧?啊那这样的话,你在查询的时候会按段查询,而且最早的会被先查询,哎,就是这个意思啊,然后呢,我们这里再说一个什么呢?就是我们的那个删除的问题,因为啊,我们在去查询的过程当中,我们这个段它是不可改变的,那如果我们有些数据要被删除了怎么办?
02:21
你被删除了,但是你不可改变呢,所以说你删除的数据是体现不了删除的概念呢,那怎么办?诶我们加标记,我们给某些数据呢,诶给它加标记表示你删除了,但是并不会真正的删。那么这样的话,在我查询之后,如果发现了有删除标记的话,那么就把它过滤掉,你不就查不出来了吗?就好像跟删除的感觉是一样的,对吗?这个我们称之为叫逻辑删除,那老师那不对呀,那你这个逻辑删除的话,你数据还在那,那数据越集越多,越积越多,不是不好吗?没错。我们也确实存在这个问题,其实大家想一想,当我们那个倒排索引太多了之后,每个都挨个找一下,是不是也比较慢呢?所以其实它不光有什么呢?诶我们创建新的倒排索引的概念,它有合并的概念,当我们把多个我们的倒排索引合成一个的情况下,那么这时候我就可以把那个删除的数据给它真正的删除掉,这个我们就称之为叫物理删除了,好不好,同学们就是这么个概念,这是我们文档搜索需要注意的地方啊。
我来说两句