Annotated Lucene:第三节 索引文件结构(6)
3.2.3.5 Positions位置信息数据(.prx)
Positions位置信息数据文件(.prx文件)容纳了每一个term出现在所有文档中的位置的列表。注意如果在fields中的omitTf设置为true时将不会在此文件中存储任何信息,并且如果索引中所有fields中的omitTf都设置为true,此.prx文件将不会存在。
|
版本 |
包含的项 |
数目 |
类型 |
描述 |
|
全部版本 |
TermPositions |
TermCount |
TermPositions |
按照term顺序排序,term是隐含的(?implicit),来自.tis文件。 |
|
TermPositions->Positions |
DocFreq |
Positions |
按文档编号递增的顺序排序。 |
|
|
Positions->PositionDelta |
Freq |
VInt |
如果term的fields中payloads被禁用,则取值为term出现在该文档中当前位置与前一个位置的差值(第一个位置取值0)。如果payloads被启用,则取值为当前位置与上一个位置之间差值的2倍。如果payloads启用并且PositionDelta为单数,则PayloadLength被存储,表示当前位置的payloads的长度。 |
|
|
Positions->Payload? |
Freq |
Payload |
|
|
|
Payload->PayloadLength? |
1 |
VInt |
|
|
|
Payload->PayloadData |
PayloadLength |
byte |
|
结构如下图所示:

例如,如果一个term的TermPositions为一个文档中出现的第4个term,并且为后来的文档(subsequent document)中出现的第5个和第9个term,则将被存储为下面的VInt数据序列(payloads禁用):
4, 5, 4
PayloadData是与term的当前位置相关联元数据(metadata),如果该位置的PayloadLength被存储,则它表示此payload的长度。如果PayloadLength没存储,则此payload与前一个位置的payload拥有相等的PayloadLength。
3.2.3.6 Norms调节因子文件(.nrm)
在Lucene 2.1版本之前,每一个索引都有一个norm文件给每一个文档都保存了一个字节。对每一个文档来说,那些.f[0-9]*包含了一个字节容纳一个被编码的分数,值为对hits结果集来说在那个field中被相乘得出的分数(multiplied into the score)。每一个分离的norm文件在适当的时候(when adequate)为复合的(compound)和非复合的segment片断创建,格式如下:
Norms (.f[0-9]*) –> SegSize
在Lucene 2.1及以上版本,只有一个norm文件容纳了所有norms数据:
|
版本 |
包含的项 |
数目 |
类型 |
描述 |
|
2.1及之后版本 |
NormsHeader |
1 |
raw |
‘N’,'R’,'M’,Version:4个字节,最后字节表示该文件的格式版本,当前为-1 |
|
Norms |
NumFieldsWithNorms |
Norms |
|
|
|
Norms->Byte |
SegSize |
Byte |
每一个字节编码了一个float指针数值,bits 0-2 容纳 3-bit 尾数(mantissa),bits 3-8容纳 5-bit 指数(exponent),这些被转换成一个IEEE单独的float数值,如图所示 |
|
|
NormsHeader->Version |
1 |
Byte |
|
结构如下图所示:

一个分离的norm文件在一个存在的segment的norm数据被更改的时候被创建,当field N被修改时,一个分离的norm文件.sN被创建,用来维护该field的norm数据。