Terms数据 磁盘文件存储细节
从这篇开始,已经涉及到倒排索引表的信息存储问题了。我们都知道倒排索引表中的Dictionary有许多不同的terms组成,Lucene关于这些terms数据的存储,就放在磁盘的.tii和.tis文件中。
★ .tii 词典 索引文件 .tis 词典数据文件
1、tii 保存了tis中每 隔 IndexInterval个词的位置信息,这是为了加快对词典文件tii中词的查找速度
具体结构如下:
TermInfoIndex (.tii)--> TIVersion, IndexTermCount, IndexInterval, SkipInterval, MaxSkipLevels, TermIndices
TIVersion --> UInt32 版本号
IndexTermCount --> UInt64 词典索引文件中包含的词数。
IndexInterval --> UInt32 (同tis)
SkipInterval --> UInt32 (同tis)
TermIndices --> <TermInfo, IndexDelta> IndexTermCount IndexTermCount 个项的数组,每一项包括两部分,第一部分是词本身(TermInfo),第二部分是在词典.tis文件中的偏移量(IndexDelta)。假设IndexInterval为 4,此数组中保存第4个,第8个,第12个词。
TermInfo --> <Term, DocFreq, FreqDelta, ProxDelta, SkipDelta> (同 tis)
IndexDelta --> VLong 用来确定该 Term 的 TermInfo 在 .tis 文件中的位置,特别指出,它是该 term 的数据的位置与前一个 term 位置的差值。 (关于差值规则请参见:《索引文件格式(1):基础知识 》
2、tis 存放索引表中Dictionary的所有Term的信息。
具体结构如下:
TermInfoFile (.tis)--> TIVersion, TermCount, IndexInterval, SkipInterval, MaxSkipLevels, TermInfos
TIVersion --> UInt32 版本号
TermCount --> UInt64 词典中包含的总的词数
IndexInterval --> UInt32 为了加快对词的查找速度,也应用类似跳跃表的结构,假设IndexInterval为4,则在词典索引(tii)文件中保存第4个,第8个,第12个词,这样可以加快在词典文件中查找词的速度。
SkipInterval --> UInt32 倒排表无论是文档号及词频,还是位置信息,都是以跳跃表的结构存在的,SkipInterval是跳跃的步数。
MaxSkipLevels --> UInt32 跳跃表是多层的,这个值指的是跳跃表的最大层数。
TermInfos --> <TermInfo> TermCount TermCount个项的数组,每一项代表一个具体词的信息。单个TermInfo 的结构如下: TermInfo --> <Term, DocFreq, FreqDelta, ProxDelta, SkipDelta> 其中:
Term --> <PrefixLength, Suffix, FieldNum> 词语文本信息
PrefixLength -->VInt 前缀规则中的前缀长度
Suffix--> String 利用前缀规则存放词的文本信息(关于前缀规则请参见:《索引文件格式(1):基础知识 》)。
FieldNum--> VInt 词属于的域的域号
DocFreq--> VInt 有多少篇文档包含此词
FreqDelta ,ProxDelta --> VInt 此词的词频和位置信息在frq,prx中的偏移地址
SkipDelta --> VInt
★ 专题用例 :
关于例子的详细信息参见《索引文件格式(2):文件 结构总体框架 》最后的说明。
(1) 解释一下tii文件的数据
◆ tii文件最重要的一个就是IndexInterval。它表明了tii中记录了tis中每隔IndexInterval个Term的起始地址。
(2) 解释一下tis文件的数据
◆ 我们将name ,path, content域都建立了索引,但name, path域并没有用Analyzer 进行分词。因此会出现像:"e:\实验\content\lucene 1.txt"这样的Term。
◆ 所有term都以前缀规则来存储,这一点在上图中很明显。