为什么nutch要使用这样的plugin系统?
有三个原因:
1:可扩展性
通过plugin,nutch允许任何人扩展它的功能,而我们要做的只是对给定的接口做简单的实现,举个例子:MSWordParser这个插件是用来分析wordwendang的,它就是一个对parser这个接口的实现
2:灵活性
因为每个人都可以根据自己的需求而写自己的plugin,这样plugin就会有一个很强大的资源库。这样对与应用nutch程序员来说,他可以在自己的搜索引擎上安装符合自己需求的插件,而这些插件就在nutch的plugins中。这对于正在应用nutch的开发者来说应该是一个巨大的福音,因为你有了更多的关于内容抽取的算法来选择,很容易就增加了pdf的分析。
3:可维护性
每个开发者只要关注自己的问题。对于内核的开发者在为引擎内核扩展的同时,为a plug添加一个描述它的接口就可以了。一个plugin的开发者只要关注这个plugin所要实现的功能,而不需要知道整个系统是怎么工作的。它们仅仅需要知道的是plugin和plug之间交换的数据类型。这使得内核更加简单,更容易维护。
plugin相关--什么是plugin,plugin的工作原理
nutch的plugin系统是基于Eclipse 2.x中对插件的使用。plugins对nutch的工作是很重要的。所有的nutch中的parsing(分析),indexing(索引),searching(查询)都是通过不同的plugins来实现的。
在编写一个plugin的时候,你要为一个扩展点添加一个或者更多的扩展项。这些Nutch的扩展点是Nutch在一个plugin中已经定义好了,这个plugin是NutchExtensionPoints(所有的扩展点都会在NutchExtensionPoints plugin.xml这个文件中列出)。每一个扩展点都定义了一个接口,这个接口在扩展时必须被实现。这些扩展点如下:
onlineClusterer-为在线的查询结果提供分组算法的扩展点的接口
indexingFiltering-允许为所索引中的Field添加元数据。所有的实现了这个接口plugin会在分析的过程中顺序的逐个运行
Ontology
Parser
实现这个接口的parser读取所抓取的document,摘取将被索引的数据。如果你要在nutch中为扩展分析一个新内容类型或者从现有的可分析的内容摘取更多的数据。
HtmlParseFilter
为html parser添加额外的元数据
protocol
实现Protocol的plugin可以使得nutch能使用更多的网络协议(ftp,http)去抓取数据
QueryFilter
为查询转换的扩展点
URLFileter
实现这个扩展点的plugin会对nutch要抓取的网页的urls进行限制,RegexURLFilter提供了通过正则表达式来对Nutch爬行网页的urls的控制。如果你对urls还有更加复杂的控制要求,你可以编写对这个urlfilter的实现
NutchAnalyser
为许多语言特定的分析器提供了扩展点
源文件
在plugin的源文件目录中你会找到以下的文件
plugin.xml 向nutch描述这个plugin的信息
build.xml 告诉ant怎样编译这个plugin
plugin的源码
在Nutch使用plugin
如果要在Nutch使用一个给定的plugin,你需要对conf/nutch-site.xml进行编辑并且把plugin的名字添加到plugin.includes中
Nutch plugin系统中的一些概念
编写一个pluginExample
思考编写这样的一个plugin:我们想为一个给定的search term推荐一些与之相关的网页。举个例子,假设我们正在索引网页,当我们注意到有一组网页的内容是关于plugin的,所以我们想如果当某人查询plugin的时候,我们可以推荐他到pluginCentral这个网页,但是同时,也要返回在一般逻辑中的查询结果所有的hits。所以我们将查询结果分成了推荐结果和一般查询结果。
你浏览你的网页然后把一个meta-tags加入网页中,它会告诉plugin这个网页是应该被推荐的。这个tags应该像这样
<meta name="recommended" content="plugins" />为了达到目标我们需要写一个plugin,这个plugin扩展3个不同的扩展点,它们是:HTMLParser:从meta-tags得到推荐的termsIndexingFilter:增加一个推荐Field在索引中。QueryFilter:增加对索引中新Field的查询能力 要建立的文件首先在plugin的目录中新建一个目录来盛放自己的的plugin,整个plugin我们取名为recommended,然后在这个目录里面依次建立以下文件:a plugin.xml,这个文件用来向Nutch描述我们新建的plugina build.xml这个文件告诉编译器应该怎样build这个pluginplugin的源代码则保存在/src/java/org/apache/nutch/parse/recommended/[这里] Plugin.xml
你所建立的plugin.xml应该这样:
<?xml version="1.0" encoding="UTF-8"?>
<plugin
id="recommended"
name="Recommended Parser/Filter"
version="0.0.1"
provider-name="nutch.org">
<runtime>
<!-- As defined in build.xml this plugin will end up bundled as recommended.jar -->
<library name="recommended.jar">
<export name="*"/>
</library>
</runtime>
<!-- The RecommendedParser extends the HtmlParseFilter to grab the contents of
any recommended meta tags -->
<extension id="org.apache.nutch.parse.recommended.recommendedfilter"
name="Recommended Parser"
point="org.apache.nutch.parse.HtmlParseFilter">
<implementation id="RecommendedParser"
class="org.apache.nutch.parse.recommended.RecommendedParser"/>
</extension>
<!-- TheRecommendedIndexer extends the IndexingFilter in order to add the contents
of the recommended meta tags (as found by the RecommendedParser) to the lucene
index. -->
<extension id="org.apache.nutch.parse.recommended.recommendedindexer"
name="Recommended identifier filter"
point="org.apache.nutch.indexer.IndexingFilter">
<implementation id="RecommendedIndexer"
class="org.apache.nutch.parse.recommended.RecommendedIndexer"/>
</extension>
<!-- The RecommendedQueryFilter gets called when you perform a search. It runs a
search for the user’s query against the recommended fields. In order to get
add this to the list of filters that gets run by default, you have to use
"fields=DEFAULT". -->
<extension id="org.apache.nutch.parse.recommended.recommendedSearcher"
name="Recommended Search Query Filter"
point="org.apache.nutch.searcher.QueryFilter">
<implementation id="RecommendedQueryFilter"
class="org.apache.nutch.parse.recommended.RecommendedQueryFilter"
fields="DEFAULT"/>
</extension>
</plugin> Build.xml
<?xml version="1.0"?>
<project name="recommended" default="jar">
<import file="../build-plugin.xml"/>
</project>
The HTML Parser Extension
这是对HtmlParserExtension这个扩展点的实现,它的作用是抓取那些标meta-tags的内容,这样把它们加入正在分析的document中。
责任编辑:小草