Lucene中的索引是按照不同的层级来组织的, 最基本的概念有 索引(index), 文档(document), 字段(field) 和 词(term)
一个索引 是一系列文档的集合,一个文档是一系列字段的集合,一个字段是一系列词的集合,一个词是一系列字节的集合。
相同的字节序列在不同的字段中,也会被当作不同的词(term), 所以词应该用一个二元组来表示:字段名+字节内容。
字段field
一个字段是一个文档的一个部分,每个字段都有3个部分:字段名、字段类型和字段值。字段值可以是字符、字节或者是数字。
在Lucene中,字段可以是可存储(stored)类型的,这种情况下,字段的值是以字面上的不倒排的方式保存在索引中。
字段可以是倒排(indexed)类型的,这种情况下,字段的值会被倒排。
一个字段可以同时是stored和indexed类型。
段segments
Lucene中,一个完整的索引是包含多个子索引,或者叫段。每一个段都是一个完全独立的索引,可以独立地进行搜索。
索引的生成过程有两个基本步骤:
1、对添加的新文档生成新的段
2、合并已有的段
一个搜索过程可以跨越多个索引,每个索引可能包含一组段。
文档号
Lucene内部是一个整数文档号来标识文档。第一个添加的文档的文档号被标识为0,后面的依次按序增长。
文档号在以下场景是可变的:
1、文档号只在单个段里面是唯一的,当文档号用在更大的范围中时需要进行转换。最标准的做法是,为每一个段分配一个范围的值。需要
把一个段里面的文档号转换成一个外部值的时候,只需要加上这个段的基准值就行了。需要把一个外部值转换回段内值的时候,可以根据外
部值的大小判断出这个段所用文档号的范围,然后减去这个段的基准值。比如,两个各包含5个文档的段合并的时候,第一个段有一个基准
值0,第二个段有一个基准值5,那么,第二个段的3号文档转换成外部文档号的时候,就应该对应8。
2、当有文档被删除时,文档号之间就会出现缺失的现象。这些不用的文档号在合并段的过程中就会被删除掉。因此,一个新合并好的段的
文档号中间就不会出现断裂。
索引结构总览
每个段索引都会维护以下信息:
Segment_info. 包含了段的元数据信息,比如有多少文档、使用哪些文件
Field_names: 包含索引中字段名称的集合
Store_Field_values.对每一个文档,都包含了一个属性-值的列表,属性就是字段的名字。这些内容都是用来关于文档的辅助信息,比如文档的标题
URL,或者数据库的地址。这些可保存的字段在搜索命中的时候都会返回到结果中。信息以文档号标识
Term_dictionary.这是一个字典,里面包含了所有文档中indexed字段用到的所有的term.字典里面也包含term所对应的文档的编号和term频率/距离数据
的指针。
Term_Frequency_data.对于字典里的每一个term, 都保存了包含这个term的所有文档的编号,和文档中这个term出现的频率。IndexOptions.DOCS_ONLY
可以标识不保存term的频率数据。
Term_Proximity_data.对于字典里的每一个term,都保存了这个term在某个文档中出现的位置。如果所有文档的所有字段都不保存位置数据的话,这个数据也
不会存在。
Normalization_factors.对于每个文档的每一个字段,都会存储一个值,如果这个字段命中搜索的话,这个值就会被乘进得分中。
Term_Vectors.一个term vector包含了term的值和频率。
Per-document_values. 这个信息会被加载进内存以提高访问速度。这个信息对打分会很有用。
Deleted_documents.一个可选的文件,用来标识被删掉的文档。
文件命名
一个段索引中的所有文件,文件名都是一样的,只是扩展名不一样。扩展名表示不同的文件格式。当使用复合文件格式(Compound File format)的时候,段里面的
文件会被集成一个.cfs格式的文件。
通常,一个索引的所有段会放在同一个目录下,但这不是必须的。
文件名都按序增长的,比如第一个段文件叫segments_1,第二个就叫segments_2,依次类推。这个编号是一个36进制的长整型的数。
文件扩展名
Name | Extension | Brief Description |
---|---|---|
Segments File | segments.gen, segments_N | Stores information about a commit point |
Lock File | write.lock | The Write lock prevents multiple IndexWriters from writing to the samefile. |
Segment Info | .si | Stores metadata about a segment |
Compound File | .cfs, .cfe | An optional "virtual" file consisting of all the other index files forsystems that frequently run out of file handles. |
Fields | .fnm | Stores information about the fields |
Field Index | .fdx | Contains pointers to field data |
Field Data | .fdt | The stored fields for documents |
Term Dictionary | .tim | The term dictionary, stores term info |
Term Index | .tip | The index into the Term Dictionary |
Frequencies | .doc | Contains the list of docs which contain each term along with frequency |
Positions | .pos | Stores position information about where a term occurs in the index |
Payloads | .pay | Stores additional per-position metadata information such as character offsets and user payloads |
Norms | .nvd, .nvm | Encodes length and boost factors for docs and fields |
Per-Document Values | .dvd, .dvm | Encodes additional scoring factors or other per-document information. |
Term Vector Index | .tvx | Stores offset into the document data file |
Term Vector Documents | .tvd | Contains information about each document that has term vectors |
Term Vector Fields | .tvf | The field level info about term vectors |
Deleted Documents | .del | Info about what files are deleted |