首先说明的是这个文章只是我实现一个Nutch插件的过程,至于Nutch插件机制的介绍就不在此说明,网上有很多关于Nutch插件机制的文章,可以自己查找。
实现Nutch插件,可以参考Nutch中自带的插件的配置方法,我这里实现的插件是index-field,是主要功能是在索引中加入几个字段,以满足我们业务的需求。下面介绍实现过程:
1. 插件src的目录结构
插件的源码文件一般放在src/plugin下,目录名通常与插件的id同名,以避免在增加插件时搞错插件的id。本例中中文分词插件的id为analysis-zh,为保持与nutch其它插件目录结构统一,则目录结构安排如下:
index-field
├─src/plugin/index-field/src/java
│ └─FieldIndexFilter.java
├─plugin.xml
├─build.xml
这里plugin.xml为插件的配置文件,用于指定插件所依附的扩展点。
实现过程:
A.在Nutch的工程根目录下添加一个文件夹命名问src/plugin/index-field/src/java ,然后将上面已经实现的插件index-basic的文件下的build.xml和plugin.xml文件赋值到index-field目录下。如图1
2. Eclipse工程设置
创建上述文件后,需要通过Eclipse中的Java Build Path → Source → Add Folder,把index-field的src目录加进来,这里是index-field/src/java。
添加完成之后,在nutch的插件中会看到
这说明你的工程设置正确,然后在这个目录下面创建我的org.apache.nutch.indexer.field. FieldIndexingFilter插件类。这个类实现IndexingFilter接口。(至于为什么,可以查阅插件扩展点extensionpoints的说明)
3. 需要修改的配置文件
图1中的两个xml文件 要修改
build.xml修改
<proje ctname="index-field" default="jar-core">//只需要将name值改为index-field
<import file="../build-plugin.xml"/>
</project>
plugin.xml修改
<plugin
id="index-field" //插件ID
name="Field Indexing Filter" //插件的名字
version="1.0.0"
provider-name="nutch.org">
<runtime>
<library name="index-field.jar"> //打包后的包名
<export name="*"/>
</library>
</runtime>
<requires>
<import plugin="nutch-extensionpoints"/>
</requires>
<extension id="org.apache.nutch.indexer.field" //插件的包名
name="Nutch Field Indexing Filter"
point="org.apache.nutch.indexer.IndexingFilter"> //扩展点
<implementation id="FieldIndexingFilter" //实现扩展点的类 名 class="org.apache.nutch.indexer.field.FieldIndexingFilter"/> //实现扩展点的类
</extension>
</plugin>
还需要修改另外两个配置文件
文件路径:src/plugin/build.xml
在<target name="deploy">标签下面增加<ant dir=" index-field
" target="deploy"/>
在<target name="clean">标签下面增加<ant dir=" index-field
" target="clean"/>
文件路径:conf/nutch-default.xml
搜索<name>plugin.includes</name>,在<value>部分增加:index-field
这样配置文件就修改完成,只需要给FieldIndexingFilter这个类中添加代码即可,完成之后要用ant编译一下工程目录下的build.xml,原因是文件中<name>plugin.folders</name>标签定义了nutch加载插件的根目录,默认值为plugins,需要用ant编译,用eclipse编译路径不正确,无法把插件导出到plugins下。
这次这个插件开发完成,在执行index的时候,截图如下,可以看到FieldIndexingFilter已被加载。