搜索引擎简介
本文为阅读《这就是搜索引擎:核心技术详解》的读书笔记
搜索引擎可以认为是互联网重要的组成部分,且搜索引擎技术是当前解决信息过载问题主要的手段
可以按照使用的技术将搜索引擎的发展分为四个阶段:
- 分类目录,例如不包含搜索框的
hao123
首页。此时需要人工对网站进行分类与汇总 - 文本检索,使用信息检索模型匹配用户的搜索和页面。此时不同页面之间是独立的没有关联
- 链接分析,在文本检索的基础上同时考虑网页之间的链接关系(超链接),使用网页之间的关系衡量网页的流行(重要)程度
- 用户中心,以用户为中心,理解并满足用户的个性化需求。例如用户搜索 苹果,但其实其可能要搜索 iphone 11
搜索引擎的目标是:更全、更快、更准
搜索引擎的技术架构
相关概念
- 种子 URL & 网络爬虫,启动网络爬虫时需要提供初始 URL,这些 URL 就是种子 URL
- 网页分类 & 网络爬虫,已下载、已过期、待下载(已加入爬虫URL队列)、可知页面、不可知页面
- 爬虫分类,批量型(达到目标即停止)、增量型(不停的抓取)、垂直型(关注特定领域的爬虫)
- 爬虫的友好性,履行爬虫禁抓协议以保护网站的部分私密性;尽量减少被抓网站的网络负载
- 爬虫爬取策略,因为爬虫资源有限而网页资源接近无限,故不同类型网页的抓取与更新其策略不同
- 宽度优先遍历
- 非完全 PageRank ,抓取部分页面与 URL 后分析这些 URL,随后只抓取比较重要的网页。一个简单的方法:将网页看作是图的节点,被链接指向次数越多的网页其重要性一般也越大(咱不考虑作弊)。全网的 PageRank 几乎不可能,所以只能部分处理
- OPIC(online page importance computation),和非完全 PageRank 思路一致。每个新抓的页面都会被赋予相同的 cash,这些 cash 会均分给当前页面中的 URL,系统中已有URL 按照 cash 大小进行排序。OCIP 相对于 PageRank 而言优势在于速度与实时性
- 大站优先
- 已爬网页更新策略
- 历史参考,过去频繁更新的网页将来频繁更新的概率比较大,泊松过程
- 用户体验策略,影响大的页面应尽早更新
- 聚类抽样策略,不同种类页面更新频率不同
- 分布式爬虫
- 主从式爬虫
- 对等式爬虫
暗网
所谓的暗网指的是那些存储在数据库里,不能通过超链接访问的资源集合。简单点说所谓的暗网就是不能或者很难被搜索引擎收录的网络资源。携程的机票数据需要通过组合的方式才能查询出来,对于网络爬虫而言这个过程难以实现自动化,普通的暴力抓取将对被抓网站带来较大的压力
暗网爬虫的技术难点有两个:
- 组合太多,如何精心挑选查询组合?
- 查询大部分是文本框,爬虫如何输入合适的内容?
上面两个技术难点有部分解决方案,可以参考《这就是搜索引擎》的第 2.6 节
索引
索引是搜索引擎的核心技术之一,是搜索引擎快速查找的基础
一些概念
- 文档(Doc),以文本形式存在的对象,或者说能被分词系统解析的独立存储单元。例如PDF、Word、html、xml 等
- 倒排索引(inverted index),倒排索引是下面单词——文档矩阵的一种存储形式。通过倒排索引可以根据单词快速获得包含这个单词的文档列表。倒排索引常用的实现方法有哈希表和多叉树
- 单词词典,搜索引擎通常的索引单位是单词,单词词典是文档集合中出现过的所有单词构成的字符串集合
- 倒排列表,同一个单词可能出现在了不同的文档中,且在同一个文档中也可能出现多次,倒排列表用来保存单词与文档之间的关联信息
- 倒排文件,存储所有单词和其对应倒排列表的文件
- 文档频率,表明某个单词出现在了当前文档集合中的多少个文档中
单词——文档 矩阵
单词文档矩阵用来表示某一个文档中是否存在某一个单词,例如:
文档 1 | 文档 2 | ... | 文档 n | |
---|---|---|---|---|
词汇 1 | has | |||
... | ... | ... | ... | ... |
词汇 n | has | ... |
分词系统
在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,而词没有一个形式上的分界符,分词处理就是将连续的字序列按照一定的规范重新组合成词序列的过程。
单词是搜索引擎的基本搜索元素,为了创建单词文档矩阵,需要先使用分词系统提取文档中所有的单词
文档的分词处理是自然语言处理(NLP)的核心工具之一,而 NLP 则是大数据时代极为重要的工具。本文不对分词算法做介绍,详细信息可以参考其他文档。
倒排索引示例
示例文档:
文档编号 | 文档内容 |
---|---|
1 | 谷歌地图之父跳槽Facebook |
2 | 谷歌地图之父加盟Facebook |
3 | 谷歌地图创始人拉斯离开谷歌加盟Facebook |
4 | 谷歌地图之父跳槽Facebook与Wave项目取消有关 |
5 | 谷歌地图之父拉斯加盟社交网站Facebook |
带有单词频率、文档频率和单词位置的倒排索引示例:
单词 ID | 单词 | 文档频率 | 倒排列表(文档编号、词频、位置) |
---|---|---|---|
1 | 谷歌 | 5 | (1;1;<1>),(2;1;<1>),(3;2;<1;6>),(4;1;<1>),(5;1;<1>) |
2 | 创始人 | 1 | (3;1;<3>) |
... | ... | ... | ... |
单词“谷歌”出现在了 5 个文档中,并且在第三个文档中出现了 2 次,分别在文档第一个单词处和第 6 个单词处
索引的建立与更新
常见的索引建立方法有三种:两遍文档法、排序法和归并法,比较常用的是归并算法。在数据量大到不能使用内存存储时只能使用外排算法:归并
动态索引
搜索动态变化的文档集合时需要创建动态索引,此时系统中有三个关键部分:倒排索引、临时索引和已删除文档列表
变化的文档会先建立临时索引。文档的更新按照删除&重新添加进行处理,删除的文档需要在删除文档列表中进行维护,返回查询结果时需要使用删除文档列表过滤查询结果。
索引更新有多种策略:完全重构、再合并、原地更新及混合策略,具体解释参考原书 3.6 节。与爬虫策略类似,不同属性的单词其索引更新策略也可以不同。
多字段索引
有些文档有一定的结构,例如邮件有发件人、收件人、标题和正文等,有些搜索指明了搜索结构文档中的某一部分,例如只在收件人列表中搜索。实现多字段索引需要使用一定途径获得文档的结构信息和单词与文档结构间的信息
多字段索引常见三种方法:
- 多索引,即对结构化文档的每一个部分建立一个索引
- 倒排列表,只对文档建立一个索引,不过在倒排列表中添加单词所在结构的信息,后续使用这些信息过滤非指定位置的结果
- 扩展列表方式,和上面第二种方式类似,不过位置信息并非保存在倒排列表中。例如扩展列表详细描述了某一篇文档的结构:第 1 个单词到第 21 个单词是发件人信息,那么如果查询结果中的单词不是位于1~21单词,则可以知道这个结果不位于发件人信息中
分布式索引
对于海量数据的处理当前所能使用的技术只有分布式,对于搜索引擎而言建立分布式索引的方案有两种:按文档划分、按单词划分。
按文档划分就是所有机器的能力是对等的,不同机器对不同文档建立索引,每次查询的时候会发广播给所有机器
按单词划分则不同机器对不同的单词建立 索引,一次查询只会涉及到部分机器
常用的方法是按文档进行索引,因为按单词进行索引有以下缺点:
- 可扩展性差,每增加一个文档就会涉及到很多不同的机器,因为一个文档中包含了大量单词,这些单词又被不同机器索引
- 负载均衡能力差,有些单词很常见,索引这类单词的机器比其他机器需要更多的资源
- 容错性差
- 查询方式限制,按单词划分只能使用一次一单词(下面介绍)的方式进行查询,而有些搜索需要按一次一稳定的方式
查询
索引建立之后就可以使用索引来查询了,使用索引进行查询有两大类方法:一次一文档、一次一单词
一次一文档
以倒排列表中包含的文档为单位,每次计算一个文档和查询字段的最终相似性,然后计算余下文档,最后对文档得分进行排序
一次一单词
以查询单词为单位,每次查询一个文档关于一个单词的得分,查询完一个单词所涉及的所有文档后再查下一个单词。累加所有单词得分即为文档的最终得分
短语查询
常见的短语查询方法:位置信息索引、双词索引和短语索引
位置信息索引方式很直观,但当短信中包含的单词比较多时效率不高
双词索引在常见的双词短信中的两个单词之间建立连接,可以通过双词的首词快速的找到下词。双词索引会消耗大量的存储空间,故一般只对常见短语使用这种方式
短语索引就是将短语当作单词看待并为其建立索引,短语索引一般需要通过数据挖掘来获得热门短语
短语亦有属性与类别,不同属性的短信可以使用不同的索引方式