CLucene中文件.tii文件和.tis文件格式
词典(tis)及词典索引(tii)信息
在词典中,所有的词是按照字典顺序排序的。
- 词典文件(tis)
- TermCount:词典中包含的总的词数
- IndexInterval:为了加快对词的查找速度,也应用类似跳跃表的结构,假设IndexInterval为4,则在词典索引(tii)文件中保存第4个,第8个,第12个词,这样可以加快在词典文件中查找词的速度。
- SkipInterval:倒排表无论是文档号及词频,还是位置信息,都是以跳跃表的结构存在的,SkipInterval是跳跃的步数。
- MaxSkipLevels:跳跃表是多层的,这个值指的是跳跃表的最大层数。
- TermCount个项的数组,每一项代表一个词,对于每一个词,以前缀后缀规则存放词的文本信息(PrefixLength + Suffix),词属于的域的域号(FieldNum),有多少篇文档包含此词(DocFreq),此词的倒排表在frq,prx中的偏移量(FreqDelta, ProxDelta),此词的倒排表的跳跃表在frq中的偏移量(SkipDelta),这里之所以用Delta,是应用差值规则。
- 词典索引文件(tii)
- 词典索引文件是为了加快对词典文件中词的查找速度,保存每隔IndexInterval个词。
- 词典索引文件是会被全部加载到内存中去的。
- IndexTermCount = TermCount / IndexInterval:词典索引文件中包含的词数。
- IndexInterval同词典文件中的IndexInterval。
- SkipInterval同词典文件中的SkipInterval。
- MaxSkipLevels同词典文件中的MaxSkipLevels。
- IndexTermCount个项的数组,每一项代表一个词,每一项包括两部分,第一部分是词本身(TermInfo),第二部分是在词典文件中的偏移量(IndexDelta)。假设IndexInterval为4,此数组中保存第4个,第8个,第12个词。。。
两个文件的头是相同的,内容如下:
output->writeInt(FORMAT); // 4个字节 FF FF FF FD -3
output->writeLong(0); // leave space for size 文件中保存的term 的数量
output->writeInt(indexInterval);// write indexInterval 每页存储的term 数量 值 为128
output->writeInt(skipInterval); // write skipInterval 16
output->writeInt(maxSkipLevels); 10
词典文件(tis) 相关代码:
writeTerm(fieldNumber, termText, termTextLength);
// write doc freq
output->writeVInt(ti->docFreq);
//write pointers
output->writeVLong(ti->freqPointer - lastTi->freqPointer);
output->writeVLong(ti->proxPointer - lastTi->proxPointer);
if (ti->docFreq >= skipInterval) {
output->writeVInt(ti->skipOffset);
}
term的文件格式:
output->writeVInt(start); // write shared prefix length
output->writeVInt(length); // write delta length
output->writeChars(termText+start, length); // write delta chars
output->writeVInt(fieldNumber); // write field num
对于词典索引文件多一项:
if (isIndex){
output->writeVLong(other->output->getFilePointer() - lastIndexPointer);
lastIndexPointer = other->output->getFilePointer(); // write pointer
} 在词典中的偏移量