自己动手写分布式搜索引擎
上QQ阅读APP看书,第一时间看更新

1.3.2 全文索引

假如你想看书,说出你的要求后,有经验的图书管理员可以从他们的书库中直接给你推荐几本。查询的基本过程与此类似,如图1-4所示。

图1-4 全文检索的基本过程

例如有10篇文档,编号为0~9。其中3篇文档中包含查询词,匹配出来文档集合{0,6,9}。对文档集合按相关性排序,得到文档数组{6,0,9}。返回结果中不仅存储文档,还存储分值。

        public class ScoreDoc {
            Document doc; //文档相关的信息,包括文档编号等
            public float score; //表示这个文档和查询词有多相关
        }

查找文档最原始的方式是通过文档编号查找。就像一个人对应有一个身份证号,一个文档从创建开始就有一个文档编号。

有的专业书籍末尾有名词术语索引,方便读者定位名词术语在书中出现的位置。为了按词快速查找文档,不是采用字符串匹配的方法在文档中查询词,而是按词建立文档的索引。以词为基础建立的全文索引,也称倒排索引,如图1-5所示。在这里,索引中的文档用编号表示。

图1-5 以词为基础的全文索引

倒排索引是相对于正向索引来说的,首先用正向索引来存储每个文档对应的单词列表,然后再建立倒排索引,根据单词来索引文档编号。

例如要索引如下两个文档:

Doc Id 1:自己动手写搜索引擎;

Doc Id 2:自己动手写网络爬虫。

首先把这两个文档中的内容分成一个个的单词:

Doc Id 1:自己/动手/写/搜索引擎;

Doc Id 2:自己/动手/写/网络爬虫。

按词建立的倒排索引结构见表1-1。

表1-1 倒排索引结构

每个词后面的文档编号(docId)列表称为投递列表(posting list)。除了在投递列表中记录文档编号外,还可以添加词频和位置信息。词频的添加有助于结果的排序。位置信息记录了一个索引词在文档中出现的位置,可以用于包含多个查询词的短语检索;此外,也可以用于快速高亮显示查询词。

索引子系统把要搜索的文档先建立好索引,如图1-6所示。

图1-6 索引过程

待查询的很多文档放入同一个索引库,可以使用特征函数对文档中的词加权。

搜索子系统针对用户的即时查询找出相关文档,如图1-7所示。

图1-7 搜索过程

每个词查询出来一个文档的集合。多个文档集合做AND或者OR这样的布尔操作。