通过Nutch扩展点开发插件(添加自定义索引字段到solr)

爬虫系统:通过Nutch扩展点开发插件(添加自定义索引字段到solr)

准备工作

  1. 爬虫环境 —— nutch2.3.1 + solr4.10.3 + hbase0.98
  2. 开发环境 —— Eclipse Mars.2 Release(4.5.2)
  3. 所需jar包 —— apache-nutch-2.3.jar、hadoop-common-2.6.0.jar、slf4j-api-1.7.9.jar

什么是Nutch扩展点

??????好的爬虫系统应该同时具备高扩展性(scalability)和高伸缩性(extensibility)的特点。Nutch爬虫系统不仅是采用动态加载插件形式设计(可扩展性),而且允许利用hadoop集群进行分布式爬取(可伸缩性)。用户可以根据自己的需求开发特定的爬虫系统,同时不需要过多担心业务量剧增会影响爬虫性能。
??????Nutch提供了扩展接口【 Parser、ParseFilter等】,用户通过实现这些接口进行插件开发。

本文插件的意义

??????利用nutch原始插件爬取web数据,然后把数据放入solr建索引,此时solr中的索引字段只有默认配置的几个,如果我们需要加入额外的字段,则需要利用Nutch的扩展接口进行索引插件开发。

如何利用Nutch扩展点开发插件

1、 确定实现哪个扩展点?
??????本文需要在solr中新增索引字段,所以需要利用索引阶段的扩展点【IndexWriter、IndexingFilter】,Nutch已经实现了indexer-solr插件用于创建solr索引,我们可以重新实现indexer-solr插件替换掉原来的;或者利用索引过滤往索引对象【NutchDocument】中加入需要进行索引的字段。本文使用IndexingFilter。
2、 如何开发插件?
??????2.1?eclipse新建java项目;
??????2.2?实现IndexingFilter接口;

    public class ExtraIndexer implements IndexingFilter {
        private static final Logger LOGGER = LoggerFactory.getLogger(ExtraIndexer.class);
        private Configuration conf;
        private String CRAWLID_VALUE;

        /**
         * NutchDocument为索引数据对象
         * WebPage为爬虫持久层数据表
         */
        public NutchDocument filter(NutchDocument doc, String url, WebPage page) throws IndexingException {

            // just in case
            if (doc == null)
                return doc;
            addCrawlId(doc, url, page);
            addFetchTime(doc, url, page);
            return doc;
        }

        private NutchDocument addFetchTime(NutchDocument doc, String url, WebPage page) {
            String fetchTime = page.getFetchTime().toString();
            LOGGER.info(">>>>>>>>>>add fetchtime: " + fetchTime);
            doc.add("fetchTime", fetchTime);
            return doc;
        }

        private NutchDocument addCrawlId(NutchDocument doc, String url, WebPage page) {
            doc.add("crawlId", this.CRAWLID_VALUE);
            LOGGER.info(">>>>>>>>>>add crawlId: " + this.CRAWLID_VALUE);
            return doc;
        }

        public void setConf(Configuration conf) {
            this.conf = conf;
            this.CRAWLID_VALUE = conf.get(Nutch.CRAWL_ID_KEY);
            LOGGER.info(">>>>>>>>>>crawlID for indexing set to: " + this.CRAWLID_VALUE);
        }

        public Configuration getConf() {
            return this.conf;
        }

        @Override
        public Collection<Field> getFields() {
            return null;
        }
    }

??????2.3?编写配置文件;

plugin.xml:插件信息提供给Nutch识别.

<plugin
   id="index-extra"
   name="Extra Indexing Filter"
   version="1.0.0"
   provider-name="nutch.org">

   <runtime>
      <library name="index-extra.jar">
         <export name="*"/>
      </library>
   </runtime>
   <requires>
      <import plugin="nutch-extensionpoints"/>
   </requires>
   <extension id="org.apache.nutch.indexer.extra"
              name="Nutch Extra Indexing Filter"
              point="org.apache.nutch.indexer.IndexingFilter">
      <implementation id="ExtraIndexer"
                      class="org.apache.nutch.indexer.extra.ExtraIndexer"/>
   </extension>

