重温算法Day27:搜索引擎4步曲

搜索引擎大致可以分为四个部分:搜集、分析、索引、查询

搜集,就是我们常说的利用爬虫爬取网页。


们先找一些比较知名的网页(专业的叫法是权重比较高)的链接(比如新浪主页网址、腾讯主页网址等),作为种子网页链接,放入到队列中。
爬虫按照广度优先的策略,不停地从队列中取出链接,然后去爬取对应的网页,解析出网页里包含的其他网页链接,再将解析出来的链接添加到队列中。

1. 待爬取网页链接文件:links.bin(磁盘文件)
爬虫从 links.bin 文件中,取出链接去爬取对应的页面。等爬取到网页之后,将解析出来的链接,直接存储到 links.bin 文件中。

2. 网页判重文件:bloom_filter.bin
定期地(比如每隔半小时)将布隆过滤器持久化到磁盘中,存储在 bloom_filter.bin 文件中。这样,即便出现机器宕机,也只会丢失布隆过滤器中的部分数据。

3. 原始网页存储文件:doc_raw.bin
后面离线分析、索引之用。把多个网页存储在一个文件中,每个网页之间,通过一定的标识进行分隔,方便后续读取。一个文件限制1G大小。

4. 网页链接及其编号的对应文件:doc_id.bin
网页编号实际上就是给每个网页分配一个唯一的 ID,方便我们后续对网页进行分析、索引。
可以按照网页被爬取的先后顺序,从小到大依次编号。具体是这样做的:我们维护一个中心的计数器,每爬取到一个网页之后,就从计数器中拿一个号码,分配给这个网页,然后计数器加一。在存储网页的同时,我们将网页链接跟编号之间的对应关系,存储在另一个 doc_id.bin 文件中。


分析,主要负责网页内容抽取、分词,构建临时索引,计算 PageRank 值这几部分工作。


1. 抽取网页文本信息
HTML语法格式,提取。现在一般需要解析生成html的js。

2. 分词并创建临时索引
对于英文网页来说,分词非常简单。我们只需要通过空格、标点符号等分隔符,将每个单词分割开来就可以了。对于中文来说,分词就复杂太多了。基于字典和规则的分词方法。

我们把单词与网页之间的对应关系,写入到一个临时索引文件中(tmp_Index.bin),这个临时索引文件用来构建倒排索引文件。

需要使用散列表,记录已经编过号的单词。在对网页文本信息分词的过程中,我们拿分割出来的单词,先到散列表中查找,如果找到,那就直接使用已有的编号;如果没有找到,我们再去计数器中拿号码,并且将这个新单词以及编号添加到散列表中。
当所有的网页处理(分词及写入临时索引)完成之后,我们再将这个单词跟编号之间的对应关系,写入到磁盘文件中,并命名为 term_id.bin。


索引,主要负责通过分析阶段得到的临时索引,构建倒排索引。


倒排索引( Inverted index)中记录了每个单词以及包含它的网页列表
考虑到临时索引文件很大,无法一次性加载到内存中,搜索引擎一般会选择使用多路归并排序的方法来实现。

将其分割成多个小文件,先对每个小文件独立排序,最后再合并在一起。


我们还需要一个文件,来记录每个单词编号在倒排索引文件中的偏移位置。我们把这个文件命名为 term_offset.bin
这个文件的作用是,帮助我们快速地查找某个单词编号在倒排索引中存储的位置,进而快速地从倒排索引中读取单词编号对应的网页编号列表。


查询,主要负责响应用户的请求,根据倒排索引获取相关网页,计算网页排名,返回查询结果给用户。

doc_id.bin:记录网页链接和编号之间的对应关系。
term_id.bin:记录单词和编号之间的对应关系。
index.bin:倒排索引文件,记录每个单词编号以及对应包含它的网页编号列表。
term_offsert.bin:记录每个单词编号在倒排索引文件中的偏移位置。

这四个文件中,除了倒排索引文件(index.bin)比较大之外,其他的都比较小。为了方便快速查找数据,我们将其他三个文件都加载到内存中,并且组织成散列表这种数据结构。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页