1. 程式人生 > >nutch 外掛開發[資料整理]

nutch 外掛開發[資料整理]

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

nutch使用這樣的plugin系統有什麼好處:

1:可擴充套件性       通過plugin,nutch允許任何人擴充套件它的功能,而我們要做的只是對給定的介面做簡單的實現,舉個例子:我們在NUTCH裡使用LOADBALANCE進行下載的外掛,它就是一個對protocol這個介面的實現。


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


3:可維護性
每個開發者只要關注自己的問題。對於核心的開發者在為引擎核心擴充套件的同時,為plugin新增一個描述它的介面就可以了。一個plugin的開發者只要關注這個plugin所要實現的功能,而不需要知道整個系統是怎麼工作的。它們僅僅需要知道的是plugin和plug之間交換的資料型別。這使得核心更加簡單,更容易維護。


plugin的工作原理


nutch的plugin系統是基於Eclipse 2.x中對外掛的使用。plugins對nutch的工作是很重要的。nutch中的fetch(下載)、parsing(分析),indexing(索引),searching(查詢)等都是通過不同的plugins來實現的。

在編寫一個plugin的時候,要為一個擴充套件點新增一個或者更多的擴充套件項。這些Nutch的擴充套件點是Nutch在一個plugin中已經定義好了,這個plugin是NutchExtensionPoints(所有的擴充套件點都會在NutchExtensionPoints 的plugin.xml這個檔案中列出)。每一個擴充套件點都定義了一個介面,這個介面在擴充套件時必須被實現。

nutchExtensionPoints

這些擴充套件點如下:
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進行合併、過濾。

plugin的內部結構




protocol擴充套件點外掛開發

以protocol擴充套件點為例,我們對NUTCH中的資料下載方式進行改變,使用我們的方式進行下載。
首先,新建原始碼目錄,目錄中包含3個xml,一個源程式目錄。

plugin.xml :向nutch描述這個plugin的資訊
build.xml :告訴ant怎樣編譯這個plugin
Ivy.xml:這個plugin的ivy配置資訊

源程式有兩個JAVA類:

Http.java:實現protocol介面 ,這裡為簡便,繼承自httpbase類,httpbase類是一個API意義的類,實現了protocol介面,這樣我們可減少很多工作。


HttpReponse.java:用於實現下載並返回資訊。

圖1:


圖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>


實現介面編寫程式碼完畢後修改配置步驟如下:

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

如果要在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>