![自己动手写分布式搜索引擎](https://wfqqreader-1252317822.image.myqcloud.com/cover/514/26943514/b_26943514.jpg)
1.3.2 全文索引
假如你想看书,说出你的要求后,有经验的图书管理员可以从他们的书库中直接给你推荐几本。查询的基本过程与此类似,如图1-4所示。
![](https://epubservercos.yuewen.com/990190/15367246005319606/epubprivate/OEBPS/Images/figure_0013_0002.jpg?sign=1738923568-5ZJ49P83G2CsX6AbLiTqMxlXr1g4NqNH-0-2e84972de90a5ea73af85df8b72c1107)
图1-4 全文检索的基本过程
例如有10篇文档,编号为0~9。其中3篇文档中包含查询词,匹配出来文档集合{0,6,9}。对文档集合按相关性排序,得到文档数组{6,0,9}。返回结果中不仅存储文档,还存储分值。
public class ScoreDoc { Document doc; //文档相关的信息,包括文档编号等 public float score; //表示这个文档和查询词有多相关 }
查找文档最原始的方式是通过文档编号查找。就像一个人对应有一个身份证号,一个文档从创建开始就有一个文档编号。
有的专业书籍末尾有名词术语索引,方便读者定位名词术语在书中出现的位置。为了按词快速查找文档,不是采用字符串匹配的方法在文档中查询词,而是按词建立文档的索引。以词为基础建立的全文索引,也称倒排索引,如图1-5所示。在这里,索引中的文档用编号表示。
![](https://epubservercos.yuewen.com/990190/15367246005319606/epubprivate/OEBPS/Images/figure_0014_0001.jpg?sign=1738923568-CGvGU7mXW5GmFkbrFzy4AvGPZRYKCZYD-0-84209aec98f2d1b0e8cc4dc342a05450)
图1-5 以词为基础的全文索引
倒排索引是相对于正向索引来说的,首先用正向索引来存储每个文档对应的单词列表,然后再建立倒排索引,根据单词来索引文档编号。
例如要索引如下两个文档:
Doc Id 1:自己动手写搜索引擎;
Doc Id 2:自己动手写网络爬虫。
首先把这两个文档中的内容分成一个个的单词:
Doc Id 1:自己/动手/写/搜索引擎;
Doc Id 2:自己/动手/写/网络爬虫。
按词建立的倒排索引结构见表1-1。
表1-1 倒排索引结构
![](https://epubservercos.yuewen.com/990190/15367246005319606/epubprivate/OEBPS/Images/figure_0015_0001.jpg?sign=1738923568-BiMD0NYPT4tt6fXCY5RiMKbRtNC7znYp-0-a258876dc932b64dc38ee49010eb3956)
每个词后面的文档编号(docId)列表称为投递列表(posting list)。除了在投递列表中记录文档编号外,还可以添加词频和位置信息。词频的添加有助于结果的排序。位置信息记录了一个索引词在文档中出现的位置,可以用于包含多个查询词的短语检索;此外,也可以用于快速高亮显示查询词。
索引子系统把要搜索的文档先建立好索引,如图1-6所示。
![](https://epubservercos.yuewen.com/990190/15367246005319606/epubprivate/OEBPS/Images/figure_0015_0002.jpg?sign=1738923568-nO1KXukxquzoCdyQuCJOyYSfKpqIshbs-0-928a62741471d46c933db4df28562382)
图1-6 索引过程
待查询的很多文档放入同一个索引库,可以使用特征函数对文档中的词加权。
搜索子系统针对用户的即时查询找出相关文档,如图1-7所示。
![](https://epubservercos.yuewen.com/990190/15367246005319606/epubprivate/OEBPS/Images/figure_0016_0001.jpg?sign=1738923568-aFvCrNyvzasYK0UypCryOL2gj0yJS3Ut-0-7df93b59996c4c07ffeed0ed0afca28b)
图1-7 搜索过程
每个词查询出来一个文档的集合。多个文档集合做AND或者OR这样的布尔操作。