搜索引擎会涉及非常多技术领域。其中,比较重要的有网页抓取、文本分析、检索模型、索引技术、链接分析、反作弊、云存储和云计算。正是因为涉及的领域非常多,所以搜索引擎完整的系统架构也非常复杂,会由许多子系统组成。
不过,我们可以从功能结构上,把搜索引擎的核心系统分为三部分,分别是爬虫系统、索引系统和检索系统。
接下来,我们就分别说说,这三部分子系统具体的作用和工作过程。
首先是爬虫系统。
一个好的搜索引擎,必须要能采集足够多的网页。因此,我们需要通过高性能的爬虫系统来完成持续的网页抓取,并且将抓取到的网页存入存储平台中。一般来说,我们可以将抓取到的网页存放在基于 LSM 树的 HBase 中,以便支持数据的高效读写。
其次是索引系统。
在爬虫系统抓取到网页之后,我们需要对这些网页进行一系列的处理,它们才可以变成可用的索引。处理可以分为两个阶段,首先是对网页进行预处理,主要的手段包括相似网页去重、网页质量分析、分词处理等工作,然后是对网页进行反作弊的分析工作,来避免一些作弊网页干扰搜索结果。
处理好网页之后,我们就要为搜索引擎生成索引,索引的生成过程主要可以分为三步。
第一步,索引拆分。由于抓取到的网页量级非常大,把它们全部都生成索引不太现实,因此我们会在离线阶段,根据之前的网页预处理结果,进行计算和筛选,分别分离出高质量和普通质量的网页集合。这样,我们就能进行分层索引了(第 12 讲)。当然,无论是高质量的网页集合还是普通质量的网页集合,数据量都不小。因此,我们还需要进行基于文档的拆分(第 10 讲),以便生成索引。
第二步,索引构建。在确认了索引的分片机制以后,我们可以使用 Map Reduce 服务,来为每个索引分片生成对应的任务,然后生成相应的倒排索引文件(第 8 讲)。每个倒排索引文件代表一个索引分片,它们都可以加载到线上的服务器中,来提供检索服务。
第三步,索引更新。为了保证能实时更新数据,搜索引擎会使用全量索引结合增量索引的机制来完成索引更新。并且由于搜索引擎的全量索引数据量巨大,因此,我们一般使用滚动合并法来完成索引更新(第 9 讲)。
有了这样创建出来的索引之后,搜索引擎就可以为万亿级别的网页提供高效的检索服务了。
最后是检索系统。
在检索阶段,如果用户搜索了一个关键词,那么搜索引擎首先需要做查询分析,也就是通过分析查询词本身以及用户行为特征,找出用户的真实查询意图。如果发现查询词有误或者结果很少,搜索引擎还会进行拼写纠正或相关查询推荐,然后再以改写后的查询词去检索服务中查询结果。
在检索服务中,搜索引擎会将查询词发送给相应的索引分片,索引分片通过倒排索引的检索机制,将自己所负责的分片结果返回。对于返回的结果,搜索引擎再根据相关性分析和质量分析,使用机器学习进行打分,选出 Top K 个结果(第 11 讲)来完成检索。
以上就是一个搜索引擎的完整的工作机制了。那与广告引擎和推荐引擎相比,搜索引擎最大的特点,就是它有一个很强的检索约束条件,那就是用户输入的查询词。可以说,查询词是搜索引擎进行检索的最核心的信息。但是很多时候,用户输入的查询词是含糊的、不精准的,甚至是带有错误的。还有一种可能是,用户输入的查询词不在倒排索引中。
这些问题也都是搜索引擎要解决的核心问题。因此,接下来,我们就以搜索「极客时间」为例,来讲讲搜索引擎的解决方案。