Nutch搜索引擎分析

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

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

抓取过程详解:

抓取是一个循环的过程:抓取工具从 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 的。当只有一个抓取程序运行的时候是不会发生上述情况的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值