aihot  2020-11-12 11:21:28  OpenCV |   查看评论   

  第二遍扫描的时候,开始真正建立每个单词的倒排表信息,第二遍扫描结束的时候,分配的内存空间正好被填充满。

  两遍扫描完成后,即可将内存的倒排列表和词典信息写入磁盘。因为其需要两遍扫描,所以速度上不占优势,而且对内存占用过大,实际系统中这种方法并不常见。

排序法

  排序法对两遍文档遍历法的内存占用做了优化,该方法始终在内存中分配固定大小的空间,用来存放词典信息和索引的中间结果。当分配的空间被耗光的时候,把中间结果写入磁盘,清空内存里中间结果所占的空间,以便存储下一轮的中间结果。

  所谓的中间结果在这里是(单词ID、文档ID、单词频率)的三元组,在清空写入磁盘之前,三元组需要依次按照单词ID、文档ID、单词频率进行排序,我们将排好序的三元组写入磁盘。

  对于排序法而言,词典是一直存储在内存中的,耗光了分配的内存空间,也只是将中间结果写入磁盘。所以,越往后,可用来存储三元组的空间是越来越小了。

  之所以要对中间结果进行排序,是为了方便最后的合并。合并完成后,就形成了最终的索引文件。

归并法

  排序法中,词典信息一直在内存中进行维护,就会导致后期中间结果可用的内存越来越少。归并法对此做了修改,即每次包括词典在内的所有中间结果信息都被写入磁盘。

  在最终合并的时候,排序法是对同一单词的三元组依次进行合并,而归并法的临时文件则是每个单词对应的部分倒排列表进行合并,形成这个单词的最终倒排表,归并法在合并的过程中形成最终的词典信息。

动态索引

  真实环境中,在索引建立好之后,后续仍不断有新文档进入系统,同时原先的文档集合有些被删除或者修改。所以我们需要动态索引来将文档变化在非常短的时间内体现出来。

  动态索引往往有三个关键的索引结构:倒排索引、临时索引和已删除文档列表。

  当有新文档进入系统时,将其追加在临时索引结构中,当有文档被删除,则由已删除文档列表以ID的形式保存,文档的内容更改可被认为是先删除后添加。

  如果用户输入查询请求,则搜索引擎同时从倒排索引和临时索引中读取用户查询单词的倒排列表,找到包含用户查询的文档集合,并对两个结果进行合并,之后利用已删除文档列表进行过滤。

索引更新策略

  常用的索引更新策略有4种:完全重建策略再合并策略原地更新策略以及混合策略

  完全重建策略是当新增文档到达一定数目的时候,将新增文档和老文档进行合并,然后对所有文档重新建立索引。这是目前主流搜索引擎采用的方法。

  再合并策略是达到一定条件后,将临时索引和老文档的倒排索引进行合并,以生成新的索引。

  原地更新策略的基本出发点是为了改进再合并策略的缺点,即在索引更新过程中,如果老索引的倒排列表没有变化,那就可以不需要读取这些信息,只在其末尾进行追加。

  但是这样会破坏了单词索引的连续性,因为不可能预留无限大的空间使其可以一直往后追加,所以就必须做数据迁移,这样导致了进行索引合并时不能顺序读取,反而降低了磁盘读取速度,而且还需要大量的内存来记录位置的对应关系。

  混合策略是针对不同类别的单词,对其索引采取不同的索引更新策略。比如,倒排列表较长的单词用原地更新策略,短倒排列表单词则采取再合并策略。

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自浅谈搜索引擎基础(上)

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]