Lucene4 索引格式(一) 总览

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进制的长整型的数。


文件扩展名

NameExtensionBrief Description
Segments Filesegments.gen, segments_NStores information about a commit point
Lock Filewrite.lockThe Write lock prevents multiple IndexWriters from writing to the samefile.
Segment Info.siStores metadata about a segment
Compound File.cfs, .cfeAn optional "virtual" file consisting of all the other index files forsystems that frequently run out of file handles.
Fields.fnmStores information about the fields
Field Index.fdxContains pointers to field data
Field Data.fdtThe stored fields for documents
Term Dictionary.timThe term dictionary, stores term info
Term Index.tipThe index into the Term Dictionary
Frequencies.docContains the list of docs which contain each term along with frequency
Positions.posStores position information about where a term occurs in the index
Payloads.payStores additional per-position metadata information such as character offsets and user payloads
Norms.nvd, .nvmEncodes length and boost factors for docs and fields
Per-Document Values.dvd, .dvmEncodes additional scoring factors or other per-document information.
Term Vector Index.tvxStores offset into the document data file
Term Vector Documents.tvdContains information about each document that has term vectors
Term Vector Fields.tvfThe field level info about term vectors
Deleted Documents.delInfo about what files are deleted

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lucene是一个开源的全文搜索引擎库,它提供了丰富的API和功能来创建、更新和搜索索引。要更新Lucene索引,首先需要获取一个IndexWriter实例,然后通过该实例来执行索引更新操作。 更新索引的过程通常包括以下几个步骤: 1. 创建或获取一个IndexWriter实例:IndexWriter负责索引的写入和更新操作,需要确保只有一个线程能够同时操作一个IndexWriter实例。 2. 创建或获取文档对象:更新索引需要构建文档对象,可以通过Document类来创建一个文档对象,并向其添加字段。 3. 执行更新操作:可以通过IndexWriter的addDocument、updateDocument或deleteDocuments方法来执行索引的添加、更新或删除操作。 4. 提交更新:在更新索引操作完成后,需要调用IndexWriter的commit或flush方法来提交更新,使更新操作生效。 更新索引的频率取决于应用的需求,可以是实时更新,也可以是批量更新。总之,更新索引是一个重要的操作,在使用Lucene构建搜索引擎或全文检索功能时,需要根据具体的业务需求来合理地更新索引。同时,为了保证索引更新的性能和可靠性,需要注意合理地管理IndexWriter实例,确保其在适当的时候被关闭或重新打开。 总之,通过Lucene的API和功能,可以方便地进行索引的更新操作,从而保证应用的搜索功能能够及时、准确地返回符合用户需求的搜索结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值