Lucene作为最优秀的开源搜索引擎,内部实现了复杂的架构和算法,用来支撑对海量数据的存储和搜索。Lucene的存储和搜索都与底层的索引文件息息相关,Lucene发展过程中,也不断对索引文件格式进行优化和调整:
Lucene索引流程的对外方法主要由IndexWriter提供,创建DocumentsWriterPerThread(DWPT)对象,该对象实现不同Index索引下,支持并发执行索引流程。DWPT的索引执行流程由DefaultIndexingChain(索引链)定义,描述了整个索引流程。
每个DWPT都有一定的内存空间,Document执行完索引流程后,索引数据保存在内存中,当触发一定条件后,才刷新(flush)到文件系统,触发条件如下:
索引执行流程图如下,核心是执行DefaultIndexingChain(索引链)定义的索引流程:
Index索引目录下,有多个Segement构成,每个Segment由多个物理上具体的索引文件构成,同个Segment下的索引文件,具有相同的文件前缀,不同后缀的索引文件保存索引不同部分的信息。索引目录下索引文件大致如下:
索引文件的架构关系如下:
每个Segment的所有索引文件,是整个索引的子集,是一个独立的子索引,因此Lucene搜索可以基于每个Segment执行,提高搜索的并行度。
各索引类型的概要说明,官方文档:
每个索引Segment文件,包含以下内容:
上述所有文件,文件名称不会重复使用,同个Segment下的索引文件有相同的文件前缀,使用Compound File format小文件合并后,所有索引文件合并为一个文件,以.cfs为后缀名。
索引文件汇总列表如下:
名称 | 后缀 | 说明 | 执行对象 |
---|---|---|---|
Segments Files | segments_N | 存储所有Segments元数据和commit point | |
Segment Info | .si | 存储Segment元数据 | |
Compound File | .cfs,.cfe | 复合的索引文件,对其他索引文件进行定期合并 | |
Field File | .fnm,.fdx,.fdt | .fnm: 所有Field的属性信息; .fdx: 指向指定FieldData(.fdt数据)的指针索引; .ftd: Document下持久化的Field信息 | |
Inverted Index | .tim,.tip,.doc,.pos,.pay | .tim: Term Directory列表; .tip: Term Directory的索引,加速Term的查找; .doc: Term值和词频信息; .pos: Term在各个Doc下的位置信息; .pay: Term的payload和偏移量; | |
Norms | .nvd, .nvm | 存储Field的归一化因子信息,其中: .nvd: 归一化值; .nvm: 归一化元数据; | |
Per-Document Values | .dvd,.dvm | 存储DocValues: .dvd: DocValues数据; .dvm: DocValues元数据; | |
Term Vector Info | .tvx ,.tvd | 存储Term向量信息: .tvd: TermVector值; .tvx : TermVector索引; | |
Point values | .dii, .dim | 存储index索引的Point信息: .dii: 指向.dim的指针; .dim: Point数据信息; | |
Live Documents | .liv | 存储Document活跃信息 |
存储所有Segments元数据和commit point
segments_N --> Header, LuceneVersion, Version, NameCounter, SegCount, MinSegmentLuceneVersion, <SegName, SegID, SegCodec, DelGen, DeletionCount, FieldInfosGen, DocValuesGen, UpdatesFiles>SegCount, CommitUserData, Footer
.si --> Header, SegVersion, SegSize, IsCompoundFile, Diagnostics, Files, Attributes, IndexSort, Footer
复合的索引文件,对其他索引文件进行定期合并
.cfs --> Header, <FileData> FileCount, Footer
.cfe --> Header, FileCount, <FileName, DataOffset, DataLength> FileCount
存储Field属性相关信息,其中 .fnm: 所有Field的属性信息;.fdx: 指向指定FieldData(.fdt数据)的指针索引;.ftd: Document下持久化的Field信息
.fnm --> Header,FieldsCount, <FieldName,FieldNumber, FieldBits,DocValuesBits,DocValuesGen,Attributes,DimensionCount,DimensionNumBytes> FieldsCount,Footer
.fdx --> <Header>, <ChunkIndex>, Footer
.fdt --> <Header>, PackedIntsVersion, <Chunk>ChunkCount, ChunkCount, DirtyChunkCount, Footer
存储Term Directory相关信息,其中.tim: Term Directory列表;.tip: Term Directory的索引,加速Term的查找;
.tim --> Header, PostingsHeader, NodeBlockNumBlocks, FieldSummary, DirOffset, Footer
.tip --> Header, FSTIndexNumFields <IndexStartFP>NumFields,
存储Term Directory相关信息,.doc: Term值和词频信息;.pos: Term在各个Doc下的位置信息;.pay: Term的payload和偏移量;
.doc --> Header, <TermFreqs, SkipData?>TermCount, Footer
.pos --> Header, <TermPositions> TermCount, Footer
.pay --> Header, <TermPayloads, TermOffsets?> TermCount, Footer
存储Field的归一化因子信息:其中:.nvd: 归一化值;.nvm: 归一化元数据;
.nvd --> Header,<Data>NumFields,Footer
.dvm --> Header,<Entry>NumFields,Footer
存储DocValues
存储Term向量信息
存储index索引的Point信息:
存储Document活跃信息:
Lucene通过索引实现高效的全文检索,而索引的数据结构设计是对于检索性能是至关重要的,优良的索引结构能够加速数据读写,提升查询性能。本文主要解析了Lucene的索引文件,并对索引流程和索引文件进行了详细说明。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。