</plugin>

build.xml:给ant提供编译信息

<project name="index-extra" default="jar-core">
  <import file="../build-plugin.xml"/>
</project>

ivy.xml:描述插件的相关依赖,给ivy提供信息方便管理这些依赖

<ivy-module version="1.0">
  <info organisation="org.apache.nutch" module="${ant.project.name}">
    <license name="Apache 2.0"/>
    <ivyauthor name="Apache Nutch Team" url="http://nutch.apache.org"/>
    <description>
        Apache Nutch
    </description>
  </info>

  <configurations>
    <include file="../../../ivy/ivy-configurations.xml"/>
  </configurations>

  <publications>
    <!--get the artifact from our module name-->
    <artifact conf="master"/>
  </publications>

  <dependencies>
  </dependencies>

</ivy-module>

??????2.4?在nutch安装目录下编译插件;

a、把index-extra源码加入到{NUTCH-HOME}/src/plugin
b、修改{NUTCH-HOME}/src/plugin/build.xml文件
c、修改{NUTCH-HOME}/build.xml文件
d、编辑{NUTCH-HOME}/conf中的相关配置文件
e、在{NUTCH-HOME}目录下运行:ant runtime

3、 如何利用开发好的插件?

??????3.1?修改nutch-site配置文件;

<property>
   <name>plugin.includes</name>
   <value>protocol-httpclient|urlfilter-regex|index-(extra|basic|anchor|more|metadata)|indexer-solr|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)|parse-(html|tika|text|metatags)</value>
</property>

??????3.2?修改schema.xml配置文件;

<field name="crawlId" type="string" stored="true" indexed="false"/>
<field name="fetchTime" type="string" stored="true" indexed="false"/>

??????3.3?修改solrindex-mapping.xml【nutch和solr索引映射】配置文件;

<field dest="fetchTime" source="fetchTime"/>
<field dest="crawlId" source="crawlId"/>

??????3.4?修改solr配置文件;

{NUTCH-HOME}/runtime/local/conf下的schema.xml复制到solr实例的conf目录下{SOLR-HOME}/collection1/conf/,并重启solr服务器

4、运行爬虫命令验证结果?

一站式命令:nohup bin/crawl urls/ craw-name http://××××:8080/solr/ 3
创建索引命令:nohup bin/nutch solrindex http://××××:8080/solr/ -all -crawlId craw-name &

小结

??????本文抛砖引玉,主要实现了在nutch索引阶段,通过扩展插件的手段,添加自定义的索引字段到NutchDocument索引数据对象中,从而在随后solr的CRUD阶段【indexer-solr】把添加的字段提交到solr。
注:博主水平有限,望批评指正!以求共勉!

时间: 2024-11-05 16:31:27

通过Nutch扩展点开发插件(添加自定义索引字段到solr)的相关文章

jQuery开发插件的两种方式

最近挺多人写jQuery的,都是关于jQuery扩展方面的,使用方面的讲的比较多,但是关于详细的一个基础的过程讲的比较少一点,做web开发的基本上都会用到jQuery,本人就根据jQuery的使用经验讲讲插件开发.jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数是属于jQuery命名空间的函数),如果将jQuery看成一个类,那么就相当于给jQuery类本身添加方法.第二种是对象扩展的方式开发插件,即jQuery对象添加方法. 类扩展

(转)Unity3d UnityEditor编辑器定制和开发插件

