天天看點

轉 nutch 插件開發[資料整理]

plugin(插件)為nutch提供了一些功能強大的部件,nutch中很多功能都是使用插件實作的,而使用者也可以自行開發更多适合自已的插件。

1:可擴充性       通過plugin,nutch允許任何人擴充它的功能,而我們要做的隻是對給定的接口做簡單的實作,舉個例子:我們在nutch裡使用loadbalance進行下載下傳的插件,它就是一個對protocol這個接口的實作。

2:靈活性      因為每個人都可以根據自己的需求而寫自己的plugin,這樣plugin就會有一個很強大的資源庫。這樣對應用nutch程式員來說,他可以在自己的搜尋引擎上安裝符合自己需求的插件,而這些插件就在nutch的plugins中。這對于正在應用nutch的開發者來說應該是一個巨大的福音,因為你有了更多的關于内容抽取的算法來選擇,很容易就增加了各種過濾規則、下載下傳方式、解析檔案類型等。

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這個檔案中列出)。每一個擴充點都定義了一個接口,這個接口在擴充時必須被實作。

轉 nutch 插件開發[資料整理]

這些擴充點如下:

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進行合并、過濾。

轉 nutch 插件開發[資料整理]

以protocol擴充點為例,我們對nutch中的資料下載下傳方式進行改變,使用我們的方式進行下載下傳。

首先,建立源碼目錄,目錄中包含3個xml,一個源程式目錄。

plugin.xml :向nutch描述這個plugin的資訊

build.xml :告訴ant怎樣編譯這個plugin

ivy.xml:這個plugin的ivy配置資訊

源程式有兩個java類:

http.java:實作protocol接口 ,這裡為簡便,繼承自httpbase類,httpbase類是一個api意義的類,實作了protocol接口,這樣我們可減少很多工作。

轉 nutch 插件開發[資料整理]

httpreponse.java:用于實作下載下傳并傳回資訊。

圖1:

轉 nutch 插件開發[資料整理]

圖2,接上圖:

轉 nutch 插件開發[資料整理]

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>

實作接口編寫代碼完畢後修改配置步驟如下:

1、src/plugin/build.xml中,在

<target name="deploy">;

<target name="test">;

<target name="clean">;

分别增加相應配置,将我們新開發的插件添加進去,如:

<ant dir="protocol-http-netty" target="deploy">

 2、修改nutch/build.xml檔案在

<target name="release" depends="compile-core" description="generate the release distribution">

中增加配置如:

<packageset dir="${plugins.dir}/protocol-http-netty/src/java"/>

 3、 注意檢查${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>

<name>plugin.includes</name>

<value>nutch-extensionpoints|protocol-http|urlfilter-regex|parse-(text|html)|index-basic|query-(basic|site|url)|recommended

</value>