【Lucene3.0 初窥】索引文件格式(2):文件结构

系统 1351 0

Lucene使用文件扩展名标识不同的索引文件。如.fnm文件存储域Fields名称及其属性,.fdt存储文档各项域数据,.fdx存储文档在fdt中的偏移位置即其索引文件,.frq存储文档中term位置数 据,.tii文件存储term字典,.tis文件存储term频率数据,.prx存储term接近度数据,.nrm存储调节因子数据,另外 segments_X文件存储当前最新索引片段的信息,其中X为其最新修改版本,segments.gen存储当前版本即X值。

 

本系列文章将详细介绍的这些文件的数据存储细节。下面的图描述了一个典型的lucene索引文件列表:

它们的关系图则如下所示:

 

 

其中, Segments是一个比较特殊的结构:

  • 一个索引可以包含多个段,段与段之间是独立的,添加新文档可以生成新的段,不同的段可以合并。
  • 如上图,具有相同前缀文件的属同一个段,图中共两个段 "_0" 和 "_1"。
  • segments.gen和segments_5是段的元数据文件,也即它们保存了段的属性信息

 

 

《索引文件格式》专题用例

 

在后面详细介绍每个索引文件的时候,都会使用一个例子中的数据进行分析。而这个例子就是《 索引创建(5):索引数据池及内存数据细节 》中在内存中所建立好的那个倒排索引的例子。这里再次详细说明一下,后面将不再对这个例子做出说明:


 

(1)待索引文件集合一共四篇文档,分别是

文档名

文档路径 文档内容
lucene 1 E:\实验\content\lucene 1.txt lucene lucene lucene lucene lucene term .
lucene 2 E:\实验\content\lucene 2.txt lucene lucene lucene lucene lucene term term.
lucene 3 E:\实验\content\lucene 3.txt term term term lucene lucene lucene lucene lucene.
lucene 4 E:\实验\content\lucene 4.txt term

 

(2)内存源数据组织形式(Document/Fields) 参见《 索引创建(1):IndexWriter索引器 》中的索引创建代码:

Java代码
  1. for  (每个文本文件) {       
  2.           //Lucene的文档结构     
  3.          Document doc =  new  Document();                         
  4.           //文件名称,可查询,不分词     
  5.          String fileName=file.getName().substring( 0 ,file.getName().indexOf( "." ));    
  6.          doc.add( new  Field( "name" ,fileName, Field.Store.YES, Field.Index.NOT_ANALYZED));      
  7.            //文件路径,可查询,不分词     
  8.          String filePath=file.getPath();    
  9.          doc.add( new  Field( "path" , filePath, Field.Store.YES, Field.Index.NOT_ANALYZED));    
  10.          //文件内容,需要检索     
  11.          doc.add( new  Field( "content" new  FileReader(file)));                
  12.           //使用索引器对Document文档建索引     
  13.         standardWriter.addDocument(doc);      
  14. }     
    for (每个文本文件) {     
         //Lucene的文档结构  
         Document doc = new Document();                       
         //文件名称,可查询,不分词  
         String fileName=file.getName().substring(0,file.getName().indexOf("."));  
         doc.add(new Field("name",fileName, Field.Store.YES, Field.Index.NOT_ANALYZED));    
          //文件路径,可查询,不分词  
         String filePath=file.getPath();  
         doc.add(new Field("path", filePath, Field.Store.YES, Field.Index.NOT_ANALYZED));  
        //文件内容,需要检索  
         doc.add(new Field("content", new FileReader(file)));              
         //使用索引器对Document文档建索引  
        standardWriter.addDocument(doc);    
}   
  

这样,其数据源在Lucene的内存结构Document, Field表示如下:

 

真实文档名

Document对象
lucene 1 doc1
lucene 2 doc2
lucene 3 doc3
lucene 4 doc4

 

每个document包含的Field信息如下(以doc1举例):

域名 域数据值

是否被索引

(Indexed)

是否被存储

(Stored)

Field1 "name" "lucene 1"
     Y         N
Field2 "path" "E:\实验\content\lucene 1.txt"
     Y         N
Field3 "content" lucene lucene lucene lucene lucene term .      Y         N

 

(3)内存索引表的结构如:《 索引创建 (5):索引数据池及内存数据细节 》中所述。

【Lucene3.0 初窥】索引文件格式(2):文件结构总体框架


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论