Nutch搜索引擎分析

来源:互联网 发布:nginx配置缓存时间 编辑:程序博客网 时间:2024/04/27 19:29
21世纪是信息的时代,也是网络的时代。不断通畅与进步的互联网在给人们带来浩如烟海的网络信息的同时,也容易使人在查询自己所需的有用的相关信息时陷入迷茫。搜索引擎正是为了满足人们网络信息搜索应运而生的网络工具,它是互联网信息查询的导航针。现在的商业搜索引擎不少,但都是保密的,不便研究。而Nutch是一个开源Java实现的搜索引擎,它提供了我们运行自己的搜索引擎所需的全部工具。

Nutch
是开放源代码的,因此任何人都可以查看他的排序算法是如何工作的。商业的搜索引擎排序算法都是保密的,我们无法知道为什么搜索出来的排序结果是如何算出来的。更进一步,一些搜索引擎允许竞价排名,比如百度,这样的索引结果并不是和站点内容相关的。因此 Nutch 对学术搜索和政府类站点的搜索来说,是个好选择。因为一个公平的排序结果是非常重要的。

了解一个大型分布式的搜索引擎如何工作是一件让人很受益的事情,但是我们并没有google的源代码,因此学习搜索引擎Nutch是个不错的选择。Nutch的核心部分目前已经被重新用 Map Reduce 实现,而Map Reduce是一个分布式的处理模型,最先是从 Google实验室提出来的。

Nutch
吸引了很多研究者,他们非常乐于尝试新的搜索算法,因为对Nutch来说,这是非常容易实现扩展的。Nutch非常灵活,它可以被很好地客户订制并集成到应用程序中。使用插件机制,Nutch可以作为一个搜索不同信息载体的搜索平台。当然,最简单的就是集成Nutch到你的站点,为用户提供搜索服务。

下面分析一下Nutch搜索引擎系统的特点。

一、系统架构

总体上Nutch可以分为2个部分:抓取部分和搜索部分。抓取程序抓取页面并把抓取回来的数据做成反向索引,搜索程序则对反向索引搜索回答用户的请求。抓取程序和搜索程序的接口是索引,两者都使用索引中的字段。抓取程序和搜索程序可以分别位于不同的机器上。下面详细介绍一下抓取部分。

抓取部分:

抓取程序是被Nutch的抓取工具驱动的。这是一组工具,用来建立和维护几个不同的数据结构: web database a set of segments and the index。下面逐个解释这三个不同的数据结构:

1
The web database或者WebDB。这是一个特殊存储数据结构,用来映像被抓取网站数据的结构和属性的集合。WebDB用来存储从抓取开始(包括重新抓取)的所有网站结构数据和属性。WebDB只是被抓取程序使用,搜索程序并不使用它。WebDB存储2种实体:页面链接。页面表示网络上的一个网页,这个网页的Url作为标示被索引,同时建立一个对网页内容的MD5哈希签名。跟网页相关的其它内容也被存储,包括:页面中的链接数量(外链接),页面抓取信息(在页面被重复抓取的情况下),还有表示页面级别的分数 score。链接表示从一个网页的链接到其它网页的链接。因此 WebDB可以说是一个网络图,节点是页面,链接是边。

2
Segment。这是网页的集合,并且它被索引。SegmentFetchlist是抓取程序使用的url列表,它是从 WebDB中生成的。Fetcher的输出数据是从 fetchlist中抓取的网页。Fetcher的输出数据先被反向索引,然后索引后的结果被存储在segment中。 Segment的生命周期是有限制的,当下一轮抓取开始后它就没有用了。默认的重新抓取间隔是30天。因此删除超过这个时间期限的segment是可以的。而且也可以节省不少磁盘空间。Segment的命名是日期加时间,因此很直观的可以看出他们的存活周期。

3
The index。索引库是反向索引所有系统中被抓取的页面,它并不直接从页面反向索引产生,而是合并很多小的segment的索引产生的。Nutch使用 Lucene来建立索引,因此所有Lucene相关的工具 API 都用来建立索引库。需要说明的是Lucenesegment的概念和Nutchsegment概念是完全不同的,不要混淆。简单来说 Lucene segment Lucene索引库的一部分,而NutchSegmentWebDB中被抓取和索引的一部分。

抓取过程详解:

抓取是一个循环的过程:抓取工具从WebDB中生成了一个 fetchlist 集合;抽取工具根据fetchlist从网络上下载网页内容;工具程序根据抽取工具发现的新链接更新WebDB;然后再生成新的fetchlist;周而复始。这个抓取循环在nutch中经常指: generate/fetch/update 循环。


一般来说同一域名下的 url链接会被合成到同一个 fetchlist。这样做的考虑是:当同时使用多个工具抓取的时候,不会产生重复抓取的现象。Nutch遵循 Robots Exclusion Protocol,可以用robots.txt定义保护私有网页数据不被抓去。

上面这个抓取工具的组合是Nutch的最外层的,也可以直接使用更底层的工具,自己组合这些底层工具的执行顺序达到同样的结果。这是Nutch吸引人的地方。下面把上述过程分别详述一下,括号内就是底层工具的名字:

1
、创建一个新的WebDB (admin db -create)

2
、把开始抓取的跟Url放入WebDb (inject)

3
、从WebDb的新 segment 中生成 fetchlist (generate)

4
、根据 fetchlist列表抓取网页的内容 (fetch)

5
、根据抓取回来的网页链接url更新 WebDB (updatedb)

6
、重复上面3-5个步骤直到到达指定的抓取层数。

7
、用计算出来的网页url权重 scores 更新 segments (updatesegs)

8
、对抓取回来的网页建立索引(index)

9
、在索引中消除重复的内容和重复的url (dedup)

10
、合并多个索引到一个大索引,为搜索提供索引库(merge)

在创建了一个新的WebDB后,抓取循环 generate/fetch/update 就根据最先第二步指定的根 url在一定周期下自动循环了。当抓取循环结束后,就会生成一个最终的索引(第7步到第10步)。需要说明的是:上面第 8 步中每个 segment的索引都是单独建立的,之后才消重(第9步)。第10步就是大功告成,合并单独的索引到一个大索引库。

Dedup
工具可以从 segment的索引中去除重复的url。因为 WebDB 中不允许重复的url也就是说 fetchlist中不会有重复的url,所以不需要对 fetchlist 执行 dedup操作。上文说过,默认的抓取周期是30天,如果已经生成的旧 fetch 没有删除,而又生成了新的fetch这是还是会出现重复的url的。当只有一个抓取程序运行的时候是不会发生上述情况的。

从上面的介绍可以看出,一般情况下我们只要从头执行的程序就可以了,不需要接触底层的工具。但是搜索引擎有很多意外,很多的时间需要花费在维护上,所以底层的工具也是需要掌握的。
原创粉丝点击