【阅读笔记】《信息检索导论》第四章 索引构建
基于块的排序索引方法
-面向静态文档集的高效单机索引算法
Motivation:第一章中提出的倒排索引构建方法,对于小规模文档集来说,均可在内存中完成。在大规模文档集条件下,需要引入二级存储介质来构建索引。
- 将每个词项映射为ID(从字符串变成ID,节约内存)
- 使用基于磁盘的外部排序算法
BSBI算法(blocked sort-based indexing)
-
过程:
1、将文档集分割成几个大小相等的部分
2、将每个部分的词项ID-文档ID对排序
3、将中间产生的临时排序结果存放在磁盘中
4、将所有的中间文件合并成最终的索引 -
伪代码:
-
时间复杂度
由于该算法最主要的时间消耗在排序上,因此其时间复杂 度为 Θ(TlogT),其中 T 是所需要排序的项数目的上界(即词项 ID-文档 ID 对的个数)。然而,实际的索引构建时间往往取决于文档分析(PARSENEXTBLOCK)和最后合并(MERGEBLOCKS)的时间。
内存式单遍扫描索引构建方法
Motivation:BSBI算法从一开始就整理出所有词项ID-文档ID并对它们进行排序,对于大规模的文档集来说,这种数据结构会很大,在内存中难以存放。
- 使用词项而不使用ID
- 将每个块的词典写入磁盘,对于下一个块则重新采用新的词典
SPIMI 算法(single-pass in-memory indexing)
-
伪代码:
-
优点
1、不需要排序操作,处理速度更快
2、保留了倒排记录表对词项的归属关系,节约内存 -
时间复杂度
SPIMI 算法的时间复杂度是 Θ(T),这是因为它不需要对词项-文档 ID 对进行排序操作, 所有操作最多和文档集大小成线性关系
分布式索引构建方法
Motivation :很大的文档集(如WEB)在单台计算机上很难高效地构建索引,常常需要大规模的计算机集群。
- 基于文档分割的分布式索引构建
- 基于词项分割的分布式索引构建
MapReduce-基于词项分割
- 构建过程
1、将输入数据分割成n个数据片(split),大小通常为16MB、64MB。由主控节点负责分配给分析器
2、Map阶段,分析器将输入数据片映射成键-值对(词项ID,文档ID),并将输出结果存在本地的中间文件(也称分区文件,segment file)
中间文件的生成:分析器将所有键按照词项分区划分成j个段(词项分隔方法由用户),每个词项分区对应一个分区文件。因此,整个系统中,每个词项区间会对应r个分区文件(r是分析器个数)
词项到其ID的映射,在分布式情况下的解决方案:维护一张高频词到ID的映射表并将它复制到所有节点计算机上,对低频词直接使用词项本身而不是其ID
3、reduce阶段,主要任务是将同一键(词项ID)的所有值(文档ID)集中存储。主控节点将每个词项分区分配给不同的倒排器,进行汇总。最后,每个键对应的所有值要进行排序并写到最终的排序倒排记录表中。
动态索引构建方法
Motivation:大部分文档集会随文档的增加、删除或更新而不断改变。这意味着,对已有的倒排记录表也需要更新。
主索引+辅助索引
- 方法
同时保持两个索引:一个是大的主索引,另一个是小的用于存储新文档信息的辅助索引(auxiliary index),辅助索引保存在内存中。检索时可同时遍历两个索引并将结果合并。
文档的删除记录在一个无效位向量(invalidation bit vector),在返回结果之前过滤掉已删除的文档。
文档的更新先删除后重新插入实现。
索引的合并
每当辅助索引变得很大时,就将它合并到主索引。
合并操作的开销取决于索引在文件系统中的存储方式。
如果将每个词项的倒排记录都单独存成一个文件,合并操作只需简单的将辅助索引扩展到主索引中。但绝大多数文件系统不能对大量的文件进行高效处理。
- 将索引存成一个大文件的情况下,索引的合并
周期性地对文档集进行重构
由于动态索引构建的复杂性,一些大型搜索引擎采用从头开始重构索引而不是动态构建索引的方法。这种方法会周期性地构建一个全新的索引,然后将查询处理转到新索引上去,并删除旧索引
其他索引类型
- 包含位置信息的索引构建。二元组(词项ID,文档ID)变成三元组(词项ID,文档ID,(位置1,位置2,…))
- 按文档ID排序 ---- 有利于压缩,即不保存文档ID而是保存文档ID间的间隔
- 基于权重或者影响度排序