plugin(插件)为nutch提供了一些功能强大的部件,举个例子,HtmlParser就是使用比较广泛的用来分析nutch抓取的html文件的插件。html
为何nutch要使用这样的plugin系统?java
有三个缘由:程序员
1:可扩展性正则表达式
经过plugin,nutch容许任何人扩展它的功能,而咱们要作的只是对给定的接口作简单的实现,举个例子:MSWordParser这个插件是用来分析wordwendang的,它就是一个对parser这个接口的实现算法
2:灵活性express
由于每一个人均可以根据本身的需求而写本身的plugin,这样plugin就会有一个很强大的资源库。这样对与应用nutch程序员来讲,他能够在本身的搜索引擎上安装符合本身需求的插件,而这些插件就在nutch的plugins中。这对于正在应用nutch的开发者来讲应该是一个巨大的福音,由于你有了更多的关于内容抽取的算法来选择,很容易就增长了pdf的分析。apache
3:可维护性api
每一个开发者只要关注本身的问题。对于内核的开发者在为引擎内核扩展的同时,为a plug添加一个描述它的接口就能够了。一个plugin的开发者只要关注这个plugin所要实现的功能,而不须要知道整个系统是怎么工做的。它们仅仅须要知道的是plugin和plug之间交换的数据类型。这使得内核更加简单,更容易维护。网络
plugin相关--什么是plugin,plugin的工做原理app
nutch的plugin系统是基于Eclipse 2.x中对插件的使用。plugins对nutch的工做是很重要的。全部的nutch中的parsing(分析),indexing(索引),searching(查询)都是经过不一样的plugins来实现的。
在编写一个plugin的时候,你要为一个扩展点添加一个或者更多的扩展项。这些Nutch的扩展点是Nutch在一个plugin中已经定义好了,这个plugin是NutchExtensionPoints(全部的扩展点都会在NutchExtensionPointsplugin.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获得推荐的terms
IndexingFilter:增长一个推荐Field在索引中。
QueryFilter:增长对索引中新Field的查询能力
要创建的文件
首先在plugin的目录中新建一个目录来盛放本身的的plugin,整个plugin咱们取名为recommended,而后在这个目录里面
依次创建如下文件:
a plugin.xml,这个文件用来向Nutch描述咱们新建的plugin
a build.xml这个文件告诉编译器应该怎样build这个plugin
plugin的源代码则保存在/src/java/org/apache/nutch/parse/recommended/[这里]
你所创建的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>
<?xml version="1.0"?> <project name="recommended" default="jar"> <import file="../build-plugin.xml"/> </project>
这是对HtmlParserExtension这个扩展点的实现,它的做用是抓取那些标meta-tags的内容,这样把它们加入正在分析的document中。.
package org.apache.nutch.parse.recommended; // JDK imports import java.util.Enumeration; import java.util.Properties; import java.util.logging.Logger; // Nutch imports import org.apache.nutch.parse.HTMLMetaTags; import org.apache.nutch.parse.Parse; import org.apache.nutch.parse.HtmlParseFilter; import org.apache.nutch.protocol.Content; import org.apache.nutch.util.LogFormatter; public class RecommendedParser implements HtmlParseFilter { private static final Logger LOG = LogFormatter .getLogger(RecommendedParser.class.getName()); /** The Recommended meta data attribute name */ public static final String META_RECOMMENDED_NAME="Recommended"; /** * 在html文件中寻找有没有标有meta-tags的内容 */ public Parse filter(Content content, Parse parse, HTMLMetaTags metaTags, DocumentFragment doc) { // Trying to find the document's recommended term String recommendation = null; Properties generalMetaTags = metaTags.getGeneralTags(); for (Enumeration tagNames = generalMetaTags.propertyNames(); tagNames.hasMoreElements(); ) { if (tagNames.nextElement().equals("recommended")) { recommendation = generalMetaTags.getProperty("recommended"); LOG.info("Found a Recommendation for " + recommendation); } } if (recommendation == null) { LOG.info("No Recommendataion"); } else { LOG.info("Adding Recommendation for " + recommendation); parse.getData().getMetadata().put(META_RECOMMENDED_NAME, recommendation); } return parse; } }
这是对索引点的扩展,若是查找到带有meta-tags的内容,就把它命名”recommended’的field中,而后加入document创建索引
package org.apache.nutch.parse.recommended; // JDK import import java.util.logging.Logger; // Nutch imports import org.apache.nutch.util.LogFormatter; import org.apache.nutch.fetcher.FetcherOutput; import org.apache.nutch.indexer.IndexingFilter; import org.apache.nutch.indexer.IndexingException; import org.apache.nutch.parse.Parse; // Lucene imports import org.apache.lucene.document.Field; import org.apache.lucene.document.Document; public class RecommendedIndexer implements IndexingFilter { public static final Logger LOG = LogFormatter.getLogger(RecommendedIndexer.class.getName()); public RecommendedIndexer() { } public Document filter(Document doc, Parse parse, FetcherOutput fo) throws IndexingException { String recommendation = parse.getData().get("Recommended"); if (recommendation != null) { Field recommendedField = Field.Text("recommended", recommendation); recommendedField.setBoost(5.0f); doc.add(recommendedField); LOG.info("Added " + recommendation + " to the recommended Field"); } return doc; } }
当用户进行查找操做的时候,QueryFilter就会被调用,并且对于recommeded中的boost值会影响查询结果的排序。
package org.apache.nutch.parse.recommended; import org.apache.nutch.searcher.FieldQueryFilter; import java.util.logging.Logger; import org.apache.nutch.util.LogFormatter; public class RecommendedQueryFilter extends FieldQueryFilter { private static final Logger LOG = LogFormatter .getLogger(RecommendedParser.class.getName()); public RecommendedQueryFilter() { super("recommended", 5f); LOG.info("Added a recommended query"); } }
让Nutch可使用你的plugin
为了让Nutch使用你的plugin,你须要对conf/nuthc-site.xml这个文件进行编辑,把
如下的代码加入
<property> <name>plugin.includes</name> <value>nutch-extensionpoints|protocol-http|urlfilter-regex|parse-(text|html)|index-basic|query-(basic|site|url)|recommended
</value> <description>Regular expression naming plugin directory names to include. Any plugin not matching this expression is excluded. In any case you need at least include the nutch-extensionpoints plugin. By default Nutch includes crawling just HTML and plain text via HTTP, and basic indexing and search plugins. </description> </property>
使用Ant对你的plugin进行编译
在以前咱们要编辑一下src/plugin/build.xml 这个文件,这是对编译和部署作一些设置
你会看到有不少以下形式的行
<ant dir="[plugin-name]" target="deploy" />
在</target>前添加一新行
<ant dir="reccomended" target="deploy" />
Running ‘ant’ in the root of your checkout directory should get everything compiled and jared up. The next time you run a crawl your parser and index filter should get used.
You’ll need to run ‘ant war’ to compile a new ROOT.war file. Once you’ve deployed that, your query filter should get used when searches are performed.
plugins和class加载到nutch的问题集合
对plugin开发者来讲最棒的事情就是自由了,能够不去理会别的plugin的开发者在作什么,能够自由的使用第三方的jar库。
nutch是怎样解决类加载这个问题的?
Nutch使用了一个很是容易的方法,每个plugin都有一个属于本身的类加载器,这个class-loader在plugin启动之前将会被初始化
写plugin-by stefan
nutch 0.7中的plugins
若是你要在nutch中应用这些插件,你只须要编辑conf/nutch-site.xml,把你所要用的plugin的名字加入plugin.includes的列表中
原文地址:http://blog.csdn.net/geogre_jsj/article/details/5726646