plugin(插件)为nutch提供了一些功能强大的部件,举个例子,HtmlParser就是使用比较普遍的用来分析nutch抓取的html文件的插件。

为什么nutch要使用这样的plugin系统?

        有三个原因:

1:可扩展性

通过plugin,nutch允许任何人扩展它的功能,而我们要做的只是对给定的接口做简单的实现,举个例子:MSWordParser这个插件是用来分析wordwendang的,它就是一个对parser这个接口的实现

2:灵活性

因为每个人都可以根据自己的需求而写自己的plugin,这样plugin就会有一个很强大的资源库。这样对与应用nutch程序员来说,他可以在自己的搜索引擎上安装符合自己需求的插件,而这些插件就在nutch的plugins中。这对于正在应用nutch的开发者来说应该是一个巨大的福音,因为你有了更多的关于内容抽取的算法来选择,很容易就增加了pdf的分析。

3:可维护性

每个开发者只要关注自己的问题。对于内核的开发者在为引擎内核扩展的同时,为a plug添加一个描述它的接口就可以了。一个plugin的开发者只要关注这个plugin所要实现的功能,而不需要知道整个系统是怎么工作的。它们仅仅需要知道的是plugin和plug之间交换的数据类型。这使得内核更加简单,更容易维护。

plugin相关--什么是plugin,plugin的工作原理

nutch的plugin系统是基于Eclipse 2.x中对插件的使用。plugins对nutch的工作是很重要的。所有的nutch中的parsing(分析),indexing(索引),searching(查询)都是通过不同的plugins来实现的。

在编写一个plugin的时候,你要为一个扩展点添加一个或者更多的扩展项。这些Nutch的扩展点是Nutch在一个plugin中已经定义好了,这个plugin是NutchExtensionPoints(所有的扩展点都会在NutchExtensionPointsplugin.xml这个文件中列出)。每一个扩展点都定义了一个接口,这个接口在扩展时必须被实现。这些扩展点如下:

onlineClusterer-为在线的查询结果提供分组算法的扩展点的接口

indexingFiltering-允许为所索引中的Field添加元数据。所有的实现了这个接口plugin会在分析的过程中顺序的逐个运行

Ontology

Parser

实现这个接口的parser读取所抓取的document,摘取将被索引的数据。如果你要在nutch中为扩展分析一个新内容类型或者从现有的可分析的内容摘取更多的数据。

HtmlParseFilter

为html parser添加额外的元数据

protocol

实现Protocol的plugin可以使得nutch能使用更多的网络协议(ftp,http)去抓取数据

QueryFilter

为查询转换的扩展点

URLFileter

实现这个扩展点的plugin会对nutch要抓取的网页的urls进行限制,RegexURLFilter提供了通过正则表达式来对Nutch爬行网页的urls的控制。如果你对urls还有更加复杂的控制要求,你可以编写对这个urlfilter的实现

NutchAnalyser

为许多语言特定的分析器提供了扩展点

源文件

在plugin的源文件目录中你会找到以下的文件

plugin.xml     向nutch描述这个plugin的信息

build.xml      告诉ant怎样编译这个plugin

plugin的源码

在Nutch使用plugin

如果要在Nutch使用一个给定的plugin,你需要对conf/nutch-site.xml进行编辑并且把plugin的名字添加到plugin.includes中

Nutch plugin系统中的一些概念

 

编写一个pluginExample

思考编写这样的一个plugin:我们想为一个给定的search term推荐一些与之相关的网页。举个例子,假设我们正在索引网页,当我们注意到有一组网页的内容是关于plugin的,所以我们想如果当某人查询plugin的时候,我们可以推荐他到pluginCentral这个网页,但是同时,也要返回在一般逻辑中的查询结果所有的hits。所以我们将查询结果分成了推荐结果和一般查询结果。

你浏览你的网页然后把一个meta-tags加入网页中,它会告诉plugin这个网页是应该被推荐的。这个tags应该像这样

<meta name="recommended" content="plugins" />
为了达到目标我们需要写一个plugin,这个plugin扩展3个不同的扩展点,它们是:
HTMLParser:从meta-tags得到推荐的terms
IndexingFilter:增加一个推荐Field在索引中。
QueryFilter:增加对索引中新Field的查询能力
 要建立的文件
 首先在plugin的目录中新建一个目录来盛放自己的的plugin,整个plugin我们取名为recommended,然后在这个目录里面
 依次建立以下文件:
 a plugin.xml,这个文件用来向Nutch描述我们新建的plugin
 a build.xml这个文件告诉编译器应该怎样build这个plugin
 plugin的源代码则保存在/src/java/org/apache/nutch/parse/recommended/[这里]
Plugin.xml

你所建立的plugin.xml应该这样:

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

这是对HtmlParserExtension这个扩展点的实现,它的作用是抓取那些标meta-tags的内容,这样把它们加入正在分析的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文件中寻找有没有标有meta-tags的内容     */
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

这是对索引点的扩展,如果查找到带有meta-tags的内容,就把它命名”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

