今天起开始深入分析Lucene 3的索引结构。那就从最初步的段索引开始搞吧。
1. 建立索引
开始分析之前必须要创建索引,这里图省事啦,也没有去网上找什么文档集。直接拿lucene的doc来索引的,这是一堆html的文件,

这里只索引了文件的路径、最后修改时间和内容。
doc.add(new Field( "path", f.getPath(), Field.Store.YES, Field.Index.NOT_ANALYZED ));
doc.add(new Field("modified",
DateTools. timeToString(f.lastModified(), DateTools.Resolution.MINUTE ),
Field.Store. YES, Field.Index. NOT_ANALYZED));
BufferedReader br = new BufferedReader(read);
doc.add(new Field("contents", br));
2.索引文件
经过索引之后得到的文件如下。

在建索引的程序中,必须要调用
writer.setUseCompoundFile( false);
否则只能得到segment文件和.cfs文件。
.cfs文件实际上是一个虚拟文件,它将.fdt,.fdx,.fnm,frq,.nrm,.prx,.tii,.tis等等文件打包成了一个单一文件。
因为随着系统的不断运行,索引文件会越变越多,需要同时打开多个文件句柄,在一些文件系统中会导致文件句柄不够用,而打包成复合文件后,可以缓解这种情况。
这是官方文档对.cfs文件的解释," An optional "virtual" file consisting of all the other index files for systems that frequently run out of file handles. "
为了方便分析,这里将默认生成复合文件关闭。
3.segments.gen文件分析
3.1 作用
要说清楚segments.gen的作用,就必须先说Lucene是怎么在多个segments_N中进行选择的。