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



目录
相关文章
|
5月前
|
存储 JavaScript 搜索推荐
《VitePress 简易速速上手小册》第3章:主题定制与扩展(2024 最新版)
《VitePress 简易速速上手小册》第3章:主题定制与扩展(2024 最新版)
239 0
《阿里巴巴Java开发手册》IDEA插件使用,提升代码质量的利器
《阿里巴巴Java开发手册》IDEA插件使用,提升代码质量的利器
455 0
|
Web App开发 存储 监控
全网最详细的谷歌插件开发小册📚(2)
使用tabs API chrome.tabs API 允许插件操作浏览器的标签页,例如创建新的标签页,关闭标签页,切换标签页,修改标签页的URL等。以下是一个创建新标签页的示例:
412 1
|
人工智能 Go
神级插件Bito介绍及使用
神级插件Bito介绍及使用
|
Web App开发 前端开发 JavaScript
全网最详细的谷歌插件开发小册📚(1)
Chrome插件 Chrome插件,或称为扩展,是一种专为Google Chrome浏览器设计的软件应用程序。插件可以让开发者向浏览器中添加新的特性或功能,或者对现有的功能进行增强或改变。从改变浏览器的视觉主题,到阻止广告,从管理密码到加强网络安全,Chrome插件的使用场景几乎无所不包,给用户带来高度定制化的浏览体验。 插件运行在Chrome浏览器的沙盒环境中,这意味着它们在浏览器中执行,但不会影响到计算机的其他部分。这种设计保证了浏览器的稳定性和用户的安全。 插件的开发主要依赖于Web技术,包括HTML、CSS和JavaScript,因此,任何有Web开发经验的人都能够相对容易地开始Chr
903 0
|
缓存 安全 JavaScript
别再造轮子了,Google 开源的 Guava 工具库真心强大!
别再造轮子了,Google 开源的 Guava 工具库真心强大!
|
Java 编译器 Maven
谷歌开源项目ProtoBuf一探(基础环境配置)
谷歌开源项目ProtoBuf一探(基础环境配置)
158 0
谷歌开源项目ProtoBuf一探(基础环境配置)
|
存储 JSON 前端开发
Golang+Protobuf+PixieJS 开发 Web 多人在线射击游戏(原创翻译)
Golang+Protobuf+PixieJS 开发 Web 多人在线射击游戏(原创翻译)
178 0
Golang+Protobuf+PixieJS 开发 Web 多人在线射击游戏(原创翻译)
|
Java Linux 数据安全/隐私保护
入坑 docsify,一款神奇的文档生成利器!(1)
入坑 docsify,一款神奇的文档生成利器!
348 0
入坑 docsify,一款神奇的文档生成利器!(1)
|
XML 前端开发 JavaScript
入坑 docsify,一款神奇的文档生成利器!(3)
入坑 docsify,一款神奇的文档生成利器!
428 0
入坑 docsify,一款神奇的文档生成利器!(3)
下一篇
无影云桌面