在阅读本教程之前,你需要对Unity的操作流程有一些基础的认识,并且最好了解内置的GUI系统如何使用. 如何让编辑器运行你的代码 Unity3D可以通过事件触发来执行你的编辑器代码,但是我们需要一些编译器参数来告知编译器何时需要触发该段代码.[MenuItem(XXX)]声明在一个函数上方,告知编译器给Unity3D编辑器添加一个菜单项,并且当点击该菜单项的时候调用该函数.触发函数里可以编写任何合法的代码,可以是一个资源批处理程序,也可以弹出一个编辑器窗口.代码里可以访问到当前选中的内容(通过S

用jQuery开发插件详解

jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法.下面就两种函数的开发做详细的说明. 1.类级别的插件开发 类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法.典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中.关于类级别的插件开发可以采用如下几种

Nutch+Lucene搜索引擎开发实践

网络拓扑 图 1 网络拓扑图 安装Java JDK 首先查看系统是否已经安装了其他版本的JDK,如果有,先要把其他版本的JDK卸载. 用root用户登录系统. # rpm-qa|grep gcj 显示内容其中包含下面两行信息 # java-1.6.0-openjdk-1.6.0.0-1.57.1.11.9.el6_4.i686 #java-1.7.0-openjdk-1.7.0.9-2.3.8.0.el6_4.i686 卸载 #yum -y remove java-1.6.0-openjdk #

Android 开发之开发插件使用:Eclipse 插件 SQLiteManger eclipse中查看数据内容--翻译

最近研究了一段时间Android开发后发现,google自带的ADT工具,缺失一些开发常用的东西,希望可以构建一个类似使用JAVA EE开发体系一样开发的工具包集合,包括前台开发,调试,到后台数据库的管理,到此,在网上逛了一遍发现这个一些常用的插件功能很强大,所以我决定做一系列翻译这些插件安装使用的教程,希望大家喜欢. 本文受益于这篇文章,所以决定翻译这篇文章中的一部分东西工具.19 个 Android 开发工具投递人 itwriter 发布于 2014-05-08 09:32 本文翻译:Ecl

JavaScript之jQuery-9 jQuery 开发插件(添加新全局函数、添加jQuery对象方法、添加新简写方法、方法参数)

一.添加新的全局函数 全局函数 - 全局函数,实际上就是jQuery对象的方法,从实践角度看,它们是位于jQuery命名空间内部的函数 - jQuery内置的某些功能是通过全局函数实现的 - $.ajax()函数就是典型的全局函数 - 向jQuery命名空间添加一个函数,只需要将这个新函数指定为jQuery的一个属性值   - 如果要使用该全局函数时,可通过一下代码调用 - 也可以通过别名来调用 添加多个函数 - 如果我们想在插件中提供多个全局函数,可以独立的声明这些函数   - 还可以使用$.

jQuery为开发插件提拱了两个方法:jQuery.fn.extend(); jQuery.extend();

jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); jQuery.fn jQuery.fn = jQuery.prototype = { init: function( selector, context ) {//…. //…… }; 原来 jQuery.fn = jQuery.prototype.对prototype肯定不会陌生啦. 虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便. jQuery

【转载】Unity3d UnityEditor编辑器定制和开发插件

在阅读本教程之前,你需要对Unity的操作流程有一些基础的认识,并且最好了解内置的GUI系统如何使用. 如何让编辑器运行你的代码 Unity3D可以通过事件触发来执行你的编辑器代码,但是我们需要一些编译器参数来告知编译器何时需要触发该段代码.[MenuItem(XXX)]声明在一个函数上方,告知编译器给Unity3D编辑器添加一个菜单项,并且当点击该菜单项的时候调用该函数.触发函数里可以编写任何合法的代码,可以是一个资源批处理程序,也可以弹出一个编辑器窗口.代码里可以访问到当前选中的内容(通过S

jQuery中开发插件的两种方式(附Demo)

做web开发的基本上都会用到jQuery,jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数是属于jQuery命名空间的函数),如果将jQuery看成一个类,那么就相当于给jQuery类本身添加方法.第二种是对象扩展的方式开发插件,即jQuery对象添加方法. 类扩展的插件 类扩展的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法.典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中.关