关于全文检索的归并的算法总结:
最近搜集了不少全文检索的资料,林林总总,各色各异,有
IR
的基本知识,有开源软件的介绍,等等。但是最吸引我的还是索引的动态维护,毕竟现在是个信息大爆炸的时代,高性能的索引动态维护已经成为时代的需要。
今天对全文检索的归并算法进行了总结,自成一言,可能对,也可能理解的有差别,还希望大家提出宝贵的意见,还希望各位大“家”海涵。在这里,我先谢过了!
我理解现在的归并面临的最紧迫要解决的问题就是避免出现“
15M
和
15G
归并”的情况,所有的归并的算法都是围绕这样一种情况进行的。请注意,我在这篇文章里会多次出现“
15M
和
15G
归并”这几个字眼,我相信对全文检索深入了解的人都能明白我的意思。
在
IR
发展的初期出现的归并,我称为三角形归并。
第一类:三角形归并
为什么称为三角形归并呢?就是因为最终都归并成一个文件,永远不会出现
2
个文件的情况。
1.立即归并
这种情况下,比较坏的地方就是多次归并以后就会出现类似
15M
和
15G
归并的情况。
归并树的情况如图:黑色或灰色的代表由于内存不够写到硬盘的临时文件,白色的表示归并的过程中生成的临时文件,紫色的代表经过归并最终产生的索引文件。

2.立即归并的改进,
就是暂不归并,等到所有的临时文件都产生了以后采用
2
路或
3
路归并。图中以
2
路归并为例。

这种方法比立即归并要好一些,因为在这种归并的情况下基本能保证参与一次归并的
2
路或
3
路的大小大致相同,从图中,我们已经看到出现了不同大小的归并。
最新研究出来的也是比较流行的归并算法大都是梯形的归并方法:
第二类:梯形归并法
为什么叫做梯形的归并法呢?是因为归并的最终结果会出现一个最高的和一些中等的索引文件,形状就象是梯形,而且是不规则的梯形。

1.几何归并(Geometric Partition)
请注意我的翻译不准确,因为这是字眼。
Leter
提出了几何归并,他引入了一个参数
r(r =2 or r =3)
算法的大体思想是这样的:
如果内存中能存储的实际索引的大小为
b,
则第
k partition
不能超过
。

则第
k partition
要么为空,要么至少
为
。

当第
k partition
多于

时将会被归并并放到相应的
partition.
这种算法的特别之处就是第一次考虑到归并的文件大小,是具有跨时代的意义。
2.逻辑归并(index generation)
Butcher and Clarlce
提出了逻辑归并。
有内存直接产生的为
generation 0,
如果每产生一个文件,有相同的
generation,
比如
r ,
就进行归并,生成的新的文件为
generation: r+1;
3.DBT(Dynamic Balancing Tree)
归并的性能和几何归并、逻辑归并的性能相当,这种动态平衡树的进步之处就是考虑到在归并的时候将已经标志删除的文档的索引信息删除,并且提出在删除之后根据文件的大小来决定是否降级的思想,更加避免了“
15M
和
15G
归并”的情况。但是在每次归并一个
term
的时候,判断这个
term
是否属于已经删除的文档,也是一笔不小的开销,另外参数的设定还需要大费苦心,也是其缺点所在。
各种归并的比较
逻辑归并从算法上类似于
2
路归并,在某种情况下可以达到和立即归并的改进
2
路归并相同的性能,比如需要归并的文件数目可以形成一个完整的二叉树的时候。但是在其他情况下要比立即归并的改进
2
路归并有更好的性能,避免了“
15M
和
15G
归并”的情况。
逻辑归并弊端和改进:
当然也可以对这个算法进行改进,改成
3
路归并(暂时称为逻辑
3
路归并,以前的叫做逻辑
2
路归并,当然这是我自己起的名字,嘿嘿,为了好区分嘛),就是如果有
3
个同样的
generation
时再进行归并,比逻辑
2
路归并在归并速度上要好一些。
在索引的动态维护时,逻辑归并就会出现弊端,因为每次增量索引的文件可大可小,由于归并的时候只考虑
generation
,没有考虑文件的大小,所以就会可能出现“
15M
和
15G
归并”的情况,所以这种算法只适用于对一个非常大的数据量第一次建立索引的时候使用(即每次由于内存用完写到硬盘的索引文件的大小大致相同的情况)。而不太适用索引的动态维护,当然也可以改进一下,在归并以后可以根据文件的大小重新定位一次
generation,
当然这样的难度也会增大。
在这方面几何归并的性能就会好一些,如果每次由于内存用完而写到硬盘的索引文件的大小相同的时候,那么几何归并类似于
r
路归并,当所有的文件写到硬盘的个数满足一个满
r
树时,几何归并和
r
路归并有相同的性能,其他情况下要明显好于
r
路归并。由于几何归并也没有告诉归并的时候采用几路归并,所以尽量采用
3
路或
3
路以上归并。其中的参数
r
有几路的意思,但不完全是,其中的含义还需自己细细体会啊。几何归并第一次将归并和文件的大小联系了起来,所以在动态维护方面有很好的性能,但是缺点就是没有考虑对已经删除文档的索引的碎片回收。故可以在此基础上进行改进在归并的同时进行回收,或者单独进行一次碎片的回收,都是不错的选择。
DBT
算法是一种类哈夫曼归并算法,先根据文件的大小放到不同的层次上,对文件的动态性提供了很好的性能,非常适用于一个动态的环境,但是它的算法实现起来有些复杂,还有一些参数的选择上有些难度,不太容易理解,而且性能上没有实现跨越性的提高。最大的进步就是将删除文档的碎片整理考虑了进来。
小结
这是我个人对这些归并算法的一点理解,由于各个系统的文件结构,组织形式差异很大,严格的说谁好谁不好都不太合适,也显的不尊重老一辈科学家研究多年研究出来的劳动成果。我一直也想在这方面有所突破,但是现在还是没有拿出一套有效的方案来,只能每天对着屏幕发呆,呆着呆着就动手小改,我应该算得上是个“熟练的工人”,哈哈,这是我的师傅
manesking
提出的程序员的几个境界:
1.
菜鸟,
2.
熟练工人,
3.
艺术家,
4.
魔术师,
5.
大师,
6.
宗师,
7.
神,我觉得非常有道理,所以写出来和大家一起分享。