nutch工作流程简介

先用一幅图来形容nutch的工作流程:
 先对上图做一个简单说明,图中标的数字为nutch工作的顺序。它的基本流程可分为两部分,即抓取部分和搜索部分:
一、抓取部分(网络爬虫)
1.建立初始URL集
2.将URL集注入crawlDB数据库(inject包)
3. 根据crawldb数据库创建抓取列表---generate

4.执行抓取,获取网页信息---fetch

5.更新数据库,把获取到的页面信息存入数据库中---updatedb

6.重复进行3~5的步骤,直到预先设定的抓取深度。---这个循环过程被称为“产生/抓取/更新”循环

7.根据segments的内容更新linkdb数据库---invertlinks

(注:a.这里linkDB是用来存放所有超链接及每个链接的连入地址和锚文本的,如下图所示:

b.,crawlDB是用来存放所有需要抓取的超链接的信息(存放下载的URL,及下载的日期,用来页面更新检查时间)

crawlDB和linkDB 是web link目录,存放url 及url的互联关系,作为爬行与重新爬行的依据,页面默认30天过期。

c.segments是用来存放抓取的页面,它与连入深度有关(depth),在这个文件夹下面包含留个子目录,分别是:

content:抓取下来的网页内容,在网页抓取时生成

crawl_fetch:每个下载URL的状态

crawl_generate最初生成(初始URL集,即我们常说的种子站点)

crawl_parse用来更新crawldb的外链

parse_data解析抓取的数据文件时生成,主要是每个URL解析出的外部链接和元数据(metadata)

parse_text:解析抓取的数据文件时生成,网页的文本信息

其中 crawl_generatecrawl_fetchcrawl_parsecrawldb的部分 url数据,它们格式一样,不同的是抓取时间、状态、签名等有所变化 。)   

8.建立索引---index

二、搜索程序工作流程

1.用户通过用户接口进行查询操作

2.将用户查询转化为lucene查询

3.从索引库中提取满足用户检索需求的结果集

4.返回结果


详细介绍:

第一部分流程综述:

1.)建立初始URL集

建立URL集的方式主要通过两种:一是通过各个URL间的web链接关系即超链接,二是通过人为的加入即站长提交,因为按照超链接的方式爬虫不可能爬取网络中所有的站点,所以站长可以向搜索引擎提出收录某个站点,搜索引擎经过核查后加入,

2.)inject操作分析

inject操作调用的是nutch的核心包之一crawl包中的类org.apache.nutch.crawl.Injector。它执行的结果是:crawldb数据库内容得到更新,包括URL及其状态。

注入抓取URL。因为Nutch的抓取程序要抓取网页,而定位到某个(或者某些)网页需要指定一个URL,在此基础上,Nutch按照广度遍历策略进行抓取,会根据一开始指定的URL(可以是一个URL集合:URLs),以此为基础进行抓取工作。它主要实现以下几个功能:

a.将URL集合进行格式化和过滤,消除其中的非法URL,并设定URL状态(UNFETCHED),按照一定方法进行初始化分值;

b.将URL进行合并,消除重复的URL入口

c.将URL及其状态、分值存入crawldb数据库,与原数据库中重复的则删除旧的,更换新的

3.)generate 操作分析

generate操作调用的是crawl包中的类org.apache.nutch.crawl.Generator。它执行的结果是:创建了抓取 列表,存放于segments目录下,以时间为文件夹名称。循环抓取多少次,segments文件夹下就会有多少个以时间为名称的文件夹。它主要实现以下几个功能:

a. 从crawldb数据库中将URL取出并进行过滤;

b.对URL进行排序,通过域名、链接数和一种hash算法综合进行降序排列;

c.将排列列表写入segments目录中。

4.)fetch操作分析

fetch操作调用的是fetcher包中的类org.apache.nutch.fetcher.Fetcher。它执行的结果是:将页面内容抓取下来,存于segment目录下。它的主要功能如下:

a.执行抓取,按照segments目录下的抓取列表进行;

b.抓取过程中,页面的URL地址可能因为链接发生改变,从而需要更新URL地址;

c.抓取采用多线程方式进行,以提高抓取速度;

d.fetch操作过程中调用了parse操作。

5.)parse 解析操作

parse操作调用的是parse包中的类org.apache.nutch.parse.ParseSegment。它执行的结果是:将fetch得到的页面解析为parse.text和parse.data,存于segments目录下。

通过content parser解析器,最终获取到的就是文本内容和其它一些可能需要用到的数据。有了这些可以识别的文本内容和数据,就可以基于此来建立索引库,而且需要将本次抓取任务的详细信息登录到crawlDB,为下次抓取任务提供有用的信息(比如:避免重复抓取相同的URL指定的页面)。

因此接下来分为两个方向:一个是索引,一个是更新crawlDB并继续执行抓取任务:

indexing

这是一个索引的过程,对分析处理完成并提交的文本及其数据建立索引,通过索引文件就可以实现信息的检索功能了。建立索引过程中,由于是基于Lucene的,所以用到了Analyzer分析器,对预处理的文件进行分析、过滤、分词等等,最后将写入到索引库,供搜索程序工作使用。

update crawlDB with new extracted urls

根据网页分析处理获取到的信息,更新crawlDB(爬行数据库),并根据提取到的抓取任务已经注入的URLs循环执行抓取任务。

第二部分流程综述:

这部分比较简单了,就是启动WEB服务器,为用户提供检索服务。

这里,用户可以直接通过输入检索关键字,使用Lucene对用户检索关键字进行处理调用Nutch的搜索程序,基于索引库中存储的信息,来提取满足用户检索需求的信息。

http://blog.csdn.net/ruizema/article/details/6682339
http://www.jtben.com/document/963801

你可能感兴趣的:(java,搜索引擎)