繌子 2014-12-10
背景
关系数据库不适合做全文搜索
了解倒排算法之后方便理解为什么搜索引擎非常适合做全文搜索。简单来说倒排算法就是通过关键词快速定位到文章,首先记录了很多的关键词,关键词里记录了该关键词在哪些文章里出现了,当用户搜索的时候先找到关键词,然后计算出最相关的头几十篇文章返回给用户。
Lucene在国外知名度很高,现在已经是Apache的顶级项目,国内也有很多应用,它使用的就是倒排文件索引结构,算法结构如下:
(0)设有两篇文章1和2
文章1的内容为:TomlivesinGuangzhou,IliveinGuangzhoutoo
文章2的内容为:HeoncelivedinShanghai.
(1)全文分析:由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施
经过上面处理后
文章1的所有关键词为:[tom][live][guangzhou][i][live][guangzhou]
文章2的所有关键词为:[he][live][shanghai]
(2)倒排索引:有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来,变成:“关键词”对“拥有该关键词的所有文章号”。文章1,2经过倒排后变成
关键词文章号 guangzhou1 he2 i1 live1,2 shanghai2 tom1
(3)通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:a)字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);b)关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种位置。
加上“出现频率”和“出现位置”信息后,我们的索引结构变为:
关键词文章号[出现频率]出现位置guangzhou1[2]3,6he2[1]1i1[1]4live1[2]2,52[1]2shanghai2[1]3tom1[1]1
(4)以live这行为例我们说明一下该结构:live在文章1中出现了2次,文章2中出现了一次,它的出现位置为“2,5,2”这表示什么呢?我们需要结合文章号和出现频率来分析,文章1中出现了2次,那么“2,5”就表示live在文章1中出现的两个位置,文章2中出现了一次,剩下的“2”就表示live是文章2中第2个关键字。
以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的(lucene没有使用B树结构),因此lucene可以用二元搜索算法快速定位关键词。
结语
参考:http://www.chedong.com/tech/lucene.html
参考的这篇文章里讲得更详细,网上也有很多介绍倒排算法的文章。既然已经有了,为什么我还要写这篇文章呢?我的考虑是倒排算法是搜索引擎的核心,理解了它能更好的理解搜索引擎的其他东西,也作为后续关于搜索引擎文章的完整性。