亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

淺談Nutch插件機(jī)制(含開(kāi)發(fā)實(shí)例)

系統(tǒng) 1874 0

plugin(插件)為nutch提供了一些功能強(qiáng)大的部件,舉個(gè)例子, HtmlParser 就是使用比較普遍的用來(lái)分析nutch抓取的html文件的插件。

?????? 為什么nutch要使用這樣的plugin系統(tǒng)?

???? ??? 有三個(gè)原因:

1:可擴(kuò)展性

?????? 通過(guò)plugin,nutch允許任何人擴(kuò)展它的功能,而我們要做的只是對(duì)給定的接口做簡(jiǎn)單的實(shí)現(xiàn),舉個(gè)例子:MSWordParser這個(gè)插件是用來(lái)分析wordwendang的,它就是一個(gè)對(duì)parser這個(gè)接口的實(shí)現(xiàn)

2:靈活性

????? 因?yàn)槊總€(gè)人都可以根據(jù)自己的需求而寫(xiě)自己的plugin,這樣plugin就會(huì)有一個(gè)很強(qiáng)大的資源庫(kù)。這樣對(duì)與應(yīng)用nutch程序員來(lái)說(shuō),他可以在自己的搜索引擎上安裝符合自己需求的插件,而這些插件就在nutch的plugins中。這對(duì)于正在應(yīng)用nutch的開(kāi)發(fā)者來(lái)說(shuō)應(yīng)該是一個(gè)巨大的福音,因?yàn)槟阌辛烁嗟年P(guān)于內(nèi)容抽取的算法來(lái)選擇,很容易就增加了pdf的分析。

3:可維護(hù)性

每個(gè)開(kāi)發(fā)者只要關(guān)注自己的問(wèn)題。對(duì)于內(nèi)核的開(kāi)發(fā)者在為引擎內(nèi)核擴(kuò)展的同時(shí),為a plug添加一個(gè)描述它的接口就可以了。一個(gè)plugin的開(kāi)發(fā)者只要關(guān)注這個(gè)plugin所要實(shí)現(xiàn)的功能,而不需要知道整個(gè)系統(tǒng)是怎么工作的。它們僅僅需要知道的是plugin和plug之間交換的數(shù)據(jù)類(lèi)型。這使得內(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(查詢)都是通過(guò)不同的plugins來(lái)實(shí)現(xiàn)的。

在編寫(xiě)一個(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ì)在分析的過(guò)程中順序的逐個(gè)運(yùn)行

??? Ontology

??? Parser

??? 實(shí)現(xiàn)這個(gè)接口的parser讀取所抓取的document,摘取將被索引的數(shù)據(jù)。如果你要在nutch中為擴(kuò)展分析一個(gè)新內(nèi)容類(lè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)頁(yè)的urls進(jìn)行限制,RegexURLFilter提供了通過(guò)正則表達(dá)式來(lái)對(duì)Nutch爬行網(wǎng)頁(yè)的urls的控制。如果你對(duì)urls還有更加復(fù)雜的控制要求,你可以編寫(xiě)對(duì)這個(gè)urlfilter的實(shí)現(xiàn)

NutchAnalyser

為許多語(yǔ)言特定的分析器提供了擴(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)中的一些概念

?

編寫(xiě)一個(gè)pluginExample

??????? 思考編寫(xiě)這樣的一個(gè)plugin:我們想為一個(gè)給定的search term推薦一些與之相關(guān)的網(wǎng)頁(yè)。舉個(gè)例子,假設(shè)我們正在索引網(wǎng)頁(yè),當(dāng)我們注意到有一組網(wǎng)頁(yè)的內(nèi)容是關(guān)于plugin的,所以我們想如果當(dāng)某人查詢plugin的時(shí)候,我們可以推薦他到pluginCentral這個(gè)網(wǎng)頁(yè),但是同時(shí),也要返回在一般邏輯中的查詢結(jié)果所有的hits。所以我們將查詢結(jié)果分成了推薦結(jié)果和一般查詢結(jié)果。

??????? 你瀏覽你的網(wǎng)頁(yè)然后把一個(gè)meta-tags加入網(wǎng)頁(yè)中,它會(huì)告訴plugin這個(gè)網(wǎng)頁(yè)是應(yīng)該被推薦的。這個(gè)tags應(yīng)該像這樣

    <meta name="recommended" content="plugins" />
  
    為了達(dá)到目標(biāo)我們需要寫(xiě)一個(gè)plugin,這個(gè)plugin擴(kuò)展3個(gè)不同的擴(kuò)展點(diǎn),它們是:
  
    HTMLParser:從meta-tags得到推薦的terms
  
    IndexingFilter:增加一個(gè)推薦Field在索引中。
  
    QueryFilter:增加對(duì)索引中新Field的查詢能力
  
     要建立的文件
  
     首先在plugin的目錄中新建一個(gè)目錄來(lái)盛放自己的的plugin,整個(gè)plugin我們?nèi)∶麨閞ecommended,然后在這個(gè)目錄里面
  
     依次建立以下文件:
  
     a plugin.xml,這個(gè)文件用來(lái)向Nutch描述我們新建的plugin
  
     a build.xml這個(gè)文件告訴編譯器應(yīng)該怎樣build這個(gè)plugin
  
     plugin的源代碼則保存在/src/java/org/apache/nutch/parse/recommended/[這里]
  
