【索引压缩】前端
信息检索系统中的两个主要数据结构:词典及倒排索引。下面将介绍对这两个数据结构的各类压缩技术,这些技术对于构建高效的 IR 系统很是关键。 进行压缩的一个优势显而易见:它可以节省磁盘空间。要达到 1∶4 的压缩比是很是容易的,也就是说能够下降 75%的索引存储开销。算法
索引压缩还有两个隐含的优势。第一是能增长高速缓存(caching)技术的利用率。在搜索 系统中,词典中某些条目及其索引每每比其余条目及其索引的使用更频繁。例如,若是将一个频 繁使用的查询词项 t 的倒排记录表放到高速缓存中,那么对仅由 t 构成的查询进行应答所须要的 计算彻底能够在内存中完成。若是采用压缩技术,那么高速缓存中就能够放更多的信息。当查询词项 t 的信息放在高速缓存时,处理查询 t 便再也不须要进行磁盘操做,而只需将其倒排记录表在内存中解压缩便可。所以,咱们能充分减小 IR 系统的应答时间。因为内存比磁盘更贵,因此, 相对于磁盘空间的减小,采用高速缓存技术带来的速度提高是采用压缩技术的更主要的缘由。 缓存
第二个隐含的优势是,压缩可以加快数据从磁盘到内存的传输速度。高效的解压缩算法在现代硬件上运行至关快,这样将压缩的数据块传输到内存并解压所须要的总时间每每会比将未压缩的数据块传输到内存要快。举例来讲,即便会增长在内存进行解压缩的开销,咱们也能够 经过加载一个小不少的压缩倒排记录表来减小 I/O 时间。所以,在大部分状况下,使用压缩倒排记录表的检索系统会比没用压缩的系统的运行速度要快。 数据结构
若是压缩的主要目的是为了节省磁盘空间,那么压缩算法的速度就不用特别考虑。可是, 若是要提升高速缓存利用率和磁盘到内存的传输率,则解压缩的速度必需要快。本章介绍的压缩算法都很是高效,均可以达到上面提到的索引压缩的所有 3 个目标。 编码
【将词典当作单一字符串的压缩方法】spa
采用定长方法来存储词项存在着明显的空间浪费。 一种解决上述缺陷的方法是,将全部的词项存成一个长字符串,并给每一个词项增长一个定位指针,它在指向下一词项的指针同时也标识着 当前词项的结束。 (就是目前构架中的var_data)指针
实际上,按照词典顺序排序的连续词项之间每每具备公共前缀。所以,能够采用一种称为前端编码(front coding)的技术。 公共前缀被识别出来以后,后续的词项中即可以使用一个特殊的字符来表示这段前缀。blog
【倒排记录表的压缩】排序
想象一下在文档 集中遍历文档来寻找某个高频词项(如 computer)的过程:咱们会找到一篇包含 computer 的文 档,而后可能会跳过几篇不包含它的文档,以后又会找到另外一篇包含 computer 的文档。这个过 程能够不断循环下去(参见表 5-3)。这里面最关键的思路就是(一些词项对应的)倒排记录表 中文档 ID 之间的间距(gap)不大,所以能够考虑用比 20 比特短不少的位数来表示它。实际上, 对于一些高频词(如 the 和 and)来讲,绝大部分间距都是 1。固然,对于只在文档集中出现一 两次的罕见词(如表 5-3 中的 arachnocentric),其间距的数量级和文档 ID 的数目是同样的,因 此仍然须要 20 比特。为了对这种间距分布的状况进行空间压缩,须要使用一种变长编码方法, 它能够对短间距采用更短的位数来表示。 索引
【可变字节码】
VB(Variable byte, 可变字节)编码利用整数个字节来对间距编码。字节的后 7 位是间距的有效编码区,而第 1 位是延续位(continuation bit)。若是该位为 1,则代表本字节是某个间距编 码的最后一个字节,不然不是。要对一个可变字节编码进行解码,能够读入一段字节序列,其中前面的字节的延续位都为 0,而最后一个字节的延续位为 1。根据上述标识能够把每一个字节的 7 位部分抽取出来并链接在一块儿造成编码。