Disk Index主要是把Memory Index存储到硬盘上的文件组织。它由一系列的物理文件组成。存储方式主要有Bulk tree和普通文件,XML三种类型。
Bulk tree是Btree的一种简化形式,相当于静态的Btree,Key可以为字符串或整数,Value是一个指定长度的字符数组,大小不能大于8K,在Bulk tree的实现代码中没有结点的分裂和合并算法,所以插入时必须把要插入的元素预先排序,按排好的顺序插入;查询时是按照二分查找来找所需值的。表三列出了索引文件的名称,存储的内容和类型。
由于索引中整数比较多,所以在存储整数时,采用整数变长编码压缩(也叫RVL压缩编码),主要思想是保留要存储序列中的第一个整数,之后依次存储后一个数与一个数的差。优点:压缩和解压缩速度非常快;缺点:压缩率不太高,压缩后的索引大小一般是原始文档的50%左右。
例如对于以下整数序列:10、12、15、19、24、30
压缩后,存储的序列为:10、2、3、4、5、6
表三
文件名称 | 存储的内容 | 类型 |
directFile | 每个XML文档的文档结构 | 普通文件 |
documentLengths | 记录每个XML文档的长度,每个XML文档的长度用4个字节表示 | 普通文件 |
documentStatistics | 主要存储每个文档的统计信息,如XML文档在directFile中的偏移,XML文档中单词的数量,XML文档中不重复的单词的个数 | 普通文件 |
fieldFile | 元素结点的倒排序索引文件 | 普通文件 |
frequentID | 存储tf>=1000的termId到DiskTermData的映射 | Bulk tree |
frequentString | 存储tf>=1000的term到DiskTermData的映射 | Bulk tree |
frequentTerms | 将tf>=1000的每个单词的termId和termName构成一组,按顺序存储每组 | 普通文件 |
infrequentID | 存储tf<1000的termId到DiskTermData的映射 | Bulk tree |
infrequentString | 存储tf<1000的term到DiskTermData的映射 | Bulk tree |
invertedFile | 单词的倒排序索引文件 | 普通文件 |
manifest | 存储全局统计信息和配置信息 | XML |
infrequentID, infrequentString,主要存储以单词的编号termId (infrequentID)或单词本身term(infrequentString)为Key,把DiskTermData用RVL压缩算法压缩后作为Value存入Bulk tree , DiskTermData主要包括: TermData(在下面介绍), termId, startOffset, length四部分。startOffset, length就是这个单词在invertedFile中对应的起始地址和长度。
frequentID, frequentString,存储的内容和infrequentID, infrequentString一样,区别在单词的tf不一样,查询时先从frequentID, frequentString从查找,没找到时再从infrequentID, infrequentString查找。