`
cxshun
  • 浏览: 724597 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

说说NUTCH插件

阅读更多

这几天的回顾NUTCH项目的过程中,需要对lastModified进行搜索,这下就痛苦啦,用lucene的用法lastModified:[20110101-20120111]拼命的搜啊,搜啊。无耐国足不给力啊,始终搜不出来。于是只能开源代码,拼命地看,总算找到了插件那里实现了搜索的功能。

每一个基本的非范围搜索都可以由NUTCH来实现,但当我们希望它可以实现范围搜索的时候,我们就需要自己实现插件来完成这个功能。

1)我们查看插件的组织目录,发现NUTCH把很多功能都作为插件来进行插入:

2)我们可以看到conf文件夹内的nutch-default.xml文件,打开它,我们可以看到如下代码:

<property>
  <name>plugin.includes</name>
  <value>protocol-http|urlfilter-regex|parse-(text|html|js|tika)|index-(basic|anchor|more)|query-(basic|site|url|lastModified)|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. Nutch now also includes integration with Tika
  to leverage Tika's parsing capabilities for multiple content types. The existing Nutch
  parser implementations will likely be phased out in the next release or so, as such, it is
  a good idea to begin migrating away from anything not provided by parse-tika.
  </description>
</property>

    如果我们需要添加什么插件,只需要在此处进行添加即可。

3)下面我们进行正题,如何开发NUTCH插件:

就以我开发queryLastModified这个插件来说:

新建一个类,名字随便啦,我这时就命名为LastModifiedQueryFilter,代码如下:

private Configuration conf;

	public LastModifiedQueryFilter() {
		super("lastmodified");
	}

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

	private static final String FIELD_NAME = "lastmodified";

	// query syntax is defined as date:yyyymmdd-yyyymmdd
	private static final Pattern pattern = Pattern
			.compile("(\\d{8})\\s(\\d{8})$");

	public BooleanQuery filter(Query input, BooleanQuery output)
			throws QueryException {
		// examine each clause in the Nutch query
		Clause[] clauses = input.getClauses();

		for (int i = 0; i < clauses.length; i++) {
			Clause c = clauses[i];

			// skip if not date clauses
			if (!c.getField().equals(FIELD_NAME))
				continue;

			String x = c.toString();

			x = x.substring(x.indexOf(":")+1).replaceAll("\"","");
			
			Matcher matcher = pattern.matcher(x);
			if (!matcher.matches()) {
				throw new QueryException("Wrong query syntax " + FIELD_NAME
						+ ":" + x);
			}
			
			// inclusive
			TermRangeQuery rangeQuery = new TermRangeQuery(FIELD_NAME, matcher
					.group(1), matcher.group(2), true, true);
			
			
			rangeQuery.setBoost(0.0f); // trigger filterization

			output.add(rangeQuery, BooleanClause.Occur.MUST);

		}

		return output;
	}

中间那几句代码,我们可以看到它实现上是调用了lucene的TermRangeQuery。类写完后当然就是要写plugin.xml,这是插件的必备文件,它通知NUTCH加载此插件。

文件内容大概如下:

<plugin
   id="query-lastModified"
   name="LastModified Query Filter"
   version="1.0.0"
   provider-name="nutch.org">

   <runtime>
      <library name="query-lastModified.jar">
         <export name="*"/>
      </library>
   </runtime>

   <requires>
      <import plugin="nutch-extensionpoints"/>
   </requires>

   <extension id="org.apache.nutch.searcher.lastModified"
              name="Nutch LastModified Query Filter"
              point="org.apache.nutch.searcher.QueryFilter">
      <implementation id="LastModifiedQueryFilter"
                      class="org.apache.nutch.searcher.lastModified.LastModifiedQueryFilter">
        <parameter name="fields" value="lastmodified"/>
      </implementation>
      
   </extension>

</plugin>

  id那些大家用过spring那些应该都清楚的,是插件的名字。extension中的point是指插件点,是指插件继承哪个类,name只是描述而已。implementation中的id也只是名字而已,而class表明类的具体类名,要包括包名,parameter表明它是针对哪个field,这有有raw-fields和fields两种。这时我暂时没有用到raw-fields,没怎么了解,一般情况下都用fields。

4)当写完配置文件和插件文件后就需要写编译文件build.xml,很简单,只有几行,内容如下:

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

  这里的name表明生成的jar包的名称,jar-core表明生成主要的jar包,由于ant没怎么用过,就先不研究了。

import是指把文件导入,也可以理解成在编译buil-plugin.xml时,会自动到这里进行查找,然后进行编译生成JAR包。

5)这里的配置,我们知道,肯定还要再配置build-plugin.xml。

有两个地方需要添加,<target name="deploy"> 内添加<ant dir="query-lastModified" target="deploy"/>表明它要进行部署。

另外在<target name="clean">内添加<ant dir="query-lastModified" target="clean"/>表明在部署前进行清理。

6)这些东西配置完成之后就需要更改nutch-default,把我们添加的插件配置到前面所讲的plugins.include标签内。

7)这样完成之后我们就可以用ant进行编译生成jar包和job包,拷贝过去覆盖原来的即可。

这样,我们的插件开发就完成了。

  • 大小: 11.5 KB
2
1
分享到:
评论
2 楼 cxshun 2011-12-14  
呵呵,谢谢兄弟的夸奖。踩不踩其实没关系的,只是自己的一些记录,很高兴也有人看,并且可以帮助到别人。
1 楼 黎明lm 2011-12-12  
我觉得写的很好啊,很清晰啊,为什会有人踩呢,我支持你

相关推荐

    Nutch_插件深入研究

    ### Nutch插件深入研究 #### 一、Nutch插件概述 Nutch是一个开源的Web爬虫项目,由Apache软件基金会维护。它基于Hadoop,能够从互联网上抓取和索引网页,构建搜索引擎。Nutch的强大之处在于其高度可定制性,这主要...

    Nutch插件机制

    ### Nutch插件机制详解 #### 一、引言 Nutch是一款开源的网络爬虫项目,能够自动抓取互联网上的网页并建立索引。为了提高系统的灵活性、可扩展性和可维护性,Nutch采用了插件化的设计思路,即通过一系列可插拔的...

    nutch的插件机制

    Nutch插件主要分为以下几个类别: 1. **Parser插件**:这类插件负责解析抓取的文档,提取可索引的数据。例如,HtmlParser插件用于解析HTML文档,而MSWordParser插件则用于解析Microsoft Word文档。开发者可以通过...

    Nutch插件开发文档

    ### Nutch插件开发知识点详解 #### 一、Nutch插件系统概述 Nutch是一款开源的网络爬虫工具,其强大的灵活性与扩展性得益于其独特的插件系统设计。插件(Plugin)作为Nutch的核心组件之一,为用户提供了一种灵活的...

    Nutch插件开发和服务器发布流程

    ### Nutch插件开发与服务器发布流程详解 #### 一、Nutch插件开发流程 **1. Nutch开发客户端环境搭建** 为了开始Nutch插件的开发工作,首先需要搭建一个适合的开发环境。这通常包括安装Java开发工具包(JDK)、...

    基于Nutch 的插件系统的原理分析

    本文旨在深入分析Nutch插件系统的原理,并探讨其如何实现良好的扩展性和灵活性。 #### 二、Nutch搜索引擎概述 ##### 2.1 Nutch简介 Nutch是一款基于Java语言编写的开源搜索引擎。最初由俄勒冈州立大学发起,2005...

    Nutch中文分词插件的编写与配置

    Nutch中文分词插件的编写与配置,由于Internet的迅猛发展,使得用户查找信息犹如大海捞针,而搜索引擎则能帮用户很好的解决这个问题。 Nutch是用java语言开发的,基于Lucene的完整的网络搜索引擎,并采用插件机制进行...

    Nutch执行单步执行、中间结果文件分析和插件开发基础

    资源中urls.txt是我nutch单步执行过程的种子文件,里面的ppt主要讲解nutch单步执行流程,并获取每次单步执行的结果文件,对文件进行分析,同时ppt还讲解了nutch的插件的基础知识,不是很详细,但是可以作为参考。...

    Nutch_的配置文件

    3. **Nutch插件的配置文件**:每个Nutch插件都可能有自己的配置文件,这些文件在插件被加载时自动读取。例如,过滤器(filter)插件通常有自己的配置,用于设定过滤规则。 配置文件的加载顺序决定了配置的优先级,...

    Nutch入门教程 高清 带书签

    四、Nutch插件系统 Nutch的强大之处在于其插件机制,用户可以根据需求编写自己的插件,如自定义解析器、URL过滤器、索引器等。Nutch的核心组件包括:`fetcher`(负责下载网页)、`parse`(解析HTML)、`index`(创建...

    基于ApacheNutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件nutch-htmlunit.zip

    常规的HTML页面抓取: 对于常规的例如新闻类没有AJAX特性的页面可以直接用Nutch自带的protocol-http插件抓取。 常规的AJAX页面抓取: 对于绝大部分诸如jQuery ajax加载的页面,可以直接用protocol-...

    nutch

    通过阅读此教程,你可以了解如何搭建 Nutch 爬虫环境,编写自定义插件,以及进行定制化抓取和索引。 总结来说,Nutch 是一个强大的开源网络爬虫工具,借助 Hadoop 实现了大规模的网页抓取和搜索功能。学习和使用 ...

    nutch1.2 java project

    Nutch 1.2 版本相对于早期版本在性能和稳定性上有所提升,同时也支持更丰富的插件体系。 在描述中提到,这个压缩包包含了一个已经配置好的 Nutch 1.2 Java 工程,但由于文件大小限制,插件部分未能上传。Nutch 的...

    eclipse配置nutch,eclipse配置nutch

    具体而言,将`plugin.folders`参数改为`"./src/plugin"`,以确保Nutch能够识别到项目的插件目录。 #### 步骤5:设置URL文件 在配置好基本环境后,还需要创建一个包含起始URL的文件,通常命名为`urls`,并将其放置...

    雅虎开源的Nutch爬虫插件 Anthelion.zip

    Anthelion 是 Nutch 插件,专注于爬取语义数据。注意:此项目包括完整的 Nutch 1.6 版本,此插件放置在 /src/plugin/parse-anthAnthelion 使用在线学习方法来基于页面上下文预测富数据 Web 页面,从之前查看的页面...

    nutch-1.5.1源码

    6. **配置与插件(Configuration & Plugins)**:Nutch允许开发者通过配置文件定制爬虫的行为,并提供了一套插件系统,方便扩展其功能。例如,你可以编写自定义的URL过滤器、解析器或索引增强插件。 在研究Nutch-...

    Nutch 0.8笔记NUTCHNUTCH

    【Nutch 0.8 知识点详解】 Nutch 是一个开源的、基于 Lucene 的网络搜索引擎项目,它提供了一套完整的搜索引擎解决方案,包括网页抓取、索引和搜索功能。Nutch 0.8 版本尤其值得关注,因为它完全使用 Hadoop 进行了...

Global site tag (gtag.js) - Google Analytics