Nutch中creativecommons插件的分析

来源:百度文库 编辑:神马文学网 时间:2024/04/30 15:43:45
Nutch中creativecommons插件的分析
插件介绍:
对于Nutch插件概念的基本介绍请看:http://www.cnblogs.com/abob/archive/2006/09/07/497...
Cretivecommons插件的主要作用是从抓取的网页中提取一些特定的或者我们自定义的一些信息(这里的信息必须符合cc机制),为这些信息建立索引,提供查询的功能.举个例子:比如我们正在爬行某招聘网站的网页,我们对某一招聘信息的职位描述感兴趣,那么我们就可以扩展这一插件,筛取出此网页职位描述的信息,建立此网页新Field(Lunene的Document),入索引库.等待查询或者进行别的操作.
为了达到目标,creativecommons plugin扩展3个不同的扩展点,它们是:HTMLParser:从meta-tags得到推荐的termsIndexingFilter:增加一个推荐Field在索引中。QueryFilter:增加对索引中新Field的查询能力.插件中一些概念的说明:creative commons:(创作共用) 是网络上的数字作品(文学、美术、音乐等)许可授权机制,它致力于让任何创造性作品都有机会被更多人分享和再创造,共同促进人类知识作品在其生命周期内产生最大价值。Nutch引入这个机制是为了在所索引的网页使用创作公用这个授权机制,对所索引到的内容进行知识保护,这不但能对资源提供者的知识进行保护,也能促进知识资源的良性传播,
插件的代码分析:
creativecommons插件包括以下四个文件:
CCIndexingFilter:实现了IndexingFilter这个接口
CCParseFilter:实现了HTMLParser这个接口
CCQueryyFilter:实现了QueryFilter这个接口
CCDeleteUnlicnese:删除那些没有在Nutch的creativecommons授权机制中定义的元素
一:
CCIndexingFilter代码分析:
核心方法:
public Document filter(Document doc, Parse parse, UTF8 url, CrawlDatum datum, Inlinks inlinks)
此方法是对基类Indexingfiler中的filter的重写,它接收了某网页已经形成的Document,从分析部件对该网页的分析结果Parse中抽取所要索引的信息,为其建立新的lucene field,然后加入Documet中.
参数:
Document    Lucene中的Document,详情请见:http://www.lucene.com.cn/lucene.htm
Parse:是个接口,这里代表的是对一个网页原始内容(html流)分析的结果,详细分析请见:http://www.cnblogs.com/abob/archive/2006/10/19/534...
UTF8:以utf-8编码的url
CrawlDatum:描述了Fetcher在抓取网页时的状态,详情请见Fetcher的分析http://www.cnblogs.com/abob/archive/2006/10/19/534...
Inlinks:这里面存储了inlink的列表,inlink是一个网页中包含的链接.详情请见crawl的分析
方法实现:
Metadata metadata = parse.getData().getParseMeta();
这句代码是从分析结果Parse中获得一个metadata,这个metadata对象,包括了是一个内容丰富的容器,也是一个分析信息结构的语法.详情请见http://www.cnblogs.com/abob/archive/2006/10/20/534....,得到的这个metadata对象里包括了该被分析的页面中的所有信息.
以下的代码是将所要索引的信息,利用CreativeCommons中的字段声明从metadata对象中提取出来,然后添加到Document中.比如第一个我们要处理的是Licneseurl,首先通过代码
String licenseUrl = metadata.get(CreativeCommons.LICENSE_URL);
提取信息,然后判断是否为空,写入日志,
if (licenseUrl != null) {
if (LOG.isInfoEnabled()) {
LOG.info("CC: indexing " + licenseUrl + " for: " + url.toString());
}
添加到lucene的Document中.
// add the entire license as cc:license=xxx
addFeature(doc, "license=" + licenseUrl);
// index license attributes extracted of the license url
addUrlFeatures(doc, licenseUrl);
}
以下关于license location同理可得:
// index the license location as cc:meta=xxx
String licenseLocation = metadata.get(CreativeCommons.LICENSE_LOCATION);
if (licenseLocation != null) {
addFeature(doc, "meta=" + licenseLocation);
}
// index the work type cc:type=xxx
String workType = metadata.get(CreativeCommons.WORK_TYPE);
if (workType != null) {
addFeature(doc, workType);
}
返回已经修改好得Document.
return doc;
以上就是对CCIndexingFilter核心代码得基本分析.
从一我们知道了如何从Parse中筛选出我们想要特别添加的metadata,向lucnene的索引文档Document中添加新的Field.这
里面牵扯到了CC授权机制,其实在整个creativecommons插件中,针对的就是经过creative commons声明的元素.为什么叫这个插件的名字,也就是这个道理了.下面我们要研究的是怎么向Parse添加符合CC授权机制的metadata.
二:
CCParseFilter的代码分析
内部元素和核心方法:
Walker:静态的内部类,主要作用是通过遍历某网页的DOM树,寻找内容中的RDF和节点中Licenses.
WORK_TYPE_NAMES:针对worktype的哈希表.
filter方法:实现了HTMLParseFilter的方法.下面有介绍.这里主要调用了Walker.walk.
首先我们了解一个接口 HtmlParseFilter,请见package org.apache.nutch.parse,在以后的代码分析中也会对它有所介绍.
这个接口是对以DOM树为基础的HTML文档的分析器的扩展点,它允许你向这个HTMLParsers添加metadata.而这里为添加符合CC授权机制的metadata.
public interface HtmlParseFilter extends Pluggable, Configurable {
/** 扩展点的名字 */
final static String X_POINT_ID = HtmlParseFilter.class.getName();
/** 根据一个网页的DOM树,通过此函数对其HTML流的分析结果添加metadata,或者进行修改 */
Parse filter(Content content, Parse parse, HTMLMetaTags metaTags, DocumentFragment doc);
}
下面我们看类内部的元素:
对于Walker这个静态的内部类,是整个模块代码的核心,如果我们要完成向其添加新metadata的任务,也是要扩展这个类,这个插件要扩展的三个metadata是:CreativeCommons.LICENSE_URL    CreativeCommons_LOCATION    CreativeCommons_WORKTYPE.    Walker的核心方法private void walk(Node node) ,完成了对DOM树的遍历,并找到相关的元素;
下面我们看Filter这个核心方法
public Parse filter(Content content, Parse parse, HTMLMetaTags metaTags, DocumentFragment doc)
参数:
Content:此类是Nutch一个重要的数据结构,从通过Socket得到某网页的html包,加工成content,再到整个分析,索引的过程都与这个数据结构的操作有密切关系,在分析Protocol的时候还会对这个类做详细论述,这里大家要理解这也是个类似与MetaData一样,是一个内容丰富的容器.
Content的主要字段:
private byte version;
private String url;
private String base;
private byte[] content;
private String contentType;
private Metadata metadata;
private boolean mimeTypeMagic;
private MimeTypes mimeTypes;
Parse:是个接口,这里代表的是对一个网页原始内容(html流)分析的结果,详细分析请见:http://www.cnblogs.com/abob/archive/2006/10/19/534...
HTMLMetaTags:这个类存储了一些从该被分析的网页中提取的HTML meta信息,为了易于访问,这个类里面定义了一些类似与属性操作德函数.
DocumentFragment: 是“轻量级”或“最小”Document 对象。希望能够提取文档树的一部分或创建文档的新片段是很常见的。设想实现像剪切这样的用户命令或通过来回移动片段重新安排文档。需要有一个可以保存此类片段的对象,很自然出于此目要使用一个 Node。当 Document 对象真正可以完成此职责时,Document 对象可能为重量级对象,具体取决于基础实现。此操作真正需要的是非常轻量级的对象。DocumentFragment 就是这样的对象。
以上是对cc插件的基本介绍,关于后两个CCQueryyFilter:  CCDeleteUnlicnese:文件,我们不再叙述,因为有以上的知识,理解就很容易了.