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这样的布尔操作。