中文(中国)更改
 
powered by
Hawk Search
Hawk Search

 
分类

 
文章

 
日历

三月 2010
« 四    
1234567
891011121314
15161718192021
22232425262728
293031  
 
 
Javen-Studio Thinking of Life, Imagination of Future.
NEWS

Annotated Lucene:第三节 索引文件结构(5)

3.2.3.4 Term频率数据(.frq)

Term频率数据文件(.frq文件)存储容纳了每一个term的文档列表,以及该term出现在该文档中的频率(出现次数frequency,如果omitTf设置为fals时才存储)。

版本

包含的项

数目

类型

描述

全部版本

TermFreqs

TermCount

TermFreq

按照term顺序排序,term是隐含的(?implicit),来自.tis文件。TermFreq按文档编号递增的顺序排序。

SkipData

TermCount

SkipData

TermFreq->DocDelta

TermCount

VInt

如果omitTf设置为false,要同时检测文档编号和频率,特别指出,DocDelta/2时该文档编号与上一个文档编号的差值(如果是第一个文档值为0)。当DocDelta为单数时频率为1,当DocDelta为偶数时频率为读取下一个VInt的值。如果omitTf设置为trueDocDelta为文档编号之间的差值(gap,不用乘以2multiplited),频率信息则不被存储。

TermFreq->[Freq?]

TermCount

VInt

SkipData->SkipLevelLength

NumSkipLevels-1

VInt

SkipData->SkipLevel

TermCount

SkipDatums

SkipLevel->SkipDatum

DocFreq/(SkipInterval^(Level + 1))

SkipDatum

SkipData->SkipDatum

TermCount

SkipDatum

SkipDatum->DocSkip

1

VInt

SkipDatum->PayloadLength?

1

VInt

SkipDatum->FreqSkip

1

VInt

SkipDatum->ProxSkip

1

VInt

SkipDatum->SkipChildLevelPointer?

1

VLong

结构如下图所示:

举例来说,当omitTf设置为false时,一个term的TermFreqs在文档7出现1次并且在文档11中出现3次,则为如下的VInt数字序列:

15, 8, 3

如果omitTf设置为true时,则为如下数字序列:

7, 4

DocSkip记录在TermFreqs中每隔SkipInterval个文档之前的文档编号。如果该term的域fields中被禁用payloads时,则DocSkip呈现在序列中(in the sequence)与上一个值之间的差值(difference)。如果payloads启用时,则DocSkip/2表示序列中与上一个值之间的差值。如果payloads启用并且DocSkip为奇数时,PayloadLength将被存储并表示(indicating)在TermPositions中第SkipInterval个文档之前的最后一个payload的长度。FreqSkip和ProxSkip分别(respectively)记录在FreqFile和ProxFile文件中每SkipInterval个记录(entry)的位置。文件的位置信息对序列中前一个SkipDatumn来说与TermFreqs和Positions的起始信息相关。

例如,如果DocFreq=35并且SkipInterval=16,则在TermFreqs中有两个SkipData记录,容纳第15和第31个文档编号。第一个FreqSkip代表第16个SkipDatumn起始的TermFreqs数据开始之后的字节数目,第二个FreqSkip表示第32个SkipDatumn开始之后的字节数目。第一个ProxSkip代表第16个SkipDatumn起始的Positions数据开始之后的字节数目,第二个ProxSkip表示第32个SkipDatumn开始之后的字节数目。

在Lucene 2.2版本中介绍了skip levels的想法(notion),每一个term可以有多个skip levels。一个term的skip levels的数目等于NumSkipLevels = Min(MaxSkipLevels, floor(log(DocFreq/log(SkipInterval))))。对一个skip level来说SkipData记录的数目等于DocFreq/(SkipInterval^(Level + 1))。然而(whereas)最低的(lowest)skip level等于Level = 0。

例如假设SkipInterval = 4, MaxSkipLevels = 2, DocFreq = 35,则skip level 0有8个SkipData记录,在TermFreqs序列中包含第3、7、11、15、19、23、27和31个文档的编号。Skip level 1则有2个SkipData记录,在TermFreqs中包含了第15和第31个文档的编号。

在所有level>0之上的SkipData记录中包含一个SkipChildLevelPointer,指向(referencing)level-1中相应)(corresponding)的SkipData记录。在这个例子中,level 1中的记录15有一个指针指向level 0中的记录15,level 1中的记录31有一个指针指向level 0中的记录31。

发表评论