在随笔“Lucene:(一)建立索引文件:2。建立索引文件(一)”中提到,写索引文件从IndexWriter类开始;而IndexWriter类写索引可以看成两个方面,其中之一为IndexWriter使用SegmentInfos类写segment文件(上文介绍),另一个就是调用DocumentWriter完成写索引文件的余下工作。

DocumentWriter类也不是一次将剩下的所有索引文件写完,它包括使用FieldInfos类写fnm文件,使用TermInfosWriter类写tistii文件,使用TermVectorsWriter类写vector文件,写frqprx文件等等。下面依次介绍:

 

1.    DocumentWriter使用FiledInfos类写field信息,fnm文件。Field信息,以后在介绍FieldInfos时在详细介绍,这里只要了解有这个文件的形成就可以。

2.     

DocumentWriter使用分词器将Document的各个Field切割成term(所谓的词),同时记载该term的位置等信息(分词器帮忙),包括该term所属的field, term的词组表示, termfield中出现的position, term与上个词比较的不同(以后介绍,term与上个term比较这一概念)。

 

分词同时,将这些term和相关信息装入一张表中;分词结束后,对这张表进行排序,做到后面的term比小于前面的。这里要提到,term之间的不同有两点,一是term的词组表示,二是term所属的field

 

调用TermInfosWriter类和TermVectorsWriter类,将这个词表中的term写入相关的几个term信息文件。

 

termfrqprx文件: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;

    }

posted on 2008-07-09 22:24  wanghoney  阅读(459)  评论(0编辑  收藏  举报