当用户进行查找操作的时候,QueryFilter就会被调用,而且对于recommeded中的boost值会影响查询结果的排序。

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,你需要对conf/nuthc-site.xml这个文件进行编辑,把
以下的代码加入
<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对你的plugin进行编译
在之前我们要编辑一下src/plugin/build.xml 这个文件,这是对编译和部署做一些设置
你会看到有很多如下形式的行
<ant dir="[plugin-name]" target="deploy" />
在</target>前添加一新行
    <ant dir="reccomended" target="deploy" />

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的问题集合

对plugin开发者来说最棒的事情就是自由了,可以不去理会别的plugin的开发者在做什么,可以自由的使用第三方的jar库。

nutch是怎样解决类加载这个问题的?

Nutch使用了一个非常容易的方法,每一个plugin都有一个属于自己的类加载器,这个class-loader在plugin启动以前将会被初始化

写plugin-by stefan

nutch 0.7中的plugins

如果你要在nutch中应用这些插件,你只需要编辑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

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

浅谈Nutch插件机制(含开发实例)的更多相关文章

  1. 浅谈ecmall插件机制

    插件是独立于原系统的程序模块,目的是在不修改原程序的情况下对系统进行扩展,便于修改和管理.目前web开发中大多是使用钩子形式来定义插件, 比较典型的有 wordpress, drupal系统 ecma ...

  2. 浅谈 Golang 插件机制

    我们知道类似 Java 等半编译半解释型语言编译生成的都是类似中间态的字节码,所以在 Java 里面我们想要实现程序工作的动态扩展,可以通过 Java 的字节码编辑技术([[动态代理#ASM]]/[[ ...

  3. 示例浅谈PHP与手机APP开发,即API接口开发

    示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...

  4. Python 浅谈编程规范和软件开发目录规范的重要性

    最近参加了一个比赛,然后看到队友编程的代码,我觉得真的是觉得注释和命名规范的重要性了,因为几乎每个字符都要咨询他,用老师的话来说,这就是命名不规范的后续反应.所以此时的我意识到写一篇关于注释程序的重要 ...

  5. PHP中的插件机制原理和实例

    PHP项目中很多用到插件的地方,更尤其是基础程序写成之后很多功能由第三方完善开发的时候,更能用到插件机制,现在说一下插件的实现.特点是无论你是否激活,都不影响主程序的运行,即使是删除也不会影响. 从一 ...

  6. 浅谈移动应用的跨平台开发工具(Xamarin和React Native)

    谈移动应用的跨平台开发不能不提HTML5,PhoneGap和Sencha等平台一直致力于使用HTML5技术来开发跨平台的移动应用,现在看来这个方向基本算是失败的,基于HTML5的移动应用在用户体验上与 ...

  7. 浅谈JVM线程调度机制及主要策略

    在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程.今天的话主要就是谈一谈JVM线程调度机制.我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票. * ...

  8. 浅谈 java 反射机制

    一:Java反射概念 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其mod ...

  9. python浅谈编程规范和软件开发目录规范的重要性

    前言 我们这些初学者,目前要做的就是遵守代码规范,这是最基本的,而且每个团队的规范可能还不一样,以后工作了,尽可能和团队保持一致,目前初学者就按照官方的要求即可 新人进入一个企业,不会接触到核心的架构 ...

随机推荐

  1. JAVA-JAVA WEB开发工具下载与安装

    1.JAVA SE(JDK下载)程序名:jdk-8u141-windows-x64.exe下载地址:http://www.oracle.com/technetwork/java/javase/down ...

  2. 基于jquery右侧悬浮加入购物车代码

    分享一款基于jquery右侧悬浮加入购物车代码.这是一款基于jQuery实现的仿天猫右侧悬浮加入购物车菜单代码. 在线预览   源码下载 实现的代码: <!--左侧产品parabola.js控制 ...

  3. wpf treeview中的两个事件

    使用模板HierarchicalDataTemplate <HierarchicalDataTemplate x:Key="BookMarkTemplate" > &l ...

  4. eql高可用部署方案

    运行环境 服务器两台(后面的所有配置案例都是以10.96.0.64和10.96.0.66为例) 操作系统CentOS release 6.2 必须要有共同的局域网网段 两台服务器都要安装keepali ...

  5. Hadoop集群时钟同步

    1. 为什么集群需要使用时间同步 暂时保留. 2. hadoop集群如何同步 2.1  以下面hadoop集群为例子: 10.10.11.1 master 10.10.11.2 slave 10.10 ...

  6. easyui datagrid列拖拽

    <script type="text/javascript"> var cols = [{ field: 'testName', title: '<span cl ...

  7. ES学习2

    1:es中的分页 一般搜索引擎中的分页都不会提供很大的页面查询,因为查询的页码越大,查询效率越低. 例子: 我们就先预想一下我们在搜索一个拥有5个主分片的索引.当我们请求第一页搜索的时 候,每个分片产 ...

  8. android tab之间滑动切换界面功能

    1. onTouchListener();                       //捕捉touch事件,比如说onDown 需要将可滑动的控件加上两个方法:(1)view.setOnTouch ...

  9. am335x mux配置

    /**************************************************************** * am335x mux配置 * * am335x的引脚复寄存器是C ...

  10. R语言低级绘图函数-title

    title 函数用来在一张图表上添加标题 基本用法: main 表示主标题,通常位于图像的上方, sub 表示副标题,位于图像的下方, xlab 表示x轴的标签,ylab 表示y轴的标签 par(om ...