多级跳跃表是保存在tim文件中的。
tip是term index,tim是term dictionary。记忆方法是,p是pointer因此是term index。
这个类会保存多个level的last变量和cur变量,同时使用RAMOutputStream数组缓存不同级别跳跃表的内容,一个term的所有doc添加完后才写入tim文件。几个主要方法:
resetSkip:几个last变量重置,lastSkipFreqPointer和lastSkipProxPointer赋值为freq和prox文件的当前长度。发生在上一个term结束,下一个term开始时。
setSkipData:设置几个current变量,curFreqPointer和curProxPointer赋值为freq和prox文件的当前长度。
bufferSkip:按如下内容缓存进入不同级别的RAMOutputStream中:
(docDelta << 1) | 1 LastPayloadLength LastOffsetLength freqDelta proxDelta child
其中child是低一级的跳跃表指针。(docDelta是否shift,是否保存lastpayloadLength和lastoffsetlength看具体情况)。可以看出跳跃表是个单链表结构,如果按dicid从小到大递增,则总是指向小一个interval的位置,按dicid从大到小递减,则总是指向大一个interval的位置。lastpayloadlength和lastoffsetlength是跳跃表上一个节点最后一个position的信息,之所以保存是可以得到上个位置最后一个position的信息,但并不能因此反向遍历position列表。
writeSkip:缓存的多级跳跃表的RAMOutputStream写入tim文件中,写入时按级别从高到低写入,先是长度,然后是整个buffer,level 0不用写长度。
Lucene40SkipListWriter,布布扣,bubuko.com
原文:http://blog.csdn.net/jollyjumper/article/details/30210807