接上文Lucene索引文件解析之“域”。
关于项(Term)
.tis文件里记录的是域经过分析器(analyser)分析之后项的字典。还是来看文件内容:
.tis 写道
FF FF FF FE 00 00 00 00 00 00 00 07 00 00 00 80 ?..........€
00 00 00 10 00 05 63 6F 64 65 72 00 01 00 00 00 ......coder.....
06 65 78 70 65 72 74 00 01 01 01 00 03 69 27 6D .expert......i'm
00 01 01 01 00 06 6C 75 63 65 6E 65 00 02 01 01 ......lucene....
00 03 6E 65 77 00 01 02 02 00 05 61 6C 6C 65 6E ..new......allen
01 01 01 01 00 05 72 6F 63 6B 79 01 01 01 01 ......rocky....
1. FF FF FF FE tis文件的版本;
2. 00 00 00 00 00 00 00 07 字典中记录的项的个数;
3. 00 00 00 80 IndexInterval ,这个参数是配合tii文件一起,加快查询之用,之后会详细介绍;
4. 00 00 00 10 SkipInterval 用于加速TermDocs.skipTo(int)的,之后会详细介绍;
5. 剩下的部分就是一个个项的信息:
1. 00 前缀长度,特指当前项和它之前的项公用的前缀部分的长度;举个例子,有两个相邻的项分别是“bone”和“boy”,那么“boy”和“bone”公用的前缀是“bo”,则前缀长度就是2;若没有公用的,或者项是第一个,那么前缀长度也就是0;这样做的目的是为了节省存储空间;
2. 05 项的文本长度;
3. 63 6F 64 65 72 项的文本内容"coder";
4. 00 项所属域的序号;
5. 01 项在文档中出现的次数;
6. 00 项在.frq文件中位置的偏移量,这个字节定位项所在文档的关键;
7. 00 项在.prx文件中位置的偏移量;
8. 00 项的SkipData在.frq文件中位置;
9. 此后依此类推。
.tis文件的格式为<文件版本><项数量>< IndexInterval><SkipInterval>[<公用前缀长度><项文本长度><项文本内容><项所属域序号><文档中出现次数><frq中的偏移量><prx中的偏移量><SkipData在frq的位置>...]。
.tii文件中记录了tis文件的索引,简而言之,在查询时是通过预载tii来加快对项的检索。
.tii 写道
FF FF FF FE 00 00 00 00 00 00 00 01 00 00 00 80 ?..........€
00 00 00 10 00 00 FF FF FF FF 0F 00 00 00 14 ...........
tii和tis的非常类似,只是在项信息之后多了一个IndexDelta,也就上面的14,它表示在tis文件中第一个项信息的偏移量是20(十六进制的14的十进制是20)个字节。
上面FF FF FF FF 0F 是很让人迷惑的,因为tii中第一个索引项是空的,相当于new Term("",""),它没有一个域与其匹配,Lucene默认用-1来填充,具体细节请参见TermInfosWriter类的源代码。
到现在可能对tis和tii的作用还是很模糊,解密的关键在于对IndexInterval的理解,下次我们将围绕它来展开讨论。