Plugin.xml

你所建立的plugin.xml應(yīng)該這樣:??

    <?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>
  
Build.xml
    <?xml version="1.0"?>

<project name="recommended" default="jar">

<import file="../build-plugin.xml"/>

</project>
  

???

?

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文件中尋找有沒(méi)有標(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)行編輯,把
  
    以下的代碼加入
  
    <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對(duì)你的plugin進(jìn)行編譯
  
    在之前我們要編輯一下src/plugin/build.xml 這個(gè)文件,這是對(duì)編譯和部署做一些設(shè)置
  
    你會(huì)看到有很多如下形式的行
  
    <ant dir="[plugin-name]" target="deploy" />
  
    在</target>前添加一新行
  
    ??? <ant dir="reccomended" target="deploy" />
  

Running ‘a(chǎn)nt’ 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 ‘a(chǎn)nt 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的問(wèn)題集合

對(duì)plugin開(kāi)發(fā)者來(lái)說(shuō)最棒的事情就是自由了,可以不去理會(huì)別的plugin的開(kāi)發(fā)者在做什么,可以自由的使用第三方的jar庫(kù)。

nutch是怎樣解決類(lèi)加載這個(gè)問(wèn)題的?

Nutch使用了一個(gè)非常容易的方法,每一個(gè)plugin都有一個(gè)屬于自己的類(lèi)加載器,這個(gè)class-loader在plugin啟動(dòng)以前將會(huì)被初始化

???????? 寫(xiě)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? [WWW] ?rel-tag ?fields to the index and runs queries against them.
  • parse-zip

?原文地址: http://blog.csdn.net/geogre_jsj/article/details/5726646

淺談Nutch插件機(jī)制(含開(kāi)發(fā)實(shí)例)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲综合插| 青青青永久免费视频 | 羞羞视频网 | 亚洲欧美日韩中文字幕在线 | 精品少妇一区二区三区视频 | 日本高清毛片视频在线看 | 成人欧美精品一区二区不卡 | 亚洲+自拍+色综合图区一 | 欧美国产日韩精品 | 亚洲精品一区二区 | 国产激情一区二区三区在线观看 | 中文字幕亚洲精品久久 | 狠狠操综合网 | 欧美一区在线观看视频 | 日本伦理中文字幕 | 国产精品九九九久久九九 | 一区二区伦理 | 欧美三级成人理伦 | 亚洲欧美日韩国产vr在线观 | 九九99re在线视频精品免费 | a一级特黄日本大片 s色 | 欧美日韩国产综合一区二区三区 | 国内精品久久久久久影院老狼 | 国产亚洲精品美女2020久久 | 欧美一级www片免费观看 | 日本高清中文字幕在线观穿线视频 | 一级特级毛片 | 一区二区中文字幕在线观看 | 欧美天天爽 | 夜鲁夜鲁夜鲁在线观看福利 | 特黄特黄一级片 | 99精品亚洲| 久久99免费 | 五月婷婷在线观看视频 | 中文字幕国产综合 | 国产成年网站v片在线观看 国产成人 免费观看 | 国产日韩欧美在线观看免费视频 | 国产女人精品性视频 | 国产50岁老熟妇毛片 | 久久久久国产 | 免费黄视频网站 |