词典和倒排表信息

反向信息也就是反向索引,包括词典(Term Dictionary)和倒排表(Posting List)。这两部分分别存在 .tii.tis.frqprx中。

词典

term 是根据 term’s field name 和 term text 进行字典排序。

IndexReader.open() -> DirectoryReader.open() -> new DirectoryReader() -> SegmentReader.get() -> new CoreReaders() -> new TermInfosReader() -> new SegmentTermEnum()

TermInfosReader()
1
2
3
4
5
// 用于读取 tis
origEnum = new SegmentTermEnum(directory.openInput(segment + "." + IndexFileNames.TERMS_EXTENSION, readBufferSize), fieldInfos, false);
// 用于读取 tii
final SegmentTermEnum indexEnum = new SegmentTermEnum(directory.openInput(segment + "." + IndexFileNames.TERMS_INDEX_EXTENSION, readBufferSize), fieldInfos, true);

词典文件 .tis

tis属性 描述
format Lucene版本
size 词典中包含 term 的数量
indexInterval 为了加快 term 的查找速度,采用类似跳表的结构,在索引文件中 tii 中存储 term 的间隔
skipInterval 倒排表无论是文档好、词频、位置信息等都是以跳表的结构存储的,skipInterval 是跳跃的步数。
maxSkipLevels 跳表的最大层数
terminfo数组 每一项代表一个 term info,包括以前缀后缀规则存放的 text信息,term 所属的 域号 fieldNum,docFreq,term 在倒排表 frq/prx 中的偏移量(freqDelta、proxDelta),term 的倒排表的跳表在 frq 中的偏移量(skipDelta)。

词典索引文件 .tii

词典索引文件是会被全部加载到内存中去的。

tii属性 描述
format Lucene版本
size 索引文件中包含的 term 数量,term count/indexInterval
indexInterval 同词典文件中的 indexInterval
skipInterval 同词典文件中的 skipInterval
maxSkipLevels 同词典文件中的 maxSkipLevels

词频 .frq和位置 .prx

IndexReader.open() -> DirectoryReader.open() -> new DirectoryReader() -> SegmentReader.get() -> new CoreReaders()

词频

CoreReaders()
1
freqStream = cfsDir.openInput(segment + "." + IndexFileNames.FREQ_EXTENSION, readBufferSize);

.frq文件中存储的是文档号及词频信息。文档号及词频文件里面保存的是倒排表,是以跳跃表形式存在的。

  • 此文件包含TermCount个项,每一个词都有一项,因为每一个词都有自己的倒排表。
  • 对于每一个词的倒排表都包括两部分,一部分是倒排表本身,也即一个数组的文档号及词频,另一部分是跳跃表,为了更快的访问和定位倒排表中文档号及词频的位置。
  • 对于文档号和词频的存储应用的是差值规则和或然跟随规则。

位置

CoreReaders()
1
proxStream = cfsDir.openInput(segment + "." + IndexFileNames.PROX_EXTENSION, readBufferSize);

词位置信息也是倒排表,也是以跳跃表形式存在的。

  • 此文件包含TermCount个项,每一个词都有一项,因为每一个词都有自己的词位置倒排表。
  • 对于每一个词的都有一个DocFreq大小的数组,每项代表一篇文档,记录此文档中此词出现的位置。这个文档数组也是和frq文件中的跳跃表有关系的。
  • 对于每一篇文档,可能包含一个词多次,因而有一个Freq大小的数组,每一项代表此词在此文档中出现一次,则有一个位置信息。
  • 每一个位置信息包含:PositionDelta(采用差值规则),还可以保存payload,应用或然跟随规则。

感谢:
http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661436.html