搜索引擎之我看

        最近在学习算法的时候有点迷上了搜素引擎,各处搜集零散的资料,看了相关的书籍,发现这个搜素引擎真是一个集大成的东西啊。仔细想想吧好多

学过的算法,网络知识都串起来了。现在写写我对搜索引擎的认识,也给想学习搜索引擎的童鞋一点借鉴。

        在我看来搜索引擎工作主要分四个步骤:

  • 1.网页抓取
  • 2.对抓取的网页形成索引
  • 3.数据的存储
  • 4.检索以及呈现
    
一、 首先谈谈抓取
        网页的抓取一般是类似于图的搜索,因为网页之间很自然的通过各种超链接相互联系,在搜索的过程中我们可以由 一些高质量的网页
开始搜索。图的搜索又分两种----深搜和广搜。
       深搜就是对每一个页面第一个连接搜索,然后再对这个连接中的第一 个页面进行搜索,用这样的策略搜索 完没有新的页面可以搜索的时候就返回搜索
上一个页面的第二个页面,如此往复直到没有未访问 的页面为止。
        广度优先故名思意就是先把与开始页面有连 接的页面都抓取完,然后再抓取与开始页面连接的页面中包含的连接。


二、然后再是形成索引
        大家应该都知道索引的形成是对文档进行倒排序的结果。什么是倒排序?就是对一系列的文章中的单词进行索引,记录他们出现
在哪些文档中。到时候就很容易根据单词找到它在哪个文档里面。
        关于怎么生成倒排序索引主要有两种,一种是将出现的每一个单词计算哈希值在内存 维护着一个很大的哈希表,然后依次遍历每个文档遇到一个新
单词就计算哈希值并将目前处理文档的ID号挂在对应单词的后面。这样做的好处就是方便。 当我们遍历完了所有文档,那么索引也就完成了。但是这样有
一个缺点,当我们处理的文档很多的时候这个哈希表可能非常的大,我们的内存可用空间是 一定的,这样一来用来处理文档的内存就变小了,效率会出现
下降。
        另外一种方法是对文档进行分块,每个文档直接对该文档内出现的单词建立索引,然后分别扫描每一块内部的文档建立索引,扫描完毕后对各个索引
进行归并操作。建立索引的时候是以字典序的,在合并的时候既可以考虑2路归并也可以考虑多路归并。这样一来就解决了上述内存效率低的问题,但是耗
时和复杂度有所上升。---时间和空间确实是一对矛盾体。怎么样有没有想到一道面试题,怎样合并多个大的有序文件?
        说了怎么生成索引,但是网络中很多网页包含的内容是一样的,例如有大量的转载新闻,抓发消息之类的网页,对这些网页进行计算是不值当的。对
了,在处理之前还需要对网页进行去重。我们开始要对所有的网页先计算类似于MD5的值,然后进行HASH发现两个页面的值一样就可以对重复的页面进行
去重。

三、 利用Map/Reduce进行计算
       这个地方计算量是比较大的,我们利用单机很难完成这个任务量,我们就要考虑Map/Reduce这个框架了。Map/Reduce是一个分布式计算框架, 我们
只需要写好Map和Reduce这两个模块需要完成的任务,这个框架会帮我们自动的完成将任务分配到多个计算机上,将结果返回。例如上面的网页去重 模块,
我们利用Map实现将要处理的网页转换成<哈希值,网页ID>的任务,这样可以计算出所有网页的哈希值。然后利用Reduce模块将有相同的哈希值的 键合并,
这样遍历一遍得到的结果对于相同哈希值的网页我们只选择一个,就得到了所有不同的网页。对于建立倒排序索引,我们同样可以用Map将文档和 单词转为
<单词,文档ID>这个形式,然后利用Reduce将相同单词的记录合并,这样就得到了倒排序的文档。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值