Lucene 源码剖析
3.3 每个Segment包含的文件
剩下的文件(remaining files)都是per-segment(每个片断文件),因此(thus)都用后缀来定义(defined by suffix)。
3.3.1 Fields域数据文件
3.3.1.1 Field信息(.fnm)
Field的名字都存储在Field信息文件中,后缀是.fnm。
文件 |
包含的项 |
数目 |
类型 |
版本 |
描述 |
FieldsInfo(.fnm) |
FieldsCount |
1 |
VInt |
|
|
FieldName |
FieldsCount |
String |
|
|
|
FieldBits |
FieldsCount |
Byte |
|
最低阶的bit位(low-order bit)值为1表示是被索引的Fields,0表示非索引的Fields。 |
|
|
第二个最低阶的bit位(second lowest-order bit)值为1表示该Field有term向量存储(term vectors stored),0表示该field没有term向量。 |
||||
>=1.9 |
如果第三个最低阶的bit位(third lowest-order bit)设置(0×04),term的位置(term positions)将和term向量一起被存储(stored with term vectors)。 |
||||
>=1.9 |
如果第四个最低阶的bit位(fourth lowest-order bit)设置(0×08),term的偏移(term offsets)将和term向量一起被存储(stored with term vectors)。 |
||||
>=1.9 |
如果第五个最低阶的bit位(fifth lowest-order bit)设置(0×10),norms将对索引的field忽略掉(norms are omitted for the indexed field)。 |
||||
>=1.9 |
如果第六个最低阶的bit位(sixth lowest-order bit)设置(0×20),payloads将为索引的field存储(payloads are stored for the indexed field)。 |
注明:payloads概念:
词条载荷(payloads)――允许用户将任意二进制数据和索引中的任意词条(term)相关联。
词条载荷是一个允许信息在索引中按逐词条储存的新特性。例如,当索引Web页面时,储存某个关键词的额外信息可能会很有用,例如这个关键词关联的URL或者经过文字分析后得出的权重系数。在更高级的应用中,为了突出语句中的名次成分相对于其它成分的重要性,储存语句中这个关键词出现的部分可能会很有帮助。我今年在ApacheCon Europe会议上的演讲中就有几张讲述词条载荷的幻灯片,感兴趣的读者可以去看看。
Fields将使用它们在这个文件中的顺序来编号(fields are numbered by their order in this file)。需要注意的是,就像文档编号(document numbers)一样,field编号(field numbers)与片断是相关的(are segment relative)。结构如下图所示:
3.3.1.2 存储的Field(.fdx和.fdt)
存储的fields(stored fields)通过两个文件来呈现(represented by two files),即field索引文件(.fdx)和field数据文件(.fdt)。
文件 |
包含的项 |
父项 |
数目 |
类型 |
版本 |
描述 |
Fields Index(.fdx) 对每个文档来说,存储指向它的fields数据的指针(pointer) |
FieldValuesPosition |
|
SegSize |
UInt64 |
|
用于找详细文档(a particular document)的所有fields的field数据文件中的位置(position),因为它包含的(contains)是固定长度的数据(fixed-length data),这个文件可以很容易地进行随机访问(randomly accessed)。 |
|
文档n的field数据的位置是在该文件中n*8的位置中(UInt64类型)。 |
|||||
Fields Data(.fdt)这个文件存储每个文档的field数据 |
DocFieldData |
|
SegSize |
|
|
|
FieldCount |
DocFieldData |
1 |
VInt |
|
|
|
FieldNum |
DocFieldData |
FieldCount |
VInt |
|
|
|
Bits |
DocFieldData |
FieldCount |
Byte |
<=1.4 |
只有最低阶的bit位(low-order bits of Bits)被使用,值为1表示tokenized field(分解过的field),0表示non-tokenized field。 |
|
Byte |
>=1.9 |
最低阶的bit位表示tokenized field |
||||
>=1.9 |
第二个bit(second bit)用于表示该field存储binary数据。 |
|||||
>=1.9 |
第三个bit(third bit)表示该field的压缩选项被开启(field with compression enabled),如果压缩选项开启,采用的压缩算法(algorithm)是ZLIB |
|||||
Value |
DocFieldData |
FieldCount |
String |
<=1.4 |
|
|
String | BinaryValue |
>=1.9 |
依赖于Bits的值 |
||||
BinaryValue |
>=1.9 |
ValueSize,<Byte>^ValueSize |
||||
ValueSize |
Value |
1 |
VInt |
>=1.9 |
|
结构如下图所示:
3.3.2 存储的term字典(.tii和.tis)
Term字典使用如下两种文件存储,第一种是存储term信息(TermInfoFile)的文件,即.tis文件,格式如下:
版本 |
包含的项 |
数目 |
类型 |
描述 |
全部版本 |
TIVersion |
1 |
UInt32 |
记录该文件的版本,1.4版本中为-2 |
TermCount |
1 |
UInt64 |
|
|
IndexInterval |
1 |
UInt32 |
|
|
SkipInterval |
1 |
UInt32 |
|
|
MaxSkipLevels |
1 |
UInt32 |
|
|
TermInfos |
1 |
TermInfo… |
|
|
TermInfos->TermInfo |
TermCount |
TermInfo |
|
|
TermInfo->Term |
TermCount |
Term |
|
|
Term->PrefixLength |
TermCount |
VInt |
Term文本的前缀可以共享,该项的值表示根据前一个term的文本来初始化的字符串前缀长度,前一个term必须已经预设成后缀文本以便构成该term的文本。比如,如果前一个term为“bone”,而当前term为“boy”,则该PrefixLength值为2,suffix值为“y” |
|
Term->Suffix |
TermCount |
String |
如上 |
|
Term->FieldNum |
TermCount |
VInt |
用来确定term的field,它们存储在.fdt文件中。 |
|
TermInfo->DocFreq |
TermCount |
VInt |
包含该term的文档数目 |
|
TermInfo->FreqDelta |
TermCount |
VInt |
用来确定包含在.frq文件中该term的TermFreqs的位置。特别指出,它是该term的数据在文件中位置与前一个term的位置的差值,当为第一个term时,该值为0 |
|
TermInfo->ProxDelta |
TermCount |
VInt |
用来确定包含在.prx文件中该term的TermPositions的位置。特别指出,它是该term的数据在文件中的位置与前一个term的位置地差值,当为第一个term时,该值为0。如果fields的omitTF设置为true,该值也为0,因为prox信息没有被存储。 |
|
TermInfo->SkipDelta |
TermCount |
VInt |
用来确定包含在.frq文件中该term的SkipData的位置。特别指出,它是TermFreqs之后即SkipData开始的字节数目,换句话说,它是TermFreq的长度。SkipDelta只有在DocFreq不比SkipInteval小的情况下才会存储。 |
TermInfoFile文件按照Term来排序,排序方法首先按照Term的field名称(按照UTF-16字符编码)排序,然后按照Term的Text字符串(UTF-16编码)排序。 结构如下图所示:
另一种是存储term信息的索引文件,即.tii文件,该文件包含.tis文件中每一个IndexInterval的值,与它在.tis中的位置一起被存储,这被设计来完全地读进内存中(read entirely into memory),以便用来提供随机访问.tis文件。该文件的结构与.tis文件非常相似,只是添加了一项数据,即IndexDelta。格式如下
版本 |
包含的项 |
数目 |
类型 |
描述 |
全部版本 |
TIVersion |
1 |
UInt32 |
同tis |
IndexTermCount |
1 |
UInt64 |
同tis |
|
IndexInterval |
1 |
UInt32 |
同tis |
|
SkipInterval |
1 |
UInt32 |
是TermDocs存储在skip表中的分数(fraction),用来加速(accelerable)TermDocs.skipTo(int)的调用。在更小的索引中获得更大的结果值(larger values result),将获得更高的速度,但却更小开销?(fewer accelerable cases while smaller values result in bigger indexes, less acceleration (in case of a small value for MaxSkipLevels) |
|
MaxSkipLevels |
1 |
UInt32 |
是.frq文件中为每一个term存储的skip levels的最大数目,A low value results in smaller indexes but less acceleration, a larger value results in slighly larger indexes but greater acceleration.参见.frq文件格式中关于skip levels的详细介绍。 |
|
TermIndices |
IndexTermCount |
TermIndice |
同tis |
|
TermIndice->TermInfo |
IndexTermCount |
TermInfo |
同tis |
|
TermIndice->IndexDelta |
IndexTermCount |
VLong |
用来确定该Term的TermInfo在.tis文件中的位置,特别指出,它是该term的数据的位置与前一个term位置的差值。 |
结构如下图所示:
http://www.cnblogs.com/eaglet/archive/2009/02/13/1390052.html
相关推荐
标题中的".NET Lucene 源代码"表明我们将探讨的是如何在.NET环境下利用Lucene进行搜索引擎的开发,并且会涉及到源代码层面的解析。描述中提到的“简单易用”,揭示了Lucene的核心特性之一,即它对开发者友好,易于...
《Lucene源代码剖析》是一本深度探讨Java版本Lucene搜索引擎库的专业书籍。Lucene是Apache软件基金会的一个开源项目,广泛应用于全文检索和信息检索领域。本书旨在通过深入解析其源代码,帮助开发者理解Lucene的工作...
源码目录(src)是Luke的核心部分,包含了所有Java源代码,这些代码负责解析、显示和解释Lucene索引。通过阅读和研究源码,我们可以了解到Luke如何读取索引段、字段和文档,以及如何展示这些信息。例如,Luke提供了...
《Lucene-2.3.1 源代码阅读学习》 Lucene是Apache软件基金会的一个开放源码项目,它是一个高性能、全文本搜索库,为开发者提供了在Java应用程序中实现全文检索功能的基础架构。本篇文章将深入探讨Lucene 2.3.1版本...
- 通过阅读源代码,可以理解Lucene的内部工作原理,如如何构建索引、执行查询等。 - 分析器部分的源码有助于了解文本预处理过程,包括分词、去除停用词等。 - 探究查询解析器的实现,掌握如何将自然语言转化为...
《深入理解Luke:Lucene索引查看工具的源代码解析》 Luke,作为一个开源的Lucene索引浏览器,为开发者提供了直接查看和分析Lucene索引的能力。它不仅是一个强大的工具,也是学习Lucene索引机制的重要途径。通过阅读...
《深入剖析Lucene.NET:基于源代码的实例解析》 Lucene.NET,作为Apache Lucene的.NET版本,是一个高性能、全文检索库,为.NET开发者提供了强大的文本搜索功能。本实例将带您深入理解Lucene.NET的内部机制,通过源...
2. 索引过程:Lucene的索引过程包括分析(Analyzer)、术语文档表(Term Document Matrix)生成和倒排索引(Inverted Index)的构建。分析阶段将输入文本拆分成有意义的单元——术语,然后创建术语文档表,最后构建...
2. **分析器(Analyzer)**:在建立索引之前,CLucene会使用分析器对输入的文本进行预处理。分析器负责分词、去除停用词、词形还原等任务,以确保索引的质量。CLucene和CLucene都支持自定义分析器,可以根据具体需求...
通过阅读和分析源代码,我们可以学习到如何操作Lucene索引,以及如何构建类似的工具。 总结而言,luke作为Lucene索引的可视化工具,极大地便利了开发者对索引的理解和调试。无论是初学者还是经验丰富的开发人员,都...
这个源代码版本代表了Lucene 3.x系列的最后一个稳定版本,为开发者提供了深入理解Lucene内部机制的宝贵资源。下面将详细探讨Lucene 3.6.2中的关键知识点。 1. **分词器(Tokenizers)**: Lucene的核心功能之一是...
由于描述中提到“已编译,不含源代码”,这意味着提供的文件是编译后的二进制版本,用户可以直接在.NET环境中使用,而无需自行编译源代码。 Lucene.Net的核心功能包括: 1. **全文检索**:Lucene.Net支持对文本...
1. **Lucene概述**: Lucene是Apache软件基金会的一个开放源代码项目,它是Java语言编写的信息检索库。它提供了高级的索引和搜索功能,支持分词、布尔运算、短语搜索、近似搜索等多种搜索模式。 2. **Lucene核心组件...
《深入理解Lucene 3.0.1:库与源代码解析》 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。这个“lucene-3.0.1”版本代表了Lucene在2009年的一个重要里程碑,它提供了强大的文本检索功能,被广泛...
《Apache Lucene 2.9.4源代码解析》 Apache Lucene是一个开源全文搜索引擎库,由Java编写,被广泛应用于各种搜索应用中...无论是对搜索技术的探索,还是在实际项目中的应用,深入研究Lucene源代码都能带来极大的收益。
Lucene 4.2.1是这个库的一个版本,它包含了源代码,允许开发者深入理解其工作原理,并根据需要进行定制和扩展。 在Lucene 4.2.1中,你可以找到以下关键知识点: 1. **索引构建**:Lucene的核心功能之一是能够高效...
2. **内存与磁盘管理**:合理配置Directory类型,如内存目录用于小规模索引,而文件系统目录适用于大规模数据。 3. **并发控制**:在多线程环境下,正确管理和同步IndexWriter和IndexReader。 4. **缓存策略**:利用...
《深入剖析Lucene 2.0.0搜索引擎源代码》 Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。它提供了一个高效、可扩展的信息检索库,允许开发者轻松地在他们的应用程序中添加全文搜索功能。本文将重点...