`

【Lucene3.0 初窥】索引文件格式(3):Field数据[.fdx/.fdt/.fnm]

阅读更多

注意:以下文章是参见http://lucene.apache.org/java/3_0_1/fileformats.html#Fields 和实践中读取文件内容概括总结出来的。

 

Fields数据磁盘文件存储细节

 

Lucene 的数据域在内存中组织成Document和Field数据结构。每次建立索引的Document对象都可能拥有不同的Fields,而查询的时候,也可以通过查询词找到文档的相关Fields信息(这些Fields在创建的时候必须是Field.Store.YES )。这些Fields信息存储在后缀名为.fdx/.fdt/.fnm的磁盘文件中。

 

★ .fnm   域名存储文件

 

     FieldInfos (.fnm) --> FNMVersion,FieldsCount, <FieldName, FieldBits> FieldsCount

     FNMVersion  --> VInt   域版本号(Lucene2.9新加的)

     FieldsCount  --> VInt   域的数量

     FieldName --> String   域名

     FieldBits --> Byte  域状态标志位

 

     每个域的8位FieldBits记录了这个域的标志信息。我们从最低位开始,详细阐述一下这些标志位(其实大部分已经在《Document/Fields》阐述过了):

(1) No.1 bit:1表示此域被索引,0则不被索引。所谓被索引,也就是需要将这个域的值加入倒排索引表中去。

      * Field.Index.NO则表示不被索引。
      * Field.Index.ANALYZED则表示不但被索引,而且被分词。比如索引"hello world"后,无论是搜"hello",还是搜"world"都能够被搜到。
      * Field.Index.NOT_ANALYZED表示虽然被索引,但是不分词。比如索引"hello world"后,仅当搜"hello world"时,能够搜到,搜"hello"和搜"world"都搜不到。  
     

      域还有一个标志来设定此域的值是否要被存储。
      * Field.Store.Yes则表示存储此域,Field.Store.NO则表示不存储此域。
     

       索引域(indexed)和存储域(Stored)的区别
      * 建立索引的域可以将域值作为query来进行搜索。Lucene中建立索引的域如果不被存储,是不会将其域数据内容存放在.fdt文件中的,但其索引表会存放在另外的文件中。

      * 只存储而不建立索引的域则不能通过键入query来搜索,但是可以通过其他Indexed域的搜索来得到相应的Stored域的信息。
      很明显,这样区分是有意义的。在现实文档中的所有信息中,有这样一部分信息,是不太适合作为查询关键词,但是有必须被搜索出来的。比如文件路径,我们可以通过查询文件名来找到该文件的路径,但是谁也不会通过完整的文件路径去检索文件名吧?

 

(2) No.2 bit:1表示保存词向量,0为不保存词向量。
      * Field.TermVector.YES表示保存词向量。
      * Field.TermVector.NO表示不保存词向量。

(3) No.3 bit:1表示在词向量中保存位置信息。
      * Field.TermVector.WITH_POSITIONS

(4) No.4 bit:1表示在词向量中保存偏移量信息。
      * Field.TermVector.WITH_OFFSETS

(5) No.5 bit:1表示不保存标准化因子
      * Field.Index.ANALYZED_NO_NORMS
      * Field.Index.NOT_ANALYZED_NO_NORMS
(6) No.6 bit:标志是否保存Payload。

 

 

 

 

★ .fdx 域数据索引文件    .fdt 域数据文件

 

1、fdx 用于查找指定document的所有fields在.fdt文件中的位置,因为它包含的是固定长度的数据,因此这个文件可以很容易地进行随机访问。
     
   FieldIndex (.fdx) --> DocFieldCount  <FieldValuesPosition> SegSize

   DocFieldCount --> UInt32   记录单个document存储的域的个数

   FieldValuesPosition  -->  UInt64  记录当前document的域数据在.fdt文件中的偏移位置。

   SegSize 指当前段中有多少个document

 

2、fdt 存放域的数据值。注意:fdt中只存放那些需要被存储(Stored)的域数据,而不被存储的(Stored)域是不存放在这里面的。下面有一个实例会详细解释这一点。

 

    FieldIndex (.fdt) -->  DocFieldCount  <DocFieldData> SegSize

 

    DocFieldData --> FieldCount, <FieldNum, Bits, Value> FieldCount

    FieldCount --> VInt    当前document包含的域的个数

    FieldNum --> VInt   当前域号

    Bits --> Byte 记录域的标志位 (下面从低位开始)

 

    (1) No.1 bit: 1 表示分词后的field 0 表示 没有分词的field

    (2) No.2 bit: 域包含二进制数据

    (3) No.3 bit: 表示该 field 的压缩选项被开启 ,如果压缩选项开启,采用的压缩算法 ZLIB。

 

    Value --> String  当前域的数据值

 

 

 

★  专题用例 :

 

关于例子的详细信息参见《索引文件格式(2):文件结构总体框架 》最后的说明。

 


(1) 解释一下fnm文件中的数据

前五个字节(-2,-1,-1,-1,15,)表示fnm文件的版本号(粉红色区域)。上面我们提到了FNMVersion是VInt类型,而VInt类型是可变类型,我们怎么知道FNMVersion有5个字节呢。

   在《索引文件格式(1):基础知识 》我们讲到了VInt类型每个Byte的最高位是不表示数值的,而表示后面是否还有一个字节。显然第1个byte=-2的最高位为1,后面有一个字节。知道第5个byte=15的最高位为0,因此后面没有字节了。则FNMVersion就用5个字节表示的,值为:(-2,-1,-1,-1,15,)

绿色区域的3表示Field的数量。该实例确实只有3个Fields:name、path、content。

浅蓝色部分就是这三个Fields的名字。拿其中一个来说明:(4,110,97,109,101,1)。在上面我们已经讲到了每个域名数据都有两部分构成<FieldName, FieldBits>。

    先说说FieldName,它是一个String类型。在《索引文件格式(1):基础知识 》中我们讲到String由一个VInt来表示字符的数量,而后面的Chars分别用UTF-8编码每个字符。显然(4,110,97,109,101,)中的第一个4表示后面有4个字符,分别是110('n'),97('a'),109('m'),101('e')。

    再说说FieldBits,在这里实例中最后一个字节byte=1表示这个数据。说明标志位的最低bit=1,而其他bit=0。因此说明"name"域是需要索引的域(Indexed)。

 

 

(2) 解释一下fdx文件中的数据

  前4个字节(0,0,0,2)表示单个Document存储于多少个域,UInt32类型说明是固定4个字节大小。但是有个疑问了,在这个实例中,Document明明有3个Field,为什么这个值是2呢。原因就是第三个Field("content")的Stored is false。这个域是要分词并建立倒排索引的,但并不存储在.fdx和.fdt中。

  后面每8个字节(UInt64类型)表示一个数据项。其数据值表示该Document的域数据值在.fdt文件中的存储位置。比如第一项(0,0,0,0,0,0,0,4)表示doc1中要存储的两个域(name和path)从.fdt数据中的第4个字节开始,到下一项(0,0,0,0,0,0,0,49)第49个字节为止。

 

 

(3) 解释一下fdt文件中的数据

◆  前4个字节(0,0,0,2)和上面fdx文件一样。

◆  后面正好有4个DocFieldData,记录了每个Document对象的name和path域的内容值。上面也讲到了Document有3个域,为什么content不存储进来呢。content是文档内容,远比name,path域的内容大的多。如果都想这样存储进fdt数据的话,这个文件将无比庞大。另外,content内容提供了查询倒排索引文件的关键字,我们在实际应用中,通过content中的词可以查询到包含此词的文档的path,也就能够进一步读取文档内容。没有必要再去存储一遍全部的原文档内容。这也就是为什么在建立索引的时候content域的Stored=false的原因了。

 

 

5
0
分享到:
评论

相关推荐

    lucene索引文件格式介绍

    这方面的信息存储在各种文件中,如segments_N(段信息),fnm(域名和索引方式),fdx/fdt(文档域信息),tvx/tvd/tvf(Term Vector信息,包含词频、位置等)。 反向信息(Inverted Index)则提供了从词到文档的...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-04.Lucene索引深入 共24页.pptx

    每个文档的Field Data的地址和实际数据分别存储在.fdx和.fdt文件中,这允许快速访问存储的字段。 5. **Term Dictionary**:.tim文件是Term Dictionary,存储了所有唯一的词元(Term)及其对应的文档频率、位置等...

    lucene 入门整理

    2. **`.fdt`与`.fdx`**:`.fdt`用于保存具有`Store.YES`属性的字段数据,`.fdx`则是`.fdt`的索引,指示每个`Document`在`.fdt`文件中的位置。 3. **`.tis`与`.tii`**:`.tis`存储分词后的词条信息,`.tii`作为`.tis...

    Annotated Lucene 中文版 Lucene源码剖析

    - 每个Lucene索引都由一组特定格式的文件构成,这些文件共同构成了完整的索引数据。 - **每个Index包含的文件**: - **Segments文件**:记录了当前索引中的所有片段信息,包括每个片段的状态、大小等。 - **Lock...

    Lucene-7.5.0:Lucene 7.5.0 8.4.0 8.6.0 8.7.0 8.8.0

    文章导航   每篇文章的标题如果没有标明版本号,说明...6. 索引文件之fdx&&fdt 7. 索引文件之tvx&&tvd 8. 索引文件之liv 9. 索引文件之dim&&dii 10. 索引文件之tim&&tip 11. 索引文件之doc 12. 索引文件之pos&&pay 13

    Lucene 原理与代码分析完整版.pdf

    - **域(Field)的数据信息(.fdt,.fdx)**:存储实际的文档数据。 - **词向量(TermVector)的数据信息(.tvx,.tvd,.tvf)**:包含词项在文档中的位置信息。 #### 四、Lucene索引过程分析 创建索引的过程涉及多个阶段:...

    lucene个人总结

    - **fdt** 和 **fdx**:.fdt文件用于存储具有Store.YES属性的Field的数据;.fdx是一个索引,用于存储Document在.fdt中的位置。 - **tis** 和 **tii**:.tis文件用于存储分词后的词条(Term),而.tii就是它的索引...

    Lucene_原理与代码分析完整版

    - **字段数据文件**(.fdt、.fdx):存储字段的具体内容。 - **词向量文件**(.tvx、.tvd、.tvf):保存每个文档的词频和位置信息。 - **词典文件**(tis)和词典索引文件(tii):包含词汇表及其索引信息。 - **...

    lucene学习资料

    #### 三、Lucene的索引文件格式 Lucene的索引文件采用了特殊的格式以提高性能。主要包括以下几部分: 1. **基本概念**:理解索引文件的基础概念,如字段、段等。 2. **基本类型**:定义索引文件中使用的数据类型。...

    lucene学习

    索引由多个文件组成,如 segments、.del、.fdt、.fdx、.fnm、.tii 和 .tim 等,它们分别存储不同的信息,如文档字段、词典、位图信息等。索引文件的组织方式确保了高效的数据访问和更新。 接下来,我们要深入...

    JAVA Swing UI 学生信息+计算器

    - _0.fdt:字段数据文件,存储了文档中每个字段的值。 - _0.fdx:文件文档索引,记录了文档的起始位置。 - _0.fnm:字段名文件,存储了字段的名称。 - _0.frq:频率文件,记录了每个词在文档中的出现次数。 - ...

    文件单字符搜索

    1. **_0.fdt、_0.fdx**:这是Lucene的文档字段数据和字段索引,它们用于快速访问文档中的特定字段。 2. **_0.fnm**:字段名文件,存储了字段的名称及其对应的编号。 3. **_0.frq**:频率文件,记录了每个词在文档中...

    lucene原理分析

    ### Lucene原理分析 #### 一、Lucene概述与核心组件 **Lucene**是一款高性能、全功能的全文搜索引擎库,由Java编写而成。它能够为应用系统提供强大的搜索功能,而无需开发者深入理解信息检索理论。Lucene的核心...

    lucene自学

    - `_0.fdt`/`_0.fdx`:分别存储非规范化后的字段值和字段值的偏移量。 - `_0.frq`:存储文档频率和位置信息,用于计算相关性评分。 - `_0.nrm`:存储规范化因子信息,用于计算相关性评分时对文档长度的调整。 - ...

    Eclipse开发分布式商城系统+完整视频代码及文档

    索引库导入数据-完成.avi │ 淘淘商城第七天笔记.doc │ ├─08.第八天 │ 14.搜索服务切换到集群.avi │ 01.课程计划.avi │ 02.课程计划.avi │ 03.搜索服务-分析.avi │ 04.搜索服务-dao层.avi │ 05.搜索服务-...

    布局管理器

    在提供的文件列表中,我们看到的文件扩展名如.fdt、.fdx、.fnm、.frq、.gen、.nrm、.prx、.tii和.tis等,这些通常是Lucene搜索引擎索引的文件。Lucene是一个全文检索库,它并不直接涉及GUI布局管理,但可以理解为...

Global site tag (gtag.js) - Google Analytics