plugin(插件)为nutch提供了一些功能强大的部件,nutch中不少功能都是使用插件实现的,而使用者也能够自行开发更多适合自已的插件。
html
1:可扩展性 经过plugin,nutch容许任何人扩展它的功能,而咱们要作的只是对给定的接口作简单的实现,举个例子:咱们在NUTCH里使用LOADBALANCE进行下载的插件,它就是一个对protocol这个接口的实现。
2:灵活性 由于每一个人均可以根据本身的需求而写本身的plugin,这样plugin就会有一个很强大的资源库。这样对应用nutch程序员来讲,他能够在本身的搜索引擎上安装符合本身需求的插件,而这些插件就在nutch的plugins中。这对于正在应用nutch的开发者来讲应该是一个巨大的福音,由于你有了更多的关于内容抽取的算法来选择,很容易就增长了各类过滤规则、下载方式、解析文件类型等。java
3:可维护性
每一个开发者只要关注本身的问题。对于内核的开发者在为引擎内核扩展的同时,为plugin添加一个描述它的接口就能够了。一个plugin的开发者只要关注这个plugin所要实现的功能,而不须要知道整个系统是怎么工做的。它们仅仅须要知道的是plugin和plug之间交换的数据类型。这使得内核更加简单,更容易维护。
程序员
nutch的plugin系统是基于Eclipse 2.x中对插件的使用。plugins对nutch的工做是很重要的。nutch中的fetch(下载)、parsing(分析),indexing(索引),searching(查询)等都是经过不一样的plugins来实现的。
在编写一个plugin的时候,要为一个扩展点添加一个或者更多的扩展项。这些Nutch的扩展点是Nutch在一个plugin中已经定义好了,这个plugin是NutchExtensionPoints(全部的扩展点都会在NutchExtensionPoints 的plugin.xml这个文件中列出)。每个扩展点都定义了一个接口,这个接口在扩展时必须被实现。
这些扩展点以下:
indexingFiltering:
org.apache.nutch.indexer.IndexingFilter
容许为所索引中的Field添加元数据。全部的实现了这个接口plugin会在分析的过程当中顺序的逐个运行.
Parser:
org.apache.nutch.parse.Parser 若是你要在nutch中扩展分析一个新内容类型或者从现有的可分析的内容摘取更多的数据。可实现接口parser,读取所抓取的document,摘取将被索引的数据。
HtmlParseFilter:
org.apache.nutch.parse.HtmlParseFilter
为html parser添加额外的元数据
这个接口是对以DOM树为基础的HTML文档的分析器的扩展点,它容许你向这个HTMLParsers添加metadata.正则表达式
protocol:
org.apache.nutch.protocol.Protocol
实现Protocol的plugin可使得nutch能使用更多的网络协议(ftp,http)去抓取数据
URLFileter:
org.apache.nutch.net.URLFilter
实现这个扩展点的plugin会对nutch要抓取的网页的urls进行限制,RegexURLFilter提供了经过正则表达式来对Nutch爬行网页的urls的控制。若是你对urls还有更加复杂的控制要求,你能够编写对这个urlfilter的实现
URLNormalizer:
org.apache.nutch.net.URLNormalizer
URL规范化
ScoringFilter:
org.apache.nutch.scoring.ScoringFilter
Nutch分数计算接口,可经过实现该接口以影响Nutch分数的计算方式,其默认的OPIC分数计算方法由类 OPICScoringFilter 提供。此外,参与计算分数的类还有 ScoringFilters,ParseOutputFormat。其中 ScoringFilters 负责将各个计分插件加载到系统中,并实现链式计分的过程;而ParseOutputFormat在解析结果输出以前,将页面的分数分配到该页面的各个子页面中,使得Nutch的更新模块可使用这些数据更新CrawlDB数据库。
SegmentMergeFilter:
org.apache.nutch.segment.SegmentMergeFilter
算法
segment合并过滤接口。按必定的规则将多个SEGMNET进行合并、过滤。数据库
以protocol扩展点为例,咱们对NUTCH中的数据下载方式进行改变,使用咱们的方式进行下载。
首先,新建源码目录,目录中包含3个xml,一个源程序目录。
plugin.xml :向nutch描述这个plugin的信息
build.xml :告诉ant怎样编译这个plugin
Ivy.xml:这个plugin的ivy配置信息
源程序有两个JAVA类:
apache
Http.java:实现protocol接口 ,这里为简便,继承自httpbase类,httpbase类是一个API意义的类,实现了protocol接口,这样咱们可减小不少工做。网络
HttpReponse.java:用于实现下载并返回信息。ide
图1:fetch
图2,接上图:
plugin.xml说明
<plugin
id="protocol-http-netty" 插件ID
name="protocol http netty Plug-in" 插件名称
version="1.0.0" 插件版本
provider-name="pycredit"> 插件提供者的ID
<runtime>
<library name="protocol-http-netty.jar"> 发布的JAR包
<export name="*"/>
</library>
</runtime>
<requires>
<import plugin="nutch-extensionpoints"/> 依赖的插件
<import plugin="lib-http">
</requires>
<extension id="org.apache.nutch.protocol.netty.http" 扩展的插件ID
name="HttpProtocol" 扩展的插件名
point="org.apache.nutch.protocol.Protocol"> 插件的扩展点ID
<implementation id="org.apache.nutch.protocol.netty.http.Http" 插件实现ID
class="org.apache.nutch.protocol.netty.http.Http"> 实现类
<parameter name="protocolName" value="http"/>插件的参数
</implementation>
-->
</extension>
</plugin>
实现接口编写代码完毕后修改配置步骤以下:
一、src/plugin/build.xml中,在
<target name="deploy">;
<target name="test">;
<target name="clean">;
分别增长相应配置,将咱们新开发的插件添加进去,如:
<ant dir="protocol-http-netty" target="deploy">
二、修改nutch/build.xml文件在
<target name="release" depends="compile-core" description="generate the release distribution">
中增长配置如:
<packageset dir="${plugins.dir}/protocol-http-netty/src/java"/>
三、 注意检查${plugins.dir}/protocol-http-netty/src/build.xml,其project标签name值要为"protocol-http-netty"
若是要在Nutch使用一个给定的plugin,你须要对conf/nutch-site.xml进行编辑而且把plugin的名字添加到plugin.includes中
<property>
<name>searcher.dir</name>
<value>I:/nutch-0.7.1/crawled</value>
</property>
<property><name>plugin.includes</name><value>nutch-extensionpoints|protocol-http|urlfilter-regex|parse-(text|html)|index-basic|query-(basic|site|url)|recommended</value>