Nutch-1.0 研究笔记 (基于Nutch实现建议图书垂直搜索引擎)

   Nutch 是一个基于 Lucene ,类似 Google 的完整网络搜索引擎解决方案,它是一个刚刚诞生开放源代码 (open-source) web 搜索引擎。基于 Hadoop 的分布式处理模型保证了系统的性能,类似 Eclipse 的插件机制保证了系统的可客户化,而且很容易集成到自己的应用之中。    

Nutch流程

    在上学期的某门课上,我们基于Nutch实现了一个简易的 专 注于图书搜索的垂直搜索引擎。由于精力有限,我们的搜索引擎并不是严格按照垂直搜索引擎的架构来实现的。在整个图书搜索引擎的实现流程中,我们将信息抽取 放在了用户查询之后来做,从用户的查询结果信息中提取出用户关心的信息并向用户展示,因此,我们并没有用到数据库,只用了倒排索引。实现的流程大致如下:

·        确定图书信息数据来源

·        配置并抓取网页信息

·        根据抓取结果建立索引

·        根据索引实现查询系统

·        用户查询 ==> 分析结果 ==> 抽取信息并显示

1.1   Nutch-1.0 导入 Eclipse 工程

   Nutch-1.0 导入 Eclipse 工程的步骤可以参考 http://wiki.apache.org/nutch/RunNutchInEclipse1.0 http://yang7229693.javaeye.com/blog/436611 ,由于 Nutch-1.0 如果不修改代码,导入进去是有两处错误 , 因此需要修改。由于爬虫的运行需要 cygwin, 因此在 Eclipse 中配置 Nutch 之前必须先配置 cygwin 的环境变量,否则后面会出现 "Failed to get the current user's information" 的错误。 table.MsoNormalTable { font-size: 10pt; font-family: "Times New Roman","serif"; }

   Nutch 导入 Eclipse 的主要步骤如下 , 新建一个工程,选择 "Create project from existing source" ,指向自己 Nutch-1.0 的目录。点击下一步,切换到 "Libraries" 选择 "Add Class Folder..." 按钮,从列表中选择 "conf" 。切换到 "Order and Export" 找到 "conf" ,把它移到顶端。切换到 "Source", 设置“ output folder ”,点击 finish 完成导入。 修改 nutch-defaul.xml nutch-site.xml crawl-urlfilter.txt

   接下来从 http://nutch.cvs.sourceforge.net/nutch/nutch/src/plugin/parse-mp3/lib / , http://nutch.cvs.sourceforge.net/nutch/nutch/src/plugin/parse-rtf/lib / 下载 MP3 rtf jar 文件,分别是“ jid3lib-0.5.1.jar ”和“ rtf-parser.jar , 将这两文件分别拷贝到“ src/plugin/parse-mp3/lib ”和“ src/plugin/parse-rtf/lib/ ”文件夹下 , 刷新,右键选择工程文件夹,选择“ Build Path => Configure Build Path... ”在弹出的窗口上,切换到“ Libraries ”,选择“ Add Jars... ”,添加刚才下载的 jar 文件到工程。

   此时一般的工程都会有两个错误,这是因为 Nutch official 1.0 release 版本中 licensing issues 没有修复。

   修改 ”src/plugin/parse-rtf/src/java/org/apache/nutch/parse/rtf” 下的 RTFParseFactory.java ,添加:

import org.apache.nutch.parse.ParseResult;

    

public Parse getParse(Content content) {

   改为

public ParseResult getParse(Content content) {

     

return new ParseStatus(ParseStatus.FAILED,

                               ParseStatus.FAILED_EXCEPTION,

                               e.toString()).getEmptyParse(conf);

   改为

return new ParseStatus(ParseStatus.FAILED,

                ParseStatus.FAILED_EXCEPTION,

              e.toString()).getEmptyParseResult(content.getUrl(), getConf());

  

return new ParseImpl(text,

                         new ParseData(ParseStatus.STATUS_SUCCESS,

                                     title,

                                       OutlinkExtractor.getOutlinks(text, this.conf),

                                       content.getMetadata(),

                                       metadata));

   改为

return ParseResult.createParseResult(content.getUrl(),

                             new ParseImpl(text,

                                     new ParseData(ParseStatus.STATUS_SUCCESS,

                                             title,

                                             OutlinkExtractor.getOutlinks(text, this.conf),

                                             content.getMetadata(),

                                             metadata)));

   修改“ src/plugin/parse-rtf/src/test/org/apache/nutch/parse/rtf “下的 TestRTFParser.java ,将

parse = new ParseUtil(conf).parseByExtensionId("parse-rtf", content);

   改为

parse = new ParseUtil(conf).parseByExtensionId("parse-rtf", content).get(urlString);

   到这一步, Eclipse 中的 Nutch 工程就没有错误了。

1.2  运行爬虫

   选择 Run=>Run As=>Java Application 在弹出的“ Select Java Application ”上选择“ Crawl-org.apache.nutch.crawl ”,第一次运行由于没有设置参数,所以不会有什么,接下来,选择 Run=>Run Configurations… 在左边的“ Java Application ”下面会有“ Crawl ”这一项,选择它, 切换到“ Arguments ”,“ Program Arguments ”的内容就是要设置的参数,填上“ urls -dir crawl -depth 3 -topN 50 ”(这里视具体情况而定, urls 为链接)在“ VM arguments ”下面填上“ -Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log ”,选择 Run 便可以看到抓取页面的过程。

1.3  编译 Nutch

   由于 Nutch-1.0 的源代码中已经包含了 build.xml 文件,可以直接运行“ Ant Build ”,默认会出现以下错误:

E:/nutch/build.xml:62: Specify at least one source--a file or resource collection.

   这是因为原来的 build.xml 包含:

    <touch datetime="01/25/1971 2:00 pm">

      <fileset dir="${conf.dir}" includes="**/*.template"/>

</touch>

可以通过直接去掉访问 template files 的方法解决这个问题。

到这一步已经能成功在 Eclipse 中编译 Nutch-1.0 的源码了,后续便能将自己的代码加入 Nutch 中实现垂直搜索引擎的功能。

 

1.4   Nutch乱码解决

    在Nutch的搜索框中输入中文,点击“搜索”按钮之后,可以看到搜索框中的关键字是乱码,搜索结果也为空。网上有很多文章都谈到了这个现象,这不是Nutch的问题,而是Tomcat没有对uri做编码造成的。解决的办法也很简单,在Tomcat的安装目录下找到”conf/server.xml”文件,在"Connector port=”8080″ ”那一节添加URIEncoding="UTF-8" useBodyEncodingForURI="true"可以了。完整的配置可能是下面这个样子:

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

URIEncoding="UTF-8"

useBodyEncodingForURI="true"/>

 



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值