Annotated Lucene:第三节 索引文件结构(4)
3.2.3.3 Term字典(.tii和.tis)
Term字典使用如下两种文件存储,第一种是存储term信息(TermInfoFile)的文件,即.tis文件,格式如下:
|
版本 |
包含的项 |
数目 |
类型 |
描述 |
|
全部版本 |
TIVersion |
1 |
UInt32 |
记录该文件的版本,1.4版本中为-2 |
|
TermCount |
1 |
UInt64 |
|
|
|
IndexInterval |
1 |
UInt32 |
|
|
|
SkipInterval |
1 |
UInt32 |
|
|
|
MaxSkipLevels |
1 |
UInt32 |
|
|
|
TermInfos |
1 |
TermInfo… |
|
|
|
TermInfos->TermInfo |
TermCount |
TermInfo |
|
|
|
TermInfo->Term |
TermCount |
Term |
|
|
|
Term->PrefixLength |
TermCount |
VInt |
Term文本的前缀可以共享,该项的值表示根据前一个term的文本来初始化的字符串前缀长度,前一个term必须已经预设成后缀文本以便构成该term的文本。比如,如果前一个term为“bone”,而当前term为“boy”,则该PrefixLength值为2,suffix值为“y” |
|
|
Term->Suffix |
TermCount |
String |
如上 |
|
|
Term->FieldNum |
TermCount |
VInt |
用来确定term的field,它们存储在.fdt文件中。 |
|
|
TermInfo->DocFreq |
TermCount |
VInt |
包含该term的文档数目 |
|
|
TermInfo->FreqDelta |
TermCount |
VInt |
用来确定包含在.frq文件中该term的TermFreqs的位置。特别指出,它是该term的数据在文件中位置与前一个term的位置的差值,当为第一个term时,该值为0 |
|
|
TermInfo->ProxDelta |
TermCount |
VInt |
用来确定包含在.prx文件中该term的TermPositions的位置。特别指出,它是该term的数据在文件中的位置与前一个term的位置地差值,当为第一个term时,该值为0。如果fields的omitTF设置为true,该值也为0,因为prox信息没有被存储。 |
|
|
TermInfo->SkipDelta |
TermCount |
VInt |
用来确定包含在.frq文件中该term的SkipData的位置。特别指出,它是TermFreqs之后即SkipData开始的字节数目,换句话说,它是TermFreq的长度。SkipDelta只有在DocFreq不比SkipInteval小的情况下才会存储。 |
TermInfoFile文件按照Term来排序,排序方法首先按照Term的field名称(按照UTF-16字符编码)排序,然后按照Term的Text字符串(UTF-16编码)排序。
结构如下图所示:

另一种是存储term信息的索引文件,即.tii文件,该文件包含.tis文件中每一个IndexInterval的值,与它在.tis中的位置一起被存储,这被设计来完全地读进内存中(read entirely into memory),以便用来提供随机访问.tis文件。该文件的结构与.tis文件非常相似,只是添加了一项数据,即IndexDelta。格式如下
|
版本 |
包含的项 |
数目 |
类型 |
描述 |
|
全部版本 |
TIVersion |
1 |
UInt32 |
同tis |
|
IndexTermCount |
1 |
UInt64 |
同tis |
|
|
IndexInterval |
1 |
UInt32 |
同tis |
|
|
SkipInterval |
1 |
UInt32 |
是TermDocs存储在skip表中的分数(fraction),用来加速(accelerable)TermDocs.skipTo(int)的调用。在更小的索引中获得更大的结果值(larger values result),将获得更高的速度,但却更小开销?(fewer accelerable cases)。but fewer accelerable cases, while smaller values result in bigger indexes, less acceleration (in case of a small value for MaxSkipLevels) and more accelerable cases. |
|
|
MaxSkipLevels |
1 |
UInt32 |
是.frq文件中为每一个term存储的skip levels的最大数目,A low value results in smaller indexes but less acceleration, a larger value results in slighly larger indexes but greater acceleration.参见.frq文件格式中关于skip levels的详细介绍。 |
|
|
TermIndices |
IndexTermCount |
TermIndice |
同tis |
|
|
TermIndice->TermInfo |
IndexTermCount |
TermInfo |
同tis |
|
|
TermIndice->IndexDelta |
IndexTermCount |
VLong |
用来确定该Term的TermInfo在.tis文件中的位置,特别指出,它是该term的数据的位置与前一个term位置的差值。 |
结构如下图所示:
