上一回,我们讲了信息检索系统的基本原理,并且做了一个简单的信息检索系统。可以看出,索引的建立是非常重要的。也是我再三提到索引的原因。这一回,我们来一次深刻的剖析,究竟索引有哪些奥秘呢?
在讲之前,我们引进一个新的名词“Segment”。每个Segment代表着Lucene的一个完整的索引片段(即它记录了关键字在什么位置的什么文件的第几行中,诸如此类)。通常,在一个索引中,有多个Segment,每个Segment都会有统一的前缀。这个前缀是根据当前索引的Document的数量而确定的。前缀名是Document数量转成36进制后,在前面加上下划线“_”而成。我们可以在自己的索引所在文件夹里看到这些命名。
索引建立的过程基本上可以归纳为一下几个动作。
利用Lucene的索引工具IndexWriter创建一个DocumentWriter对象,并为Segment命名,接着用DocumentWriter对象向文件中添加文档(addDocument())。最后将Segment的信息保存,如果有多个Segment则判断是否需要合并,如果需要则合并。在Lucene中,IndexWriter的主要职责是向索引中加入文档,而索引的写入过程是DocumentWriter来是实现的。其中最为繁琐的是对数据源进行分词、计算出现频率(即表示关键词的重要性)和位置、以及写入索引的过程。
本来想一口气写完的,但却发现,要想深入了解Lucene的索引原理,还需要更加详细的说明,如:IndexWriter的工作机制,DocumentWriter的原理,如何分词,如何写入索引等等。以上只是索引建立的过程概述。