lucene-索引文件格式

系统 2337 0

索引文件结构

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-索引文件格式

如果将它们的关系划成图则如下所示:

 

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:

lucene-索引文件格式


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论