為什么nutch要使用這樣的plugin系統(tǒng)?
有三個(gè)原因:
1:可擴(kuò)展性
通過plugin,nutch允許任何人擴(kuò)展它的功能,而我們要做的只是對(duì)給定的接口做簡(jiǎn)單的實(shí)現(xiàn),舉個(gè)例子:MSWordParser這個(gè)插件是用來分析wordwendang的,它就是一個(gè)對(duì)parser這個(gè)接口的實(shí)現(xiàn)
2:靈活性
因?yàn)槊總€(gè)人都可以根據(jù)自己的需求而寫自己的plugin,這樣plugin就會(huì)有一個(gè)很強(qiáng)大的資源庫。這樣對(duì)與應(yīng)用nutch程序員來說,他可以在自己的搜索引擎上安裝符合自己需求的插件,而這些插件就在nutch的plugins中。這對(duì)于正在應(yīng)用nutch的開發(fā)者來說應(yīng)該是一個(gè)巨大的福音,因?yàn)槟阌辛烁嗟年P(guān)于內(nèi)容抽取的算法來選擇,很容易就增加了pdf的分析。
3:可維護(hù)性
每個(gè)開發(fā)者只要關(guān)注自己的問題。對(duì)于內(nèi)核的開發(fā)者在為引擎內(nèi)核擴(kuò)展的同時(shí),為a plug添加一個(gè)描述它的接口就可以了。一個(gè)plugin的開發(fā)者只要關(guān)注這個(gè)plugin所要實(shí)現(xiàn)的功能,而不需要知道整個(gè)系統(tǒng)是怎么工作的。它們僅僅需要知道的是plugin和plug之間交換的數(shù)據(jù)類型。這使得內(nèi)核更加簡(jiǎn)單,更容易維護(hù)。
plugin相關(guān)--什么是plugin,plugin的工作原理
nutch的plugin系統(tǒng)是基于Eclipse 2.x中對(duì)插件的使用。plugins對(duì)nutch的工作是很重要的。所有的nutch中的parsing(分析),indexing(索引),searching(查詢)都是通過不同的plugins來實(shí)現(xiàn)的。
在編寫一個(gè)plugin的時(shí)候,你要為一個(gè)擴(kuò)展點(diǎn)添加一個(gè)或者更多的擴(kuò)展項(xiàng)。這些Nutch的擴(kuò)展點(diǎn)是Nutch在一個(gè)plugin中已經(jīng)定義好了,這個(gè)plugin是NutchExtensionPoints(所有的擴(kuò)展點(diǎn)都會(huì)在NutchExtensionPoints plugin.xml這個(gè)文件中列出)。每一個(gè)擴(kuò)展點(diǎn)都定義了一個(gè)接口,這個(gè)接口在擴(kuò)展時(shí)必須被實(shí)現(xiàn)。這些擴(kuò)展點(diǎn)如下:
onlineClusterer-為在線的查詢結(jié)果提供分組算法的擴(kuò)展點(diǎn)的接口
indexingFiltering-允許為所索引中的Field添加元數(shù)據(jù)。所有的實(shí)現(xiàn)了這個(gè)接口plugin會(huì)在分析的過程中順序的逐個(gè)運(yùn)行
Ontology
Parser
實(shí)現(xiàn)這個(gè)接口的parser讀取所抓取的document,摘取將被索引的數(shù)據(jù)。如果你要在nutch中為擴(kuò)展分析一個(gè)新內(nèi)容類型或者從現(xiàn)有的可分析的內(nèi)容摘取更多的數(shù)據(jù)。
HtmlParseFilter
為html parser添加額外的元數(shù)據(jù)
protocol
實(shí)現(xiàn)Protocol的plugin可以使得nutch能使用更多的網(wǎng)絡(luò)協(xié)議(ftp,http)去抓取數(shù)據(jù)
QueryFilter
為查詢轉(zhuǎn)換的擴(kuò)展點(diǎn)
URLFileter
實(shí)現(xiàn)這個(gè)擴(kuò)展點(diǎn)的plugin會(huì)對(duì)nutch要抓取的網(wǎng)頁的urls進(jìn)行限制,RegexURLFilter提供了通過正則表達(dá)式來對(duì)Nutch爬行網(wǎng)頁的urls的控制。如果你對(duì)urls還有更加復(fù)雜的控制要求,你可以編寫對(duì)這個(gè)urlfilter的實(shí)現(xiàn)
NutchAnalyser
為許多語言特定的分析器提供了擴(kuò)展點(diǎn)
源文件
在plugin的源文件目錄中你會(huì)找到以下的文件
plugin.xml 向nutch描述這個(gè)plugin的信息
build.xml 告訴ant怎樣編譯這個(gè)plugin
plugin的源碼
在Nutch使用plugin
如果要在Nutch使用一個(gè)給定的plugin,你需要對(duì)conf/nutch-site.xml進(jìn)行編輯并且把plugin的名字添加到plugin.includes中
Nutch plugin系統(tǒng)中的一些概念
編寫一個(gè)pluginExample
思考編寫這樣的一個(gè)plugin:我們想為一個(gè)給定的search term推薦一些與之相關(guān)的網(wǎng)頁。舉個(gè)例子,假設(shè)我們正在索引網(wǎng)頁,當(dāng)我們注意到有一組網(wǎng)頁的內(nèi)容是關(guān)于plugin的,所以我們想如果當(dāng)某人查詢plugin的時(shí)候,我們可以推薦他到pluginCentral這個(gè)網(wǎng)頁,但是同時(shí),也要返回在一般邏輯中的查詢結(jié)果所有的hits。所以我們將查詢結(jié)果分成了推薦結(jié)果和一般查詢結(jié)果。
你瀏覽你的網(wǎng)頁然后把一個(gè)meta-tags加入網(wǎng)頁中,它會(huì)告訴plugin這個(gè)網(wǎng)頁是應(yīng)該被推薦的。這個(gè)tags應(yīng)該像這樣
為了達(dá)到目標(biāo)我們需要寫一個(gè)plugin,這個(gè)plugin擴(kuò)展3個(gè)不同的擴(kuò)展點(diǎn),它們是:HTMLParser:從meta-tags得到推薦的termsIndexingFilter:增加一個(gè)推薦Field在索引中。QueryFilter:增加對(duì)索引中新Field的查詢能力 要建立的文件首先在plugin的目錄中新建一個(gè)目錄來盛放自己的的plugin,整個(gè)plugin我們?nèi)∶麨閞ecommended,然后在這個(gè)目錄里面依次建立以下文件:a plugin.xml,這個(gè)文件用來向Nutch描述我們新建的plugina build.xml這個(gè)文件告訴編譯器應(yīng)該怎樣build這個(gè)pluginplugin的源代碼則保存在/src/java/org/apache/nutch/parse/recommended/[這里] Plugin.xml
你所建立的plugin.xml應(yīng)該這樣:
id="recommended"
name="Recommended Parser/Filter"
version="0.0.1"
provider-name="nutch.org">
name="Recommended Parser"
point="org.apache.nutch.parse.HtmlParseFilter">
class="org.apache.nutch.parse.recommended.RecommendedParser"/>
name="Recommended identifier filter"
point="org.apache.nutch.indexer.IndexingFilter">
class="org.apache.nutch.parse.recommended.RecommendedIndexer"/>
name="Recommended Search Query Filter"
point="org.apache.nutch.searcher.QueryFilter">
class="org.apache.nutch.parse.recommended.RecommendedQueryFilter"
fields="DEFAULT"/>
Build.xml
The HTML Parser Extension
這是對(duì)HtmlParserExtension這個(gè)擴(kuò)展點(diǎn)的實(shí)現(xiàn),它的作用是抓取那些標(biāo)meta-tags的內(nèi)容,這樣把它們加入正在分析的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文件中尋找有沒有標(biāo)有meta-tags的內(nèi)容 */
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;
}
}The Indexer Extension
這是對(duì)索引點(diǎn)的擴(kuò)展,如果查找到帶有meta-tags的內(nèi)容,就把它命名’’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;
}
}The QueryFilter
當(dāng)用戶進(jìn)行查找操作的時(shí)候,QueryFilter就會(huì)被調(diào)用,而且對(duì)于recommeded中的boost值會(huì)影響查詢結(jié)果的排序。
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,你需要對(duì)conf/nuthc-site.xml這個(gè)文件進(jìn)行編輯,把以下的代碼加入 plugin.includes
nutch-extensionpoints|protocol-http|urlfilter-regex|parse-(text|html)|index-basic|query-(basic|site|url)|recommended
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.
使用Ant對(duì)你的plugin進(jìn)行編譯在之前我們要編輯一下src/plugin/build.xml 這個(gè)文件,這是對(duì)編譯和部署做一些設(shè)置你會(huì)看到有很多如下形式的行在前添加一新行 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的問題集合
對(duì)plugin開發(fā)者來說最棒的事情就是自由了,可以不去理會(huì)別的plugin的開發(fā)者在做什么,可以自由的使用第三方的jar庫。
nutch是怎樣解決類加載這個(gè)問題的?
Nutch使用了一個(gè)非常容易的方法,每一個(gè)plugin都有一個(gè)屬于自己的類加載器,這個(gè)class-loader在plugin啟動(dòng)以前將會(huì)被初始化
寫plugin-by stefan
nutch 0.7中的plugins
如果你要在nutch中應(yīng)用這些插件,你只需要編輯conf/nutch-site.xml,把你所要用的plugin的名字加入plugin.includes的列表中
clustering-carrot2 - Online Search Results Clustering using Carrot2’s Lingo component.
creativecommons - Support for crawling and searching Creative-Commons licensed content.
index-basic - Adds url, content and anchor fields to the index.
index-more - Adds date, content-length, contentType, primaryType and subtype fields to the index.
languageidentifier - Adds a lang field to the index and allows you to query against it.
ontology - Helps refine queries based on owl files.
parse-ext - A wrapper that invokes external command to do real parsing job.
parse-html - Parses HTML documents
parse-js - Parses JavaScript
parse-mp3 - Parses MP3s
parse-msword - Parses MS Word documents
parse-pdf - Parses PDFs
parse-rss - Parses RSS feeds
parse-rtf - Parses RTF files
parse-text - Parses text documents
protocol-file - Retreives documents from the filesystem
protocol-ftp - Retreives documents through ftp
protocol-http - Retreives documents through http
protocol-httpclient - Retreives documents through http and https
query-basic - Runs queries against content, url and anchor fields
query-more - Runs queries against date, content-length, contentType, primaryType and subType fields.
query-site - Runs queries against site field
query-url - Runs queries against url field.
urlfilter-prefix
urlfilter-regex
Additional Plugins in Dev Branch (0.8)
analysis-de
analysis-fr
lib-commons-httpclient
lib-http
lib-jakarta-poi
lib-log4j
lib-lucene-analyzers
lib-nekohtml
lib-parsems
parse-msexcel - Parses MS Excel documents
parse-mspowerpoint - Parses MS Powerpoint documents
parse-oo - Parses Open Office and Star Office documents (Extentsions: ODT, OTT, ODH, ODM, ODS, OTS, ODP, OTP, SXW, STW, SXC, STC, SXI, STI)
parse-swf - Parses Flash SWF files
microformats-reltag - Adds rel-tag fields to the index and runs queries against them.
parse-zip
有三個(gè)原因:
1:可擴(kuò)展性
通過plugin,nutch允許任何人擴(kuò)展它的功能,而我們要做的只是對(duì)給定的接口做簡(jiǎn)單的實(shí)現(xiàn),舉個(gè)例子:MSWordParser這個(gè)插件是用來分析wordwendang的,它就是一個(gè)對(duì)parser這個(gè)接口的實(shí)現(xiàn)
2:靈活性
因?yàn)槊總€(gè)人都可以根據(jù)自己的需求而寫自己的plugin,這樣plugin就會(huì)有一個(gè)很強(qiáng)大的資源庫。這樣對(duì)與應(yīng)用nutch程序員來說,他可以在自己的搜索引擎上安裝符合自己需求的插件,而這些插件就在nutch的plugins中。這對(duì)于正在應(yīng)用nutch的開發(fā)者來說應(yīng)該是一個(gè)巨大的福音,因?yàn)槟阌辛烁嗟年P(guān)于內(nèi)容抽取的算法來選擇,很容易就增加了pdf的分析。
3:可維護(hù)性
每個(gè)開發(fā)者只要關(guān)注自己的問題。對(duì)于內(nèi)核的開發(fā)者在為引擎內(nèi)核擴(kuò)展的同時(shí),為a plug添加一個(gè)描述它的接口就可以了。一個(gè)plugin的開發(fā)者只要關(guān)注這個(gè)plugin所要實(shí)現(xiàn)的功能,而不需要知道整個(gè)系統(tǒng)是怎么工作的。它們僅僅需要知道的是plugin和plug之間交換的數(shù)據(jù)類型。這使得內(nèi)核更加簡(jiǎn)單,更容易維護(hù)。
plugin相關(guān)--什么是plugin,plugin的工作原理
nutch的plugin系統(tǒng)是基于Eclipse 2.x中對(duì)插件的使用。plugins對(duì)nutch的工作是很重要的。所有的nutch中的parsing(分析),indexing(索引),searching(查詢)都是通過不同的plugins來實(shí)現(xiàn)的。
在編寫一個(gè)plugin的時(shí)候,你要為一個(gè)擴(kuò)展點(diǎn)添加一個(gè)或者更多的擴(kuò)展項(xiàng)。這些Nutch的擴(kuò)展點(diǎn)是Nutch在一個(gè)plugin中已經(jīng)定義好了,這個(gè)plugin是NutchExtensionPoints(所有的擴(kuò)展點(diǎn)都會(huì)在NutchExtensionPoints plugin.xml這個(gè)文件中列出)。每一個(gè)擴(kuò)展點(diǎn)都定義了一個(gè)接口,這個(gè)接口在擴(kuò)展時(shí)必須被實(shí)現(xiàn)。這些擴(kuò)展點(diǎn)如下:
onlineClusterer-為在線的查詢結(jié)果提供分組算法的擴(kuò)展點(diǎn)的接口
indexingFiltering-允許為所索引中的Field添加元數(shù)據(jù)。所有的實(shí)現(xiàn)了這個(gè)接口plugin會(huì)在分析的過程中順序的逐個(gè)運(yùn)行
Ontology
Parser
實(shí)現(xiàn)這個(gè)接口的parser讀取所抓取的document,摘取將被索引的數(shù)據(jù)。如果你要在nutch中為擴(kuò)展分析一個(gè)新內(nèi)容類型或者從現(xiàn)有的可分析的內(nèi)容摘取更多的數(shù)據(jù)。
HtmlParseFilter
為html parser添加額外的元數(shù)據(jù)
protocol
實(shí)現(xiàn)Protocol的plugin可以使得nutch能使用更多的網(wǎng)絡(luò)協(xié)議(ftp,http)去抓取數(shù)據(jù)
QueryFilter
為查詢轉(zhuǎn)換的擴(kuò)展點(diǎn)
URLFileter
實(shí)現(xiàn)這個(gè)擴(kuò)展點(diǎn)的plugin會(huì)對(duì)nutch要抓取的網(wǎng)頁的urls進(jìn)行限制,RegexURLFilter提供了通過正則表達(dá)式來對(duì)Nutch爬行網(wǎng)頁的urls的控制。如果你對(duì)urls還有更加復(fù)雜的控制要求,你可以編寫對(duì)這個(gè)urlfilter的實(shí)現(xiàn)
NutchAnalyser
為許多語言特定的分析器提供了擴(kuò)展點(diǎn)
源文件
在plugin的源文件目錄中你會(huì)找到以下的文件
plugin.xml 向nutch描述這個(gè)plugin的信息
build.xml 告訴ant怎樣編譯這個(gè)plugin
plugin的源碼
在Nutch使用plugin
如果要在Nutch使用一個(gè)給定的plugin,你需要對(duì)conf/nutch-site.xml進(jìn)行編輯并且把plugin的名字添加到plugin.includes中
Nutch plugin系統(tǒng)中的一些概念
編寫一個(gè)pluginExample
思考編寫這樣的一個(gè)plugin:我們想為一個(gè)給定的search term推薦一些與之相關(guān)的網(wǎng)頁。舉個(gè)例子,假設(shè)我們正在索引網(wǎng)頁,當(dāng)我們注意到有一組網(wǎng)頁的內(nèi)容是關(guān)于plugin的,所以我們想如果當(dāng)某人查詢plugin的時(shí)候,我們可以推薦他到pluginCentral這個(gè)網(wǎng)頁,但是同時(shí),也要返回在一般邏輯中的查詢結(jié)果所有的hits。所以我們將查詢結(jié)果分成了推薦結(jié)果和一般查詢結(jié)果。
你瀏覽你的網(wǎng)頁然后把一個(gè)meta-tags加入網(wǎng)頁中,它會(huì)告訴plugin這個(gè)網(wǎng)頁是應(yīng)該被推薦的。這個(gè)tags應(yīng)該像這樣
為了達(dá)到目標(biāo)我們需要寫一個(gè)plugin,這個(gè)plugin擴(kuò)展3個(gè)不同的擴(kuò)展點(diǎn),它們是:HTMLParser:從meta-tags得到推薦的termsIndexingFilter:增加一個(gè)推薦Field在索引中。QueryFilter:增加對(duì)索引中新Field的查詢能力 要建立的文件首先在plugin的目錄中新建一個(gè)目錄來盛放自己的的plugin,整個(gè)plugin我們?nèi)∶麨閞ecommended,然后在這個(gè)目錄里面依次建立以下文件:a plugin.xml,這個(gè)文件用來向Nutch描述我們新建的plugina build.xml這個(gè)文件告訴編譯器應(yīng)該怎樣build這個(gè)pluginplugin的源代碼則保存在/src/java/org/apache/nutch/parse/recommended/[這里] Plugin.xml
你所建立的plugin.xml應(yīng)該這樣:
name="Recommended Parser/Filter"
version="0.0.1"
provider-name="nutch.org">
point="org.apache.nutch.parse.HtmlParseFilter">
point="org.apache.nutch.indexer.IndexingFilter">
point="org.apache.nutch.searcher.QueryFilter">
fields="DEFAULT"/>
The HTML Parser Extension
這是對(duì)HtmlParserExtension這個(gè)擴(kuò)展點(diǎn)的實(shí)現(xiàn),它的作用是抓取那些標(biāo)meta-tags的內(nèi)容,這樣把它們加入正在分析的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文件中尋找有沒有標(biāo)有meta-tags的內(nèi)容 */
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;
}
}The Indexer Extension
這是對(duì)索引點(diǎn)的擴(kuò)展,如果查找到帶有meta-tags的內(nèi)容,就把它命名’’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;
}
}The QueryFilter
當(dāng)用戶進(jìn)行查找操作的時(shí)候,QueryFilter就會(huì)被調(diào)用,而且對(duì)于recommeded中的boost值會(huì)影響查詢結(jié)果的排序。
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,你需要對(duì)conf/nuthc-site.xml這個(gè)文件進(jìn)行編輯,把以下的代碼加入
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.
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的問題集合
對(duì)plugin開發(fā)者來說最棒的事情就是自由了,可以不去理會(huì)別的plugin的開發(fā)者在做什么,可以自由的使用第三方的jar庫。
nutch是怎樣解決類加載這個(gè)問題的?
Nutch使用了一個(gè)非常容易的方法,每一個(gè)plugin都有一個(gè)屬于自己的類加載器,這個(gè)class-loader在plugin啟動(dòng)以前將會(huì)被初始化
寫plugin-by stefan
nutch 0.7中的plugins
如果你要在nutch中應(yīng)用這些插件,你只需要編輯conf/nutch-site.xml,把你所要用的plugin的名字加入plugin.includes的列表中
clustering-carrot2 - Online Search Results Clustering using Carrot2’s Lingo component.
creativecommons - Support for crawling and searching Creative-Commons licensed content.
index-basic - Adds url, content and anchor fields to the index.
index-more - Adds date, content-length, contentType, primaryType and subtype fields to the index.
languageidentifier - Adds a lang field to the index and allows you to query against it.
ontology - Helps refine queries based on owl files.
parse-ext - A wrapper that invokes external command to do real parsing job.
parse-html - Parses HTML documents
parse-js - Parses JavaScript
parse-mp3 - Parses MP3s
parse-msword - Parses MS Word documents
parse-pdf - Parses PDFs
parse-rss - Parses RSS feeds
parse-rtf - Parses RTF files
parse-text - Parses text documents
protocol-file - Retreives documents from the filesystem
protocol-ftp - Retreives documents through ftp
protocol-http - Retreives documents through http
protocol-httpclient - Retreives documents through http and https
query-basic - Runs queries against content, url and anchor fields
query-more - Runs queries against date, content-length, contentType, primaryType and subType fields.
query-site - Runs queries against site field
query-url - Runs queries against url field.
urlfilter-prefix
urlfilter-regex
Additional Plugins in Dev Branch (0.8)
analysis-de
analysis-fr
lib-commons-httpclient
lib-http
lib-jakarta-poi
lib-log4j
lib-lucene-analyzers
lib-nekohtml
lib-parsems
parse-msexcel - Parses MS Excel documents
parse-mspowerpoint - Parses MS Powerpoint documents
parse-oo - Parses Open Office and Star Office documents (Extentsions: ODT, OTT, ODH, ODM, ODS, OTS, ODP, OTP, SXW, STW, SXC, STC, SXI, STI)
parse-swf - Parses Flash SWF files
microformats-reltag - Adds rel-tag fields to the index and runs queries against them.
parse-zip