lucene.net 学习二——索引的文件结构分析
用的lucene.net的版本为2.9.4,lucene.net提供的API很强大,建个索引很方便,但是如果能搞清楚索引的文件结构,会对深入理解有帮助。先写个简单的建索引的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Lucene.Net.Index;
using Lucene.Net.Store;
using Lucene.Net.Util;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
namespace TestIndex
{
class Program
{
static void Main(string[] args)
{
//构造索引存放的路径
Lucene.Net.Store.Directory indexDir = FSDirectory.Open(new DirectoryInfo(@"F:\lucene_index"));
//构造一个索引写操作的类,第一个参数为索引存放的路径,第二个参数为对输入的数据源进行分词等处理类实例,
//第三个参数为true表示会删掉原有的索引,从新建索引,第四个参数表示某个域对于不的数据源分词后最大的词条数目
IndexWriter IW = new IndexWriter(indexDir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true,new IndexWriter.MaxFieldLength(10000));
//设置为多文件索引的格式,默认情况下为true,会建立复合索引的文件结构,这里为了分析,先设置为false,生成多文件的索引结构
IW.SetUseCompoundFile(false);
//创建第一个文档
Document doc1 = new Document();
//构造一个域信息,第三个参数为存储该域,第四个参数的意思是域所对应的数据源分词并索引
Field bookname1 = new Field("bookname1", "笑傲江湖", Field.Store.YES, Field.Index.ANALYZED);
doc1.Add(bookname1);//向文档中添加域
//创建第二个文档
Document doc2 = new Document();
Field bookname2 = new Field("bookname2", "天龙八部", Field.Store.YES, Field.Index.ANALYZED);
doc1.Add(bookname2);
//将文档写入索引中
IW.AddDocument(doc1);
IW.AddDocument(doc2);
//关闭索引写入,一定要记得,否则会写不进去
IW.Close();
}
}
}
编译运行后得到文件结构图如下:
为了便于对索引的管理,lucene对索引按段(segment)来组织。一个索引可能由许多段(segment)组成,每个segment又包含一定数量的Docment,上面的这个例子中只有一个段,每个segment的前缀是相同的.
_0.fnm文件包含了此segment中所有Document的所有Filed的名称。
_0.fdt用于存储具有Store.YES属性的Field的数据。.fdx用于存储Document在.fdt中的位置。
.tis文件用于存储分词后的词条(Term),.tii表明了每个.tis文件中的词条的位置。
.frq表示词条在文档中的频率,.prx表示词条在文档中的位置。
上面的多文件结构的索引,需要打开较多的文件句柄,消耗了跟多的计算机资源,因此建立一个复合结构的索引往往效率较高。建立复合结构的索引只需要将上面的代码中的
IW.SetUseCompoundFile(false);注释掉即可,因为lucene.net本身默认是复合结构索引。修该后运行结果如下图所示:
生成了一个.cfs的复合文件。
倒排索引的结构图如下: