索引文件结构
Lucene 使用文件扩展名标识不同的索引文件,文件名标识不同版本或者代( generation )的索引片段( segment )。如 .fnm 文件存储域 Fields 名称及其属性, .fdt 存储文档各项域数据, .fdx 存储文档在 fdt 中的偏移位置即其索引文件, .frq 存储文档中 term 位置数据, .tii 文件存储 term 字典, .tis 文件存储 term 频率数据, .prx 存储 term 接近度数据, .nrm 存储调节因子数据,另外 segments_X 文件存储当前最新索引片段的信息,其中 X 为其最新修改版本, segments.gen 存储当前版本即 X 值,这些文件的详细介绍上节已说过了。
下面的图描述了一个典型的 lucene 索引文件列表:
如果将它们的关系划成图则如下所示:
这些文件中存储数据的详细结构是怎样的呢,下面几个小节逐一介绍它们,熟悉它们的结构非常有助于优化 Lucene 的查询和索引效率和存储空间等。
3.2 每个 Index包含的单个文件
下面几节介绍的文件存在于每个索引 index 中,并且只有一份。
3.2.1 Segments文件
索引中活动( active )的 Segments 被存储在 segment info 文件中, segments_N ,在索引中可能会包含一个或多个 segments_N 文件。然而,最大一代的那个文件( the one with largest generation )是活动的片断文件(这时更旧的 segments_N 文件依然存在( are present )是因为它们暂时( temporarily )还不能被删除,或者,一个 writer 正在处理提交请求( in the process of committing ),或者一个用户定义的( custom ) IndexDeletionPolicy 正被使用)。这个文件按照名称列举每一个片断( lists each segment by name ),详细描述分离的标准( seperate norm )和要删除的文件( deletion files ),并且还包含了每一个片断的大小。
对 2.1 版本来说,还有一个文件 segments.gen 。这个文件包含了该索引中当前生成的代( current generation )( segments_N 中的 _N )。这个文件仅用于一个后退处理( fallback )以防止( in case )当前代( current generation )不能被准确地( accurately )通过单独地目录文件列举( by directory listing alone )来确定( determened )(由于某些 NFS 客户端因为基于时间的目录( time-based directory )的缓存终止( cache expiration )而引起)。这个文件简单地包含了一个 int32 的版本头( version header )( SegmentInfos.FORMAT_LOCKLESS=-2 ),遵照代的记录( followed by the generation recorded )规则,对 int64 来说会写两次( write twice )。
版本 |
包含的项 |
数目 |
类型 |
描述 |
2.1 之前版本 |
Format |
1 |
Int32 |
在 Lucene1.4 中为 -1 ,而在 Lucene 2.1 中为 -3 ( SegmentsInfos.FORMAT_SINGLE_NORM_FILE ) |
Version |
1 |
Int64 |
统计在删除和添加文档时,索引被更改了多少次。 |
|
NameCounter |
1 |
Int32 |
用于为新的片断文件生成新的名字。 |
|
SegCount |
1 |
Int32 |
片断的数目 |
|
SegName |
SegCount |
String |
片断的名字,用于所有构成片断索引的文件的文件名前缀。 |
|
SegSize |
SegCount |
Int32 |
包含在片断索引中的文档的数目。 |
|
2.1 及之后版本 |
Format |
1 |
Int32 |
在 Lucene 2.1 和 Lucene 2.2 中为 -3 ( SegmentsInfos.FORMAT_SINGLE_NORM_FILE ) |
Version |
1 |
Int64 |
同上 |
|
NameCounter |
1 |
Int32 |
同上 |
|
SegCount |
1 |
Int32 |
同上 |
|
SegName |
SegCount |
String |
同上 |
|
SegSize |
SegCount |
Int32 |
同上 |
|
DelGen |
SegCount |
Int64 |
为分离的删除文件的代的数目( generation count of the separate deletes file ),如果值为 -1 ,表示没有分离的删除文件。如果值为 0 ,表示这是一个 2.1 版本之前的片断,这时你必须检查文件是否存在 _X.del 这样的文件。任意大于 0 的值,表示有分离的删除文件,文件名为 _X_N.del 。 |
|
HasSingleNormFile |
SegCount |
Int8 |
该值如果为 1 ,表示 Norm 域( field )被写为一个单一连接的文件( single joined file )中(扩展名为 .nrm ),如果值为 0 ,表示每一个 field 的 norms 被存储为分离的 .fN 文件中,参考下面的“标准化因素( Normalization Factors )” |
|
NumField |
SegCount |
Int32 |
表示 NormGen 数组的大小,如果为 -1 表示没有 NormGen 被存储。 |
|
NormGen |
SegCount * NumField |
Int64 |
记录分离的标准文件( separate norm file )的代( generation ),如果值为 -1 ,表示没有 normGens 被存储,并且当片断文件是 2.1 之前版本生成的时,它们全部被假设为 0 ( assumed to be 0 )。而当片断文件是 2.1 及更高版本生成的时,它们全部被假设为 -1 。这时这个代( generation )的意义与上面 DelGen 的意义一样。 |
|
IsCompoundFile |
SegCount |
Int8 |
记录是否该片断文件被写为一个复合的文件,如果值为 -1 表示它不是一个复合文件( compound file ),如果为 1 则为一个复合文件。另外如果值为 0 ,表示我们需要检查文件系统是否存在 _X.cfs 。 |
|
2.3 |
Format |
1 |
Int32 |
在 Lucene 2.3 中为 -4 (SegmentInfos.FORMAT_SHARED_DOC_STORE) |
Version |
1 |
Int64 |
同上 |
|
NameCounter |
1 |
Int32 |
同上 |
|
SegCount |
1 |
Int32 |
同上 |
|
SegName |
SegCount |
String |
同上 |
|
SegSize |
SegCount |
Int32 |
同上 |
|
DelGen |
SegCount |
Int64 |
同上 |
|
DocStoreOffset |
1 |
Int32 |
如果值为 -1 则该 segment 有自己的存储文档的 fields 数据和 term vectors 的文件,并且 DocStoreSegment, DocStoreIsCompoundFile 不会存储。在这种情况下,存储 fields 数据( *.fdt 和 *.fdx 文件)以及 term vectors 数据( *.tvf 和 *.tvd 和 *.tvx 文件)的所有文件将存储在该 segment 下。另外, DocStoreSegment 将存储那些拥有共享的文档存储文件的 segment 。 DocStoreIsCompoundFile 值为 1 如果 segment 存储为 compound 文件格式(如 .cfx 文件),并且 DocStoreOffset 值为那些共享文档存储文件中起始的文档编号,即该 segment 的文档开始的位置。在这种情况下,该 segment 不会存储自己的文档数据文件,而是与别的 segment 共享一个单一的数据文件集。 |
|
[DocStoreSegment] |
1 |
String |
如上 |
|
[DocStoreIsCompoundFile] |
1 |
Int8 |
如上 |
|
HasSingleNormFile |
SegCount |
Int8 |
同上 |
|
NumField |
SegCount |
Int32 |
同上 |
|
NormGen |
SegCount * NumField |
Int64 |
同上 |
|
IsCompoundFile |
SegCount |
Int8 |
同上 |
|
2.4 及以上 |
Format |
1 |
Int32 |
在 Lucene 2.4 中为 -7 (SegmentInfos.FORMAT_HAS_PROX) |
Version |
1 |
Int64 |
同上 |
|
NameCounter |
1 |
Int32 |
同上 |
|
SegCount |
1 |
Int32 |
同上 |
|
SegName |
SegCount |
String |
同上 |
|
SegSize |
SegCount |
Int32 |
同上 |
|
DelGen |
SegCount |
Int64 |
同上 |
|
DocStoreOffset |
1 |
Int32 |
同上 |
|
[DocStoreSegment] |
1 |
String |
同上 |
|
[DocStoreIsCompoundFile] |
1 |
Int8 |
同上 |
|
HasSingleNormFile |
SegCount |
Int8 |
同上 |
|
NumField |
SegCount |
Int32 |
同上 |
|
NormGen |
SegCount * NumField |
Int64 |
同上 |
|
IsCompoundFile |
SegCount |
Int8 |
同上 |
|
DeletionCount |
SegCount |
Int32 |
记录该 segment 中删除的文档数目 |
|
HasProx |
SegCount |
Int8 |
值为 1 表示该 segment 中至少一个 fields 的 omitTf 设置为 false ,否则为 <span style="font-size: 10pt; font-family: |