`
wbj0110
  • 浏览: 1552226 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Lucene 源代码剖析-3 索引文件结构(2)

阅读更多

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表示是被索引的Fields0表示非索引的Fields

 

第二个最低阶的bit位(second lowest-order bit)值为1表示该Fieldterm向量存储(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

      

存储的fieldsstored fields)通过两个文件来呈现(represented by two files),即field索引文件(.fdx)和field数据文件(.fdt)。                                            

文件

包含的项

父项

数目

类型

版本

描述

Fields Index(.fdx) 对每个文档来说,存储指向它的fields数据的指针(pointer

FieldValuesPosition

 

SegSize

UInt64

 

用于找详细文档(a particular document)的所有fieldsfield数据文件中的位置(position),因为它包含的(contains)是固定长度的数据(fixed-length data),这个文件可以很容易地进行随机访问(randomly accessed)。

 

文档nfield数据的位置是在该文件中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

第二个bitsecond bit)用于表示该field存储binary数据。

>=1.9

第三个bitthird 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值为2suffix值为“y

Term->Suffix

TermCount

String

如上

Term->FieldNum

TermCount

VInt

用来确定termfield,它们存储在.fdt文件中。

TermInfo->DocFreq

TermCount

VInt

包含该term的文档数目

TermInfo->FreqDelta

TermCount

VInt

用来确定包含在.frq文件中该termTermFreqs的位置。特别指出,它是该term的数据在文件中位置与前一个term的位置的差值,当为第一个term时,该值为0

TermInfo->ProxDelta

TermCount

VInt

用来确定包含在.prx文件中该termTermPositions的位置。特别指出,它是该term的数据在文件中的位置与前一个term的位置地差值,当为第一个term时,该值为0。如果fieldsomitTF设置为true,该值也为0,因为prox信息没有被存储。

TermInfo->SkipDelta

TermCount

VInt

用来确定包含在.frq文件中该termSkipData的位置。特别指出,它是TermFreqs之后即SkipData开始的字节数目,换句话说,它是TermFreq的长度。SkipDelta只有在DocFreq不比SkipInteval小的情况下才会存储。

        

TermInfoFile文件按照Term来排序,排序方法首先按照Termfield名称(按照UTF-16字符编码)排序,然后按照TermText字符串(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),用来加速(accelerableTermDocs.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

用来确定该TermTermInfo.tis文件中的位置,特别指出,它是该term的数据的位置与前一个term位置的差值。

           

结构如下图所示: 

   

 

 

 

http://www.cnblogs.com/eaglet/archive/2009/02/13/1390052.html

分享到:
评论

相关推荐

    lucene-core-3.4.0.jar

    Lucene是apache软件基金会项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene...

    基于lucene的词频分析源代码

    lucene自带的词频分析功能,该源代码流程为:先从数据库中读取数据,写入TXT文本中,使用lucene进行索引,然后得出词频分析结果。

    lucene-core-3.6.0.jar.zip

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    开放源代码的全文检索引擎Lucene

    Lucene是apache软件基金会[4] jakarta项目组的一个子项目,是一个开放源代码[5]的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析...

    lucene-3.4.0-src.tgz

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    Lucenecore3-2

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    lucene-core-4.10.2

    Lucene 是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    lucene-highlighter-8.0.0.jar

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    Lucene-in-Action

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    lucene.net-1.9 source code

    Lucene的最主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucen提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时...

    lucene3.0-lib

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    lucene-3.5.0.zip

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    Lucene4.X第九讲-Lucene搜索深入实战

    最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统...

    lucene-8.1.1.zip

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    lucene 7.1 jar包及文档

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    基于JAVA的搜索引擎 lucene-2.2.0

    在前面Lucene-2.2.0 源代码阅读学习(1)中,根据Lucene提供的一个Demo,详细分析研究一下索引器org.apache.lucene.index.IndexWriter类,看看它是如果定义的,掌握它建立索引的机制。 通过IndexWriter类的实现源代码...

    Lucene4.X 第十五讲-Lucene高级进阶

    最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统...

    lucene-5.5.5

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    lucene-3.4.0

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

Global site tag (gtag.js) - Google Analytics