`
jayghost
  • 浏览: 441698 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【转】lucene文件格式

 
阅读更多

转自:http://lianj-lee.iteye.com/blog/465121

 

索引文件格式 

本文定义了Lucene(版本1.3)用到的索引文件的格式。 
Jakarta Lucene是用Java写成的,同时有很多团体正在默默的用其他的程序语言来改写它。如果这些新的版本想和Jakarta Lucene兼容,就需要一个与具体语言无关的Lucene索引文件格式。本文正是试图提供一个完整的与语言无关的Jakarta Lucene 1.3索引文件格式的规格定义。 
随着Lucene不断发展,本文也应该更新。不同语言写成的Lucene实现版本应当尽力遵守文 
件格式,也必须产生本文的新版本。 
本文同时提供兼容性批注,描述文件格式上与前一版本不同的地方。 

定义 
Lucene中最基础的概念是索引(index),文档(document),域(field)和项(term)。 

索引包含了一个文档的序列。 
· 文档是一些域的序列。 
· 域是一些项的序列。 
· 项就是一个字串。 
存在于不同域中的同一个字串被认为是不同的项。因此项实际是用一对字串表示的,第一个字串是域名,第二个是域中的字串。 

倒排索引 
为了使得基于项的搜索更有效率,索引中项是静态存储的。Lucene的索引属于索引方式中的倒排索引,因为对于一个项这种索引可以列出包含它的文档。这刚好是文档与项自然联系的倒置。 

域的类型 
Lucene中,域的文本可能以逐字的非倒排的方式存储在索引中。而倒排过的域称为被索引过了。域也可能同时被存储和被索引。 域的文本可能被分解许多项目而被索引,或者就被用作一个项目而被索引。大多数的域是被分解过的,但是有些时候某些标识符域被当做一个项目索引是很有用的。 

段(Segment) 
Lucene索引可能由多个子索引组成,这些子索引成为段。每一段都是完整独立的索引,能被搜索。索引是这样作成的: 
1. 为新加入的文档创建新段。 
2. 合并已经存在的段。 
搜索时需要涉及到多个段和/或者多个索引,每一个索引又可能由一些段组成。 

文档号(Document Number) 
内部的来说,Lucene用一个整形(interger)的文档号来指示文档。第一个被加入到索引中的文档就是0号,顺序加入的文档将得到一个由前一个号码递增而来的号码。 注意文档号是可能改变的,所以在Lucene外部存储这些号码时必须小心。特别的,号码的 
改变的情况如下: · 只有段内的号码是相同的,不同段之间不同,因而在一个比段广泛的上下文环境中使用这些号码时,就必须改变它们。标准的技术是根据每一段号码多少为每一段分配一个段号。将段内文档号转换到段外时,加上段号。将某段外的文档号转换到段内时,根据每段中可能的转换后号码范围来判断文档属于那一段,并减调这一段的段号。例如有两个含5个文档的段合并,那么第一段的段号就是0,第二段段号5。第二段中的第三个文档,在段外的号码就是8。 · 文档删除后,连续的号码就出现了间断。这可以通过合并索引来解决,段合并时删除的文档相应也删掉了,新合并而成的段并没有号码间断。 

绪论 
索引段维护着以下的信息: 
· 域集合。包含了索引中用到的所有的域。 
· 域值存储表。每一个文档都含有一个“属性-值”对的列表,属性即为域名。这个列表用来存储文档的一些附加信息,如标题,url或者访问数据库的一个ID。在搜索时存储域的集合可以被返回。这个表以文档号标识。 
· 项字典。这个字典含有所有文档的所有域中使用过的的项,同时含有使用过它的文档的文档号,以及指向使用频数信息和位置信息的指针。 
· 项频数信息。对于项字典中的每个项,这些信息包含含有这个项的文档的总数,以及每个文档中使用的次数。 
· 项位置信息。对于项字典中的每个项,都存有在每个文档中出现的各个位置。 
· Normalization factors. For each field in each document, a value is stored that is multiplied into the score for hits on that field. 标准化因子。对于文档中的每一个域,存有一个值,用来以后乘以这个这个域的命中数(hits)。 
· 被删除的文档信息。这是一个可选文件,用来表明那些文档已经删除了。 接下来的各部分部分详细描述这些信息。 

文件的命名(File Naming) 
同属于一个段的文件拥有相同的文件名,不同的扩展名。扩展名由以下讨论的各种文件格式确定。 一般来说,一个索引存放一个目录,其所有段都存放在这个目录里,尽管我们不要求您这样做。 

基本数据类型(Primitive Types) 

Byte 
最基本的数据类型就是字节(byte,8位)。文件就是按字节顺序访问的。其它的一些数据类型也定义为字节的序列,文件的格式具有字节意义上的独立性。 

UInt32 
32位无符号整数,由四个字节组成,高位优先。 

UInt32 --> <Byte>4 
Uint64 
64位无符号整数,由八字节组成,高位优先。 

UInt64 --> <Byte>8 
VInt 
可变长的正整数类型,每字节的最高位表明还剩多少字节。每字节的低七位表明整数的值。因此单字节的值从0到127,两字节值从128到16,383,等等。 

VInt 编码示例 
Value 
First byte 
Second byte 
Third byte 


00000000 

00000001 

00000010 
... 
127 
01111111 
128 
10000000 
00000001 
129 
10000001 
00000001 
130 
10000010 
00000001 
... 
16,383 
11111111 
01111111 
16,384 
10000000 
10000000 
00000001 
16,385 
10000001 
10000000 
00000001 
... 

这种编码提供了一种在高效率解码时压缩数据的方法。 

Chars 
Lucene输出UNICODE字符序列,使用标准UTF-8编码。 

String 
Lucene输出由VINT和字符串组成的字串,VINT表示字串长,字符串紧接其后。 
String --> VInt, Chars 

索引包含的文件(Per-Index Files) 
这部分介绍每个索引包含的文件。 

Segments文件 
索引中活动的段存储在Segments文件中。每个索引只能含有一个这样的文件,名 

为"segments".这个文件依次列出每个段的名字和每个段的大小。 
Segments --> SegCount, <SegName, SegSize>SegCount 
SegCount, SegSize --> UInt32 
SegName --> String 
SegName表示该segment的名字,同时作为索引其他文件的前缀。 
SegSize是段索引中含有的文档数。 

Lock文件 
有一些文件用来表示另一个进程在使用索引。 
· 如果存在"commit.lock"文件,表示有进程在写"segments"文件和删除无用的段索引文件,或者表示有进程在读"segments"文件和打开某些段的文件。在一个进程在读取"segments"文件段信息后,还没来得及打开所有该段的文件前,这个Lock文件可以防止另一个进程删除这些文件。 
· 如果存在"index.lock"文件,表示有进程在向索引中加入文档,或者是从索引中删除文档。这个文件防止很多文件同时修改一个索引。 

Deleteable文件 
名为"deletetable"的文件包含了索引不再使用的文件的名字,这些文件可能并没有被实际的删除。这种情况只存在与Win32平台下,因为Win32下文件仍打开时并不能删除。 
Deleteable --> DelableCount, <DelableName>DelableCount 
DelableCount --> UInt32 
DelableName --> String 

段包含的文件(Per-Segment Files) 
剩下的文件是每段中包含的文件,因此由后缀来区分。 
域(Field) 
域集合信息(Field Info) 
所有域名都存储在这个文件的域集合信息中,这个文件以后缀.fnm结尾。 
FieldInfos (.fnm) --> FieldsCount, <FieldName, FieldBits>FieldsCount 
FieldsCount --> VInt 
FieldName --> String 
FieldBits --> Byte 
目前情况下,FieldBits只有使用低位,对于已索引的域值为1,对未索引的域值为0。 文件中的域根据它们的次序编号。因此域0是文件中的第一个域,域1是接下来的,等等。 

这个和文档号的编号方式相同。 
域值存储表(Stored Fields) 
域值存储表使用两个文件表示: 

1. 域索引(.fdx文件)。 
如下,对于每个文档这个文件包含指向域值的指针: 
FieldIndex (.fdx) --> <FieldValuesPosition>SegSize 
FieldValuesPosition --> Uint64 
FieldValuesPosition指示的是某一文档的某域的域值在域值文件中的位置。因为域值文件含有定长的数据信息,因而很容易随机访问。在域值文件中,文档n的域值信息就存在n*8位置处(The position of document n's field data is the Uint64 at n*8 in this file.)。 

2. 域值(.fdt文件)。 
如下,每个文档的域值信息包含: 
FieldData (.fdt) --> <DocFieldData>SegSize 
DocFieldData --> FieldCount, <FieldNum, Bits, Value>FieldCount 
FieldCount --> VInt 
FieldNum --> VInt 
Bits --> Byte 
Value --> String 
目前情况下,Bits只有低位被使用,值为1表示域名被分解过,值为0表示未分解过。 

项字典(Term Dictionary) 
项字典用以下两个文件表示: 
1. 项信息(.tis文件)。 
TermInfoFile (.tis)--> TermCount, TermInfos 
TermCount --> UInt32 
TermInfos --> <TermInfo>TermCount 
TermInfo --> <Term, DocFreq, FreqDelta, ProxDelta> 
Term --> <PrefixLength, Suffix, FieldNum> 
Suffix --> String 
PrefixLength, DocFreq, FreqDelta, ProxDelta 
--> VInt 
项信息按项排序。项信息排序时先按项所属的域的文字顺序排序,然后按照项的字串的文字顺序排序。 项的字前缀往往是共同的,与字的后缀组成字。PrefixLength变量就是表示与前一项相同的前缀的字数。因此,如果前一个项的字是"bone",后一个是"boy"的话,PrefixLength值为2,Suffix值为"y"。 

FieldNum指明了项属于的域号,而域名存储在.fdt文件中。 
DocFreg表示的是含有该项的文档的数量。 
FreqDelta指明了项所属TermFreq变量在.frq文件中的位置。详细的说,就是指相对于前一个项的数据的位置偏移量(或者是0,表示文件中第一个项)。 
ProxDelta指明了项所属的TermPosition变量在.prx文件中的位置。详细的说,就是指相对于前一个项的数据的位置偏移量(或者是0,表示文件中第一个项)。 

2. 项信息索引(.tii文件)。 
每个项信息索引文件包含.tis文件中的128个条目,依照条目在.tis文件中的顺序。这样设计是为了一次将索引信息读入内存能,然后使用它来随机的访问.tis文件。 这个文件的结构和.tis文件非常类似,只在每个条目记录上增加了一个变量IndexDelta。 
TermInfoIndex (.tii)--> IndexTermCount, TermIndices 
IndexTermCount --> UInt32 
TermIndices --> <TermInfo, IndexDelta>IndexTermCount 
IndexDelta --> VInt 
IndexDelta表示该项的TermInfo变量值在.tis文件中的位置。详细的讲,就是指相对于前 
一个条目的偏移量(或者是0,对于文件中第一个项)。 

项频数(Frequencies) 
.frq文件包含每一项的文档的列表,还有该项在对应文档中出现的频数。 
FreqFile (.frq) --> <TermFreqs>TermCount 
TermFreqs --> <TermFreq>DocFreq 
TermFreq --> DocDelta, Freq? 
DocDelta,Freq --> VInt 
TermFreqs序列按照项来排序(依据于.tis文件中的项,即项是隐含存在的)。 
TermFreq元组按照文档号升序排列。 
DocDelta决定了文档号和频数。详细的说,DocDelta/2表示相对于前一文档号的偏移量(或者是0,表示这是TermFreqs里面的第一项)。当DocDelta是奇数时表示在该文档中频数为1,当DocDelta是偶数时,另一个VInt(Freq)就表示在该文档中出现的频数。 
例如,假设某一项在文档7中出现一次,在文档11中出现了3次,在TermFreqs中就存在如下的VInts序列: 15, 22, 3 

项位置(Position) 
.prx文件包含了某文档中某项出现的位置信息的列表。 
ProxFile (.prx) --> <TermPositions>TermCount 
TermPositions --> <Positions>DocFreq 
Positions --> <PositionDelta>Freq 
PositionDelta --> VInt 
TermPositions按照项来排序(依据于.tis文件中的项,即项是隐含存在的)。 
Positions元组按照文档号升序排列。 
PositionDelta是相对于前一个出现位置的偏移位置(或者为0,表示这是第一次在这个文档中出现)。 例如,假设某一项在某文档第4项出现,在另一个文档中第5项和第9项出现,将存在如下的 
VInt序列: 4, 5, 4 

标准化因子(Normalization Factor) 
.nrm文件包含了每个文档的标准化因子,标准化因子用来以后乘以这个这个域的命中数。 
Norms (.nrm) --> <Byte>SegSize 
每个字节记录一个浮点数。位0-2包含了3位的尾数部分,位3-8包含了5位的指数部分。 
按如下规则可将这些字节转换为IEEE标准单精度浮点数: 
1. 如果该字节是0,就是浮点0; 
2. 否则,设置新浮点数的标志位为0; 
3. 将字节中的指数加上48后作为新的浮点数的指数; 
4. 将字节中的尾数映射到新浮点数尾数的高3位;并且 
5. 设置新浮点数尾数的低21位为0。 

被删除的文档(Deleted Document) 
.del文件是可选的,只有在某段中存在删除操作后才存在: 
Deletions (.del) --> ByteCount,BitCount,Bits 
ByteSize,BitCount --> Uint32 
Bits --> <Byte>ByteCount 
ByteCount表示的是Bits列表中Byte的数量。典型的,它等于(SegSize/8)+1。 
BitCount表示Bits列表中多少个已经被设置过了。 
Bits列表包含了一些位(bit),顺序表示一个文档。当对应于文档号的位被设置了,就标 
志着这个文档已经被删除了。位的顺序是从低到高。因此,如果Bits包含两个字节,0x00 
和0x02,那么表示文档9已经删除了。 

局限性(Limitations) 
在以上的文件格式中,好几处都有限制项和文档的最大个数为32位数的极限,即接近于40亿。今天看来,这不会造成问题,但是,长远的看,可能造成问题。因此,这些极限应该或者换为UInt64类型的值,或者更好的,换为VInt类型的值(VInt值没有上限)。 
有两处地方的代码要求必须是定长的值,他们是: 
1. FieldValuesPosition变量(存储于域索引文件中,.fdx文件)。它已经是一个UInt64型,所以不会有问题。 
2. TermCount变量(存储于项信息文件中,.tis文件)。这是最后输出到文件中的,但是 
最先被读取,因此是存储于文件的最前端 。索引代码先在这里写入一个0值,然后在其他 
文件输出完毕后覆盖这个值。所以无论它存储在什么地方,它都必须是一个定长的值,它 
应该被变成UInt64型。 
除此之外,所有的UInt值都可以换成VInt型以去掉限制

分享到:
评论

相关推荐

    lucene索引文件格式介绍

    索引文件格式是Lucene实现快速搜索的关键。以下是对Lucene索引文件格式的详细说明。 首先,我们要理解Lucene索引的基本结构。一个Lucene索引位于一个文件夹中,这个文件夹包含了多个段(Segment)。每个段是独立的...

    Lucene索引文件格式

    《Lucene索引文件格式详解》 Lucene,作为一款强大的全文搜索引擎库,其索引文件格式是实现高效搜索的关键。本文将深入解析Lucene 1.3版本的索引文件结构,帮助读者理解其内部运作机制。 首先,我们要理解Lucene...

    Lucene文件检索实战项目

    Lucene是用java实现的、成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件许可 [ASF, License]。同样,Lucene是当前非常流行的、免费的Java信息搜索(IR)库。Lucene从问世之后,引发了开放源...

    Lucene读取索引文件

    然而,由于Lucene的索引文件是专有的二进制格式,直接查看可能难以理解,更推荐通过Lucene的API来间接获取信息。 总之,掌握Lucene索引文件的读取是提升Lucene应用能力的关键一步。通过对索引结构、API用法以及查询...

    data.rar学习lucene需要的数据文件

    本篇文章将围绕“data.rar学习lucene需要的数据文件”这一主题,深入探讨如何利用提供的数据文件学习并掌握Lucene的核心概念和技术。 首先,我们需要了解Lucene是什么。Lucene是一个高性能、全文本搜索库,它提供了...

    基于lucene的文件管理系统

    **基于Lucene的文件管理系统详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、可扩展的搜索程序库,使得开发者能够轻松地在应用中集成全文...

    实现多种文件格式的Lucene全文搜索功能的dom实例

    本项目“实现多种文件格式的Lucene全文搜索功能的DOM实例”专注于利用Lucene来处理不同类型的文件,并且实现了搜索结果中关键词的高亮显示,类似于百度等搜索引擎的效果。 首先,我们需要理解Lucene的基本概念。...

    lucene索引查看文件

    这是Lucene3.0索引查看文件 直接运行jar包就可以打开ui界面 陪好路径就可以使用了

    基于Lucene的Lucene

    本篇文章将深入探讨如何基于Lucene开发一个文件检索系统,以及如何扩展其功能以支持多种文件格式。 ### Lucene核心概念 1. **索引(Index)**: 在Lucene中,索引是将非结构化的文本数据转换为结构化的倒排索引的...

    lucene.net 用于doc,docx,xls,xlsx,ppt,pptx,pdf等文件检索

    在描述中提到,Lucene.NET可以用于对doc、docx、xls、xlsx、ppt、pptx和pdf等多种文件格式进行检索,这意味着它可以处理这些文件中的文本内容,从而实现强大的搜索功能。 1. **文件格式支持**:Lucene.NET能够解析...

    Lucene对本地文件多目录创建索引

    标题中的“Lucene对本地文件多目录创建索引”指的是使用Apache Lucene库来构建一个搜索引擎,该搜索引擎能够索引本地计算机上的多个文件目录。Lucene是一个强大的全文搜索库,它允许开发者在Java应用程序中实现高级...

    Lucene索引文件查看工具lukeall4.7.1

    《深入理解Lucene索引文件查看工具LukeAll 4.7.1》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用在各种数据检索系统中。然而,对于开发者来说,理解并调试Lucene创建的索引文件并非易事。此时...

    Lucene中文件格式介绍

    以下是对Lucene文件格式的详细解析。 1. **Segment和Index Files** Lucene的索引被划分为多个段(Segments),每个段是一个独立的搜索单元。段是由一系列文件组成的,包括文档数据、倒排索引、字段信息等。这些...

    Lucene.Net 文件检索doc,xls,ppt,txt,pdf文件(实例)

    1. **文件预处理**: 首先,我们需要读取文件内容,可能需要使用第三方库(如iTextSharp for pdf,NPOI for office文档)来解析非文本格式的文件,提取其文本内容。 2. **创建Document对象**: 对于每个文件,创建一...

    lucene 3.6 检索文件 pdf word ppt excel txt html xml

    要开始使用Lucene进行文件检索,你需要指定两个关键目录:检索目录和索引目录。检索目录包含了需要被搜索的文件,而索引目录则用于存储生成的索引文件。通过调用提供的静态方法,可以快速完成索引的创建。这个过程...

    基于lucene的文件管理系统(完善版,含jar包)

    **基于Lucene的文件管理系统详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了索引和搜索大量文本数据的能力。在这个基于Lucene的文件管理系统中,我们利用Lucene的强大功能来组织、管理...

    Lucene 索引的简单使用

    1. **初始化Directory**:选择存储索引的目录,如FSDirectory(文件系统)、RAMDirectory(内存)等。 2. **创建IndexWriter**:配置IndexWriter实例,指定Directory、Analyzer和其他参数。 3. **创建文档**:定义...

    lucene检索文件

    在描述中提到的"lucene全文检索文件"指的是利用Lucene进行文档检索的能力,涵盖了多种文件格式,如TXT、DOC、XLS、PPT和PDF,这表明Lucene不仅限于纯文本,还能处理包含富文本和二进制数据的文档。 1. **Lucene核心...

    lucene实现文件检索Demo

    lucene实现文件检索Demo,

    lucene 对 xml建立索引

    - 在建立索引之前,需要先将XML文档转换为Lucene能够理解的数据格式。 - 本例中采用SAX解析器来进行XML文档的解析,通过重写SAX处理器类的方法(如`startDocument()`、`endDocument()`、`startElement()`等)来...

Global site tag (gtag.js) - Google Analytics