今天来用一个例子来详细讲解下nutch当中到底是如何自定义插件的
接上面一篇,今天来用一个例子来详细讲解下nutch当中到底是如何自定义插件的。
1.首先在src/plugin/,新建一个文件夹,这个文件夹我们姑且就叫(urlfilter-urllength),从名字就可以看出我们这个自定义的插件的作用是什么了。
?? 1.我们这个类实现了URLFilter.当然要实现其没有实现的方法了。public class UrlLengthFilter implements URLFilter。
?? 2.下面贴出详细的源码看下:
?? public class UrlLengthFilter implements URLFilter{
??? private static final Log LOG = LogFactory.getLog(UrlLengthFilter.class);
??? private Configuration conf;
??? @Override
??? public String filter(String inUrl) {
??? ??? LOG.info("begin UrlLengthFilter is .....");
??? ??? String urlFilter = "";
??? ??? if (inUrl == null || inUrl == "") return urlFilter;
??? ??? String url = inUrl.toLowerCase();
??? ??? // from first character after 'http://' or first character
??? ??? int start = url.indexOf("http://");
??? ??? start = start < 0 ? (url.indexOf("https://") == 0 ? 8 : 0) : 7;
??? ??? url = url.substring(start);
??? ??? int end = url.indexOf("/");
??? ??? end = end < 0 ? url.length() : end;
??? ??? // return the first character to the first or end
??? ??? urlFilter = url.substring(0, end);
??? ??? LOG.info("urlFilter is " + urlFilter);
??? ??? return urlFilter;
??? }
??? @Override
??? public Configuration getConf() {
??? ??? return conf;
??? }
??? @Override
??? public void setConf(Configuration conf) {
??? ??? this.conf = conf;
??? }
?? }???
2.当然要有plugin.xml这个.xml的作用就不用说了不吧!很明显就是加载我们所写的类(实现某一个功能)。代码还是贴出来分析下:
<?xml version="1.0" encoding="UTF-8"?>
<plugin
?? id="urlfilter-urllength"
?? name="Suffix URL Filter"
?? version="1.0.0"
?? provider-name="xp.com">
?? <requires>
????? <import plugin="nutch-extensionpoints"/>
?? </requires>
?? <extension id="com.xp.se.test.urllength"
????????????? name="Nutch URL Length Filter"
????????????? point="org.apache.nutch.net.URLFilter">
????? <implementation id="UrlLengthFilter" class="com.xp.se.urllength.UrlLengthFilter"/>
?? </extension>
</plugin>
分析:
??? a、第一句就知道吧,xml声明的编码格式和所使用的版本。
??? b、id : 这个插件的id。
?????? name : 插件的的作用是什么。
????? version : 插件的版本。
????? provider-name : 是谁提供的(源)。
??? c、nutch-extensionpoints : 这里面是ntuch自带的几个插件。我们在这里是把它现引进来。
??? d、extension : 扩展,顾名思义就是说:把我们自己写好的插件交给nutch来用。相信读过nutch源码的都很清楚还有一个extension-point.它们之间有什么关系。不过不知道也没关系,跟着来做就行了。回头从网上google下就可以明白的。
??? e、id : 是所定义一个名称
????? name: 这个扩展的作用是什么。功能是什么。看了这个后可以一目了然啊。
????? point : 是从nutch那个扩展点集成的。这个point是要和nutch-extensionpoints/plugin.xml中的某个id相一致的。
????? implementation : 我们自己写的类。
3.通常还有一个build.xml.这个是用来编译的。
4.在nutch-site中加上我们写的这个插件吧,跑下试试。
<property>
? <name>plugin.includes</name>
? <value>protocol-http|urlfilter-(regex|urllength)|parse-(text|html|js)|index-(basic|anchor)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)</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. In order to use HTTPS please enable
? protocol-httpclient, but be aware of possible intermittent problems with the
? underlying commons-httpclient library.
? </description>
</property>
细心的朋友已经发现我们在上面已经加上了。没有发现的话,再细致看下....
总结 :
自己可以跟踪下。肯定进来。比如我们在url中写一个url : http://www.163.com/ 通过我们写的这个会变成 : www.163.com 。程序就会终止了。写这个目的是现理清这个nutch的插件的加载流程和学习如何
自定义一个自己的插件。我们可以写很多的plugin,都可以通过上面所讲的这种方法来实现。