在随笔“Lucene:(一)建立索引文件:2。建立索引文件(一)”中提到,写索引文件从IndexWriter类开始;而IndexWriter类写索引可以看成两个方面,其中之一为IndexWriter使用SegmentInfos类写segment文件(上文介绍),另一个就是调用DocumentWriter完成写索引文件的余下工作。
DocumentWriter类也不是一次将剩下的所有索引文件写完,它包括使用FieldInfos类写fnm文件,使用TermInfosWriter类写tis和tii文件,使用TermVectorsWriter类写vector文件,写frq和prx文件等等。下面依次介绍:
1. DocumentWriter使用FiledInfos类写field信息,fnm文件。Field信息,以后在介绍FieldInfos时在详细介绍,这里只要了解有这个文件的形成就可以。
2.
①DocumentWriter使用分词器将Document的各个Field切割成term(所谓的词),同时记载该term的位置等信息(分词器帮忙),包括该term所属的field, term的词组表示, term在field中出现的position,
term与上个词比较的不同(以后介绍,term与上个term比较这一概念)。
②分词同时,将这些term和相关信息装入一张表中;分词结束后,对这张表进行排序,做到后面的term比小于前面的。这里要提到,term之间的不同有两点,一是term的词组表示,二是term所属的field;
③调用TermInfosWriter类和TermVectorsWriter类,将这个词表中的term写入相关的几个term信息文件。
④写term的frq和prx文件:frq文件表示term项频数,每个term出现的文档的列表和对应中出现的次; .prx文件包含了某文档中某项出现的位置信息的列表。格式如下:
Frq文件:<TermFreqs>TermCount
TermFreqs
:<TermFreq>DocFreq
TermFreq :DocDelta, Freq
TermFreqs序列按照项来排序(依据于.tis文件中的项,即项是隐含存在的)。
prx文件: <TermPositions>TermCount
TermPositions --> <Positions>DocFreq
Positions --> <PositionDelta>Freq
这里因为没写到合并,所以暂且格式是如下的,给源程序:
Frq的形式:
if (postingFreq == 1) // optimize freq=1
freq.writeVInt(1);
// set low bit of doc num.
Else
{
freq.writeVInt(0);
// the document number
freq.writeVInt(postingFreq);
// frequency in doc
}
Prx的形式:
for (int j = 0; j < postingFreq; j++)
{ // use delta-encoding
int position = positions[j];
prox.writeVInt(position -
lastPosition);
lastPosition = position;
}