搜索引擎之倒排索引及性能优化
文章目录
本文主要介绍搜索引擎的一般线上架构,并详细介绍引擎核心的基础结构之倒排索引的实现原理,倒排性能优化相关的算法和数据结构,最后会提出搜索引擎所面对的一些最新的技术挑战。
1. 搜索引擎的一般线上架构
当我们在类似百度/谷歌的搜索引擎中输入一个query,后台服务器到底发生了什么呢?请看下图为搜索引擎的一般线上架构。
简单来说,后台包括了如下的主要步骤:
-
用户输入一个query,前端把query传给搜索网关;
-
接下来需要查询分析服务先对query进行查询语义的分析,可能会调用分词,query的分类,query的意图识别等服务,最终生成query的查询计划,这个步骤你可以理解为mysql里面的sql解析和查询计划和策略的生成;
-
然后下发请求到索引集群进行搜索结果的召回,通常是每个节点几十条结果,这样在顶层节点聚合后可以有几千条结果;召回的过程会进行第一次粗略的排序;
-
然后调用重排序服务,对召回结果进行多次,多种策略的重新排序;
-
最后从摘要服务获取需要展示的信息如摘要,标题,作者等。
这里只是一个简化的线上搜索系统架构,省略了离线部分的架构,同时真正的系统可能还会有对query进行纠错,联想,推荐,广告等等服务,索引,存储等集群的详细结构也在此略过。后续章节我们主要集中在第三步,即如何从百亿千亿的文档中找到用户需要的文档子集。
2. 倒排索引(Inverted Index)及性能优化
在搜索引擎中有正向索引(forward index),自然也有倒排索引(inverted index)。想象一下一个类似淘宝的电商网站的搜索引擎,其正向索引存储的就是每个商品及其对应的一大堆属性,索引是以商品id为key,其它属性为值,比如标题,图片,价格等等。而倒排索引正好反过来,索引是以文本中的单词(或者其他属性值比如价格)为key,value为商品的id列表。另一个倒排索引常见的例子是书的附录页中的索引,即专有名词或图片到页数的索引。
2.1 词的经验分布zipf’s law
在正式介绍倒排索引前,我们有必要了解下词在我们常见文章中的分布,即zipf’s law。齐夫定律(英语:Zipf’s law)是由哈佛大学的语言学家乔治·金斯利·齐夫(George Kingsley Zipf)于1949年发表的实验定律。它可以表述为:在自然语言的语料库里,一个单词出现的频率与它在频率表里的排名成反比。所以,频率最高的单词出现的频率大约是出现频率第二位的单词的2倍,而出现频率第二位的单词则是出现频率第四位的单词的2倍。这个定律被作为任何与幂定律概率分布有关的事物的参考。
最简单的齐夫定律的例子是“1/f function”。给出一组齐夫分布的频率,按照从最常见到非常见排列,第二常见的频率是最常见频率的出现次数的½,第三常见的频率是最常见的频率的1/3,第n常见的频率是最常见频率出现次数的1/n。然而,这并不精确,因为所有的项必须出现一个整数次数,一个单词不可能出现2.5次。
齐夫定律是一个实验定律,而非理论定律,可以在很多非语言学排名中被观察到,例如不同国家中城市的数量、公司的规模、收入排名等。但它的起因是一个争论的焦点。齐夫定律很容易用点阵图观察,坐标分别为排名和频率的自然对数(log)。比如,“the”用上述表述可以描述为x = log(1), y = log(69971)的点。如果所有的点接近一条直线,那么它就遵循齐夫定律。
在Brown语料库中,“the”、“of”、“and”是出现频率最前的三个单词,其出现的频数分别为69971次、36411次、28852次,大约占整个语料库100万个单词中的7%、3.6%、2.9%,其比例约为6:3:2。大约占整个语料库的7%(100万单词中出现69971次)。满足齐夫定律中的描述。仅仅前135个字汇就占了Brown语料库的一半。
2.2 倒排的一些基本概念
倒排索引里面有如下的一些基本概念,
- 文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。再比如一封邮件,一条短信,一条微博也可以称之为文档。在本书后续内容,很多情况下会使用文档来表征文本信息。
- 文档集合(Document Collection):由若干文档构成的集合称之为文档集合。比如海量的互联网网页或者说大量的电子邮件都是文档集合的具体例子。
- 文档编号(Document ID):在搜索引擎内部,会将文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理,每个文档的内部编号即称之为“文档编号”,后文有时会DocID来便捷地代表文档编号。
- 单词编号(Word ID):与文档编号类似,搜索引擎内部以唯一的编号来表征某个单词,单词编号可以作为某个单词的唯一表征。
- 倒排索引(Inverted Index):倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
- 单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。词典常用的数据结构有Hash table, B-tree, trie树等。
- 倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
- 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
关于这些概念之间的关系,通过下图可以比较清晰的看出来。