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>