查看完整版本: [-- Nutch 使用之锋芒初试 --]

IdeaGrace - Java开发、Web开发论坛 -> Java开源项目 -> Nutch 使用之锋芒初试 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

kevin 2006-07-05 10:15
Nutch 使用之锋芒初试
                 
  “工欲善其事,必先利其器。”经过前文的“细解”,我们已经完成了Nutch在Windows中的安装。接下来就让我们通过锋芒初试,来亲自体验一下Nutch的强大功能吧!
 
  Nutch的爬虫抓取网页有两种方式,一种方式是Intranet Crawling,针对的是企业内部网或少量网站,使用的是crawl命令;另一种方式是Whole-web crawling,针对的是整个互联网,使用inject、generate、fetch和updatedb等更底层的命令。本文将以使用Nutch为笔者在CSDN处的个人专栏(http://blog.csdn.net/zjzcl)文章内容建立搜索功能为例,来讲述Intranet Crawling的基本使用方法(假设用户电脑系统已安装好JDK、Tomcat和Resin,并做过相应的环境配置)。
 
  1、设置Nutch的环境变量

  在Windows系统的环境变量设置中,增加NUTCH_JAVA_HOME变量,并将其值设为JDK的安装目录。比如笔者电脑中JDK安装于D:\j2sdk1.4.2_09,因此将NUTCH_JAVA_HOME的值设为D:\j2sdk1.4.2_09。
 
  2、Nutch抓取网站页面前的准备工作

  (1)在Nutch的安装目录中建立一个名为url.txt的文本文件,文件中写入要抓取网站的顶级网址,即要抓取的起始页。笔者在此文件中写入如下内容:
 
  http://blog.csdn.net/zjzcl
 
  (2)编辑conf/crawl-urlfilter.txt文件,修改MY.DOMAIN.NAME部分:
 
  # accept hosts in MY.DOMAIN.NAME
  +^http://blog.csdn.net/zjzcl
 
  3、运行Crawl命令抓取网站内容
 
  双击电脑桌面上的Cygwin图标,在命令行窗口中输入:
 
  cd /cygdrive/i/nutch-0.7.1
 
  不明白此命令含义的读者请参见前《细解》一文,然后再输入:
 
  bin/nutch crawl url.txt -dir crawled -depth 3 -threads 4 >& crawl.log
 
  等待大约2分多钟后,程序运行结束。读者会发现在nutch-0.7.1目录下被创建了一个名为crawled的文件夹,同时还生成一个名为 crawl.log的日志文件。利用这一日志文件,我们可以分析可能遇到的任何错误。另外,在上述命令的参数中,dir指定抓取内容所存放的目录, depth表示以要抓取网站顶级网址为起点的爬行深度,threads指定并发的线程数。
 
  4、使用Tomcat进行搜索测试
 
  (1)将tomcat\webapps下的ROOT文件夹名改成ROOT1;
  (2)将nutch-0.7.1目录的nutch-0.7.1.war复制到tomcat\webapps下,并将其改名为ROOT;
  (3)打开ROOT\WEB-INF\classes下的nutch-site.xml文件,修改成如下形式:
 
  <?xml version="1.0"?>
  <?xml-stylesheet type="text/xsl" href="nutch-conf.xsl"?>

  <!-- Put site-specific property overrides in this file. -->

  <nutch-conf>
   <property>
    <name>searcher.dir</name>
    <value>I:/nutch-0.7.1/crawled</value>
   </property>
  </nutch-conf>

  其中的“<value>I:/nutch-0.7.1/crawled</value>”部分,读者应根据自己的设置进行相应修改。
  (4)启动Tomcat,打开浏览器在地址栏中输入:http://localhost:8080,如图1所示:


 
  在文本框中输入关键字,就可以进行搜索了。不过用户在使用时会发现,对于英文单词的搜索一切正常,而当要搜索中文词语时会出现乱码。其实这个问题是 Tomcat设置的问题,解决办法是修改tomcat\conf下的server.xml文件,将其中的Connector部分改成如下形式即可:
 
  <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
          enableLookups="false" redirectPort="8443" acceptCount="100"
          connectionTimeout="20000" disableUploadTimeout="true"
          URIEncoding="UTF-8" useBodyEncodingForURI="true" />
       
  现在我们可以对中文词汇进行搜索了。如在搜索框中输入“李开复”,点击搜索按钮后,会搜索到笔者之前写的两篇文章《从李开复换门庭开启的缝隙中窥视——试探Google的几招成功“秘诀”》与《从国内首例禽流感假疫苗大案说起——有感于李开复<做最好的自己>中的诚信观》,如图2所示:
 

 
  如果点击show all hits按钮,则会列出更多相关的搜索结果了。  
 
  5、使用Resin进行搜索测试
 
  由于笔者最近工作中经常使用Resin,因此在Tomcat上测试完毕后也想在Resin上测试一把,未曾想遇到了各种意想不到的情况。下面就将所遇到的问题以及解决方法列出,以供遇到相同问题的读者参考。
 
  (1)将nutch-0.7.1目录的nutch-0.7.1.war复制到resin-3.0.17\webapps下;
  (2)打开resin-3.0.17\conf下的resin.conf文件,把
 
  <!-- configures the default host, matching any host name -->
 
  下面的内容改成:
 
  <host id="" root-directory=".">      
   <web-app id="/" document-directory="webapps/nutch-0.7.1"/>
   <stderr-log path='logs/stderr.log' rollover-period='1W'/>
   <stdout-log path='logs/stdout.log' rollover-period='1W'/>
  </host>
 
  (3)打开resin-3.0.17\webapps\nutch-0.7.1\WEB-INF\classes下的nutch-site.xml文件,修改成如下形式:
 
  <?xml version="1.0"?>
  <?xml-stylesheet type="text/xsl" href="nutch-conf.xsl"?>

  <!-- Put site-specific property overrides in this file. -->

  <nutch-conf>
   <property>
    <name>searcher.dir</name>
    <value>I:/nutch-0.7.1/crawled</value>
   </property>
  </nutch-conf>

  其中的“<value>I:/nutch-0.7.1/crawled</value>”部分,读者应根据自己的设置进行相应修改。

  (4)启动Resin,打开浏览器在地址栏中输入http://localhost:8080后,在Nutch的搜索框中输入关键字,点击“搜索”按钮会出现如图3所示的错误。



  查看resin-3.0.17\logs下的stdout.log文件,会发现报空指针的错误。查阅相关资料后才知,原来Resin没有使用 Xerces作为其默认的XML解析器,而Nutch又恰好用到了Xerces,因此应该在Resin的配置文件中明确告之要使用Xerces。打开 resin-3.0.17\conf下的resin.conf文件,在<server>标签的上面加上两行内容:

  <system-property javax.xml.parsers.DocumentBuilderFactory="org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/>
  <system-property javax.xml.parsers.SAXParserFactory="org.apache.xerces.jaxp.SAXParserFactoryImpl"/>
 
  同时,还要将tomcat\common\endorsed下的xercesImpl.jar、xmlParserAPIs.jar复制到resin-3.0.17\lib目录中。重新启动Resin,打开http://localhost:8080并输入要搜索的关键字后,这时终于不再出现空指针错误了,但是却出现了如图4所示的错误。
 

 
  这个错误出得有些莫明其妙,同样的内容在Tomcat里安然无恙,但是在Resin中却会出现找不到/zh/include/footer.html文件的异常。没办法只好手工将resin-3.0.17\webapps\nutch-0.7.1\include下的footer.html文件复制到 resin-3.0.17\webapps\nutch-0.7.1\zh\include目录中。重启Resin进行搜索,终于又见到了久违的如前图2 所示的搜索结果了。
 
  6、总结
 
  Nutch目前对中文分词的支持还不够完善,从测试的结果来看它是将中文词语分成单独的字进行处理的。但是瑕不掩瑜,作为一个开源的搜索引擎项目,Nutch的功能不仅可圈可点,而且从对它源代码的解读中可以使我们对搜索引擎的运行机理和相关算法有了更加深入的了解。此外,Nutch优秀的设计架构使得用户能够非常容易的开发自己的插件,以实现个性化的需求与功能。相信随着Nutch不断的改进和成熟,在不久的将来,基于Nutch的个人搜索引擎以及行业垂直搜索引擎会不断的涌现出来。



参考资料:
1、Nutch tutorial
2、Getting Nutch Running With Windows
3、Getting Nutch Running With Resin
4、Nutch 初体验之二

http://www.blogjava.net/dev2dev/archive/2006/02/07/29765.html

kevin 2006-07-05 10:22
Nutch在Windows中安装之细解
 
  近来Nutch一词在网络中时有所见,但囿于平常工作繁忙而未能潜心细读与研究,只知道Nutch是Apache组织的一个开源项目,利用它用户可以建立自己内部网的搜索引擎,也可以建立针对整个网络的搜索引擎。好在春节假日期间,终于得空可以从容对其进行一番解读与测试了。在使用Nutch之前,当然是需要先对其进行安装了。用搜索引擎查找了一下相关内容,发现大部分关于Nutch如何安装的文章都是基于Linux的,而基于Windows安装的文章虽有,但非常简略。由于运行Nutch自带的脚本命令需要Linux的环境,所以必须首先安装Cygwin来模拟这种环境,而Cygwin本身的安装与使用也不是一件简单的事。下面,就让笔者对Nutch在Windows系统中的安装进行一番细解吧!
 
  1、安装Cygwin
 
  首先,我们去http://www-inst.eecs.berkeley.edu/~instcd/iso/下载到Cygwin软件的ISO文件,用Daemon软件将其设为虚拟光驱后,双击其中的Setup文件,出现程序安装的向导界面(如图1所示)。
 
 
  点击“下一步”后,安装向导要求选择Cygwin的安装方式,如图2所示:
 
 
  图示中共有三种安装方式:
  (1)Install from Internet:从Internet上下载并安装软件;
  (2)Download Without Installing:从Internet上下载安装的文件,但暂时不安装;
  (3)Install from Local Directory:从本地含有安装文件的目录进行安装。
  我们选择第三项“Install from Local Directory”后,点击“下一步”,如图3所示:
 
 
  安装向导要求选择Cygwin的安装路径,我们可以在“Root Directory”文本框中更改安装路径,点击“下一步”,如图4所示:
 
       
  安装向导要求选择Cygwin安装文件所在的本地存储路径,可以在“Local Package Directory”中设置,点击“下一步”,如图5所示:
 
 
  安装向导显示出所要安装的内容列表,用户可以根据自己的实际需要来决定安装哪些程序。点击循环箭头图标后面的文字,可以更改安装的方式,常用的方式有 Default(表示只安装缺省的安装项)、Install(表示安装全部程序,空间要求较大)、Reinstall(表示重新安装程序)。推荐选择 “Install”方式,一步到位,以免后扰,不过用户应保证至少有2G以上的空间可供使用。点击“下一步”后,就开始正式的安装了(如图6所示)。
 
 
  最后出现如图7所示的窗口,点击“完成”后,Cygwin安装完毕。
 
 
  至此,笔者还要对Cygwin再多说几句。Cygwin是一个在Windows平台上模拟运行Unix的环境,用户可以通过它来熟悉与学习Unix系统的操作。对于Unix系统还不甚熟悉的读者可以参阅笔者之前写作的《Unix操作系统的入门与基础》、《Unix的轻巧“约取而实得”》系列文章,下文中对涉及使用到的Unix命令将不再给予详细解释。
 
  2、安装Nutch
 
  去http://mirror.vmmatrix.net/apache/lucene/nutch/下载到Nutch的最新版本,将其解压到指定目录中,如笔者是将其解压到I:\nutch-0.7.1中。
 
  3、测试Nutch命令
 
  在运行Nutch的脚本命令前,需要设置一些环境变量。Cygwin提供了一个名为cygwin.bat的文件,通过它可以自动完成必需环境变量的设置。该文件可在cygwin所在的根目录下找到,感兴趣的读者还可通过UltraEdit等编辑器打开该文件一查究竟。其实Cygwin安装完成之后,会在Windows系统桌面生成一图标,如图8所示:
 
 
  此图标就是cygwin根目录下cygwin.bat文件的快捷方式,双击此图标将打开一类似DOS窗口。由于先前笔者将Nutch的压缩包解压至I: \nutch-0.7.1中,故在此命令窗口中输入命令“cd /cygdrive/i/nutch-0.7.1”,读者可根据自己的安装路径进行相应的修改,然后使用命令“ls -l”可查看nutch-0.7.1中的所有子目录及文件信息。执行命令“bin/nutch”,如果读者能看到如图9所示的提示,那恭喜你,Nutch 在Windows系统中的安装已经大功告成了!
 
 
  至于Nutch的使用,且待后续分解:)



参考文献:
1、Getting Nutch Running With Windows
2、Nutch 初体验
3、Nutch 于 winxp
4、Cygwin使用指南

kevin 2006-07-05 10:24
http://blog.csdn.net/zjzcl/archive/2006/02/01/590537.aspx
http://www-inst.eecs.berkeley.edu/~instcd/iso/


Nutch 初体验之二

前几天介绍了 Nutch 的基本信息 以及 如何使用 Nutch 进行 Intranet crawling。下面进行一下全网的爬行(Whole-web Crawling) 的操作测试。

Nutch 的数据包括两种类型:

  * Web 数据库。包含所有Nutch可以辨别的页面,以及这些页面间的链接信息。
  * 段(segment)集合. 每个 segment 是作为一个单元(unit)被获取并索引的页面集合。Segment 数据包括如下类型:
      o fetchlist:指定待获取的一个页面集合的文件
      o fetcher output:包含获取到的页面的文件集合
      o index:fetcher 输出的 Lucene 格式的索引

注:如果发现有解释不清的地方,请参考这里,不过说实话,Nutch的文档远远不够完善,还存在很多语焉不详的地方。

创建相关的目录并创建一个空的 web 数据库:

  [root@fc3 nutch]# mkdir db
  [root@fc3 nutch]# mkdir segments
  [root@fc3 nutch]# bin/nutch admin db -create
  run java in /u01/app/oracle/product/10.1.0/db_1/jdk/jre
  050104 122933 loading file:/u01/nutch/conf/nutch-default.xml
  050104 122934 loading file:/u01/nutch/conf/nutch-site.xml
  050104 122934 Created webdb at db
  [root@fc3 nutch]# tree db
  db
  |-- dbreadlock
  |-- dbwritelock
  `-- webdb
    |-- linksByMD5
    |   |-- data
    |   `-- index
    |-- linksByURL
    |   |-- data
    |   `-- index
    |-- pagesByMD5
    |   |-- data
    |   `-- index
    `-- pagesByURL
        |-- data
        `-- index

  5 directories, 10 files
  [root@fc3 nutch]#

接下来需要用“注射器(injector)”把网址"注入"到数据库中。Nutch 的文档中是从 DMOZ 获取一个 URL 集合,然后取一个子集进行处理。不过该文档实在是太大了。这里用了 http://rdf.dmoz.org/rdf/ 目录下的 content.example.txt 文件做测试。

  [root@fc3 nutch]# bin/nutch inject db -dmozfile content.example.txt
  run java in /u01/app/oracle/product/10.1.0/db_1/jdk/jre
  050104 123105 loading file:/u01/nutch/conf/nutch-default.xml
  050104 123106 loading file:/u01/nutch/conf/nutch-site.xml
  050104 123106 skew = 1251308788
  050104 123106 Begin parse
  050104 123106 Using URL filter: net.nutch.net.RegexURLFilter
  050104 123106 found resource regex-urlfilter.txt at file:/u01/nutch/conf/regex-urlfilter.txt
  .050104 123106 Completed parse. Added 40 pages.
  ......
  [root@fc3 nutch]#

还好,40 个 URL 而已。不算太多。

获取 URL

从数据库中创建 fetchlist :

  [root@fc3 nutch]# bin/nutch generate db segments

segments 目录的基本信息:

  [root@fc3 nutch]# tree segments
  segments
  `-- 20050104135736
    `-- fetchlist
        |-- data
        `-- index

  2 directories, 2 files
  [root@fc3 nutch]#

接下来需要把 segments 目录“20050104135736”保存到一个环境变量中,供以后使用。

  [root@fc3 nutch]# s1=`ls -d segments/2* | tail -1`

运行 fetcher,获取这些 URL 信息:

 
  [root@fc3 nutch]# bin/nutch fetch $s1

之后需要更新数据库,把获取到的页面信息存入数据库中:

  [root@fc3 nutch]# bin/nutch updatedb db $s1

进行链接分析(analyze: adjust database link-analysis scoring),深度这里设定为3 ,来决定下次 fetch 操作的优先权:

  [root@fc3 nutch]# bin/nutch analyze db 3

创建新的 segment ,选择分值排在前 10 的URL(一个很小的子集)来进行第二次获取:

  [root@fc3 nutch]# bin/nutch generate db segments -topN 10

把新的 segments 名字存到 $s2 变量中。

  [root@fc3 nutch]# s2=`ls -d segments/2* | tail -1`
  [root@fc3 nutch]# echo $s2
  segments/20050104140654
  [root@fc3 nutch]# echo $s1
  segments/20050104135736
  [root@fc3 nutch]# tree segments
  segments
  |-- 20050104135736
  |   |-- content
  |   |   |-- data
  |   |   `-- index
  |   |-- fetcher
  |   |   |-- data
  |   |   `-- index
  |   |-- fetchlist
  |   |   |-- data
  |   |   `-- index
  |   |-- parse_data
  |   |   |-- data
  |   |   `-- index
  |   `-- parse_text
  |     |-- data
  |     `-- index
  `-- 20050104140654
    `-- fetchlist
        |-- data
        `-- index

  8 directories, 12 files
  [root@fc3 nutch]#

然后依样画葫芦,进行第二次获取,更新,以及分析:

  [root@fc3 nutch]# bin/nutch fetch $s2
  ......
  [root@fc3 nutch]# bin/nutch updatedb db $s2
  ......
  [root@fc3 nutch]# bin/nutch analyze db 3
  ......

如法炮制,再来第三次:

  [root@fc3 nutch]# bin/nutch generate db segments -topN 5
  ......
  [root@fc3 nutch]# s3=`ls -d segments/2* | tail -1`
  ......
  [root@fc3 nutch]# bin/nutch fetch $s3
  ......
  [root@fc3 nutch]# bin/nutch updatedb db $s3
  ......
  [root@fc3 nutch]# bin/nutch analyze db 3
  ......

创建索引并去掉重复的 URL

  [root@fc3 nutch]# bin/nutch index $s1
  ......
  [root@fc3 nutch]# bin/nutch index $s2
  ......
  [root@fc3 nutch]# bin/nutch index $s3
  ......

去除重复页面:

  [root@fc3 nutch]# bin/nutch dedup segments dedup.tmp

配置 Tomcat

  [root@fc3 nutch]# rm -rf /opt/Tomcat/webapps/ROOT*
  [root@fc3 nutch]# cp nutch*.war /opt/Tomcat/webapps/ROOT.war
  [root@fc3 nutch]# cd /opt/Tomcat/webapps/
  [root@fc3 webapps]# jar xvf ROOT.war
  ......
  [root@fc3 nutch]# ../../opt/Tomcat/bin/catalina.sh start

注意:webapp 必须要在相对路径 ./segments 找到具体数据。否则在搜索的时候会报告如下异常信息:

  java.lang.NullPointerException
    at net.nutch.searcher.NutchBean.init(NutchBean.java:82)
    at net.nutch.searcher.NutchBean.>init<(NutchBean.java:68)
    at net.nutch.searcher.NutchBean.>init<(NutchBean.java:58)
    at net.nutch.searcher.NutchBean.get(NutchBean.java:50)
    at org.apache.jsp.search_jsp._jspService(search_jsp.java:66)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)

搜索测试:
Nutch Whole Web Search Test
其他想法

Nutch 的机器人还不如其他商业搜索引擎的那样灵活(需要“喂"给它URL)。但是比较适合一些特定应用。比如 Grassland 这样的小型特性目的的搜索引擎,可以用 Nutch + Lucene 来比较完美的实现。单独做一个收集 URL (RSS ?)信息的工具,然后 Nutch 进行处理,Lucene 来实现更为完善的全文搜索功能。希望能看到越来越多的实际项目应用到 Nutch 。

参考信息

  * Nutch Wiki - http://www.nutch.org/cgi-bin/twiki/view/Main/Nutch
  * 何东的 试用Nutch
  * 车东的 Lucene:基于Java的全文检索引擎简介

后记:

很多朋友都遇到 Nutch 0.6 输入中文会出现乱码的问题。这个问题其实和 Nutch 关系不大,主要原因是使用 Tomcat 5.0 的问题。解决办法是修改 Tomcat 的server.xml 文件的connnector:

    <Connector port="8080"
            maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
            enableLookups="false" redirectPort="8443" acceptCount="100"
            connectionTimeout="20000" disableUploadTimeout="true"
            URIEncoding="UTF-8" useBodyEncodingForURI="true" />

黑色部分是需要添加的.之后乱码问题就解决了.

Tags: Nutch Lucene

Posted by Fenng on January 4, 2005 12:24 PM | Last modified at December 11, 2005 10:13 PM | Permalink | Web | 编辑


站内相关文章|Related Articles

  * Nutch 0.6 is out ! - Jan 17, 2005
  * Heritrix Crawler vs. Nutch Crawler - Jan 14, 2005
  * Nutch 也将并入 Apache 项目? - Jan 13, 2005
  * Nutch 0.6 中新的改进 - Jan 05, 2005
  * Nutch 初体验 - Jan 02, 2005

kevin 2006-07-05 10:26
http://www.dbanotes.net/archives/2005/01/nutch_aee.html

jboss 2006-07-05 11:33
Nutch 初体验

作者:Fenng
出处:http://www.dbanotes.net
日期:January 02, 2005

« ITPub Search Plugin for Firefox and Mozilla | Blog首页 | Google PR 更新以及其他 »

前几天看到卢亮的 Larbin 一种高效的搜索引擎爬虫工具 一文提到 Nutch,很是感兴趣,但一直没有时间进行测试研究。趁着假期,先测试一下看看。用搜索引擎查找了一下,发现中文技术社区对 Larbin 的关注要远远大于 Nutch 。只有一年多前何东在他的竹笋炒肉中对 Nutch 进行了一下介绍。

Nutch vs Lucene
Lucene 不是完整的应用程序,而是一个用于实现全文检索的软件库。
Nutch 是一个应用程序,可以以 Lucene 为基础实现搜索引擎应用。

Nutch vs GRUB
GRUB 是一个分布式搜索引擎(参考)。用户只能得到客户端工具(只有客户端是开源的),其目的在于利用用户的资源建立集中式的搜索引擎。
Nutch 是开源的,可以建立自己内部网的搜索引擎,也可以针对整个网络建立搜索引擎。自由(Free)而免费(Free)。

Nutch vs Larbin
"Larbin只是一个爬虫,也就是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。[引自这里]
Nutch 则还可以存储到数据库并建立索引。
Nutch Architecture.png
[引自这里]

Nutch 的早期版本不支持中文搜索,而最新的版本(2004-Aug-04 发布了 0.5)已经做了很大的改进。相对先前的 0.4 版本,有 20 多项的改进,结构上也更具备扩展性。0.5 版经过测试,对中文搜索支持的也很好。

下面是我的测试过程。

前提条件(这里Linux 为例,如果是 Windows 参见手册):

  * Java 1.4.x 。因为我的系统上安装的Oracle 10g 已经有 Java 了。设定环境变量:NUTCH_JAVA_HOME 。

      [root@fc3 ~]# export NUTCH_JAVA_HOME=/u01/app/oracle/product/10.1.0/db_1/jdk/jre

  * Tomcat 4.x 。从这里下载。
  * 足够的磁盘空间。我预留了 4G 的空间。

首先下载最新的稳定版:

  [root@fc3 ~]# wget http://www.nutch.org/release/nutch-0.5.tar.gz

解压缩:

  [root@fc3 ~]# tar -zxvf nutch-0.5.tar.gz
  ......
  [root@fc3 ~]# mv nutch-0.5 nutch

测试一下 nutch 命令:

  [root@fc3 nutch]# bin/nutch
  Usage: nutch COMMAND
  where COMMAND is one of:
    crawl         one-step crawler for intranets
    admin         database administration, including creation
    inject         inject new urls into the database
    generate       generate new segments to fetch
    fetchlist       print the fetchlist of a segment
    fetch         fetch a segment's pages
    dump         dump a segment's pages
    index         run the indexer on a segment's fetcher output
    merge         merge several segment indexes
    dedup         remove duplicates from a set of segment indexes
    updatedb       update database from a segment's fetcher output
    mergesegs       merge multiple segments into a single segment
    readdb         examine arbitrary fields of the database
    analyze       adjust database link-analysis scoring
    server         run a search server
  or
    CLASSNAME       run the class named CLASSNAME
  Most commands print help when invoked w/o parameters.
  [root@fc3 nutch]#

Nutch 的爬虫有两种方式

  * 爬行企业内部网(Intranet crawling)。针对少数网站进行。用 crawl 命令。
  * 爬行整个互联网。 使用低层的 inject, generate, fetch 和 updatedb 命令。具有更强的可控制性。

以本站(http://www.dbanotes.net)为例,先进行一下针对企业内部网的测试。
在 nutch 目录中创建一个包含该网站顶级网址的文件 urls ,包含如下内容:

  http://www.dbanotes.net/

然后编辑conf/crawl-urlfilter.txt 文件,设定过滤信息,我这里只修改了MY.DOMAIN.NAME:

  # accept hosts in MY.DOMAIN.NAME
  +^http://([a-z0-9]*\.)*dbanotes.net/

运行如下命令开始抓取分析网站内容:

  [root@fc3 nutch]# bin/nutch crawl urls -dir crawl.demo -depth 2 -threads 4 >& crawl.log

depth 参数指爬行的深度,这里处于测试的目的,选择深度为 2 ;
threads 参数指定并发的进程 这是设定为 4 ;

在该命令运行的过程中,可以从 crawl.log 中查看 nutch 的行为以及过程:

  ......
  050102 200336 loading file:/u01/nutch/conf/nutch-site.xml
  050102 200336 crawl started in: crawl.demo
  050102 200336 rootUrlFile = urls
  050102 200336 threads = 4
  050102 200336 depth = 2
  050102 200336 Created webdb at crawl.demo/db
  ......
  050102 200336 loading file:/u01/nutch/conf/nutch-site.xml
  050102 200336 crawl started in: crawl.demo
  050102 200336 rootUrlFile = urls
  050102 200336 threads = 4
  050102 200336 depth = 2
  050102 200336 Created webdb at crawl.demo/db
  050102 200336 Starting URL processing
  050102 200336 Using URL filter: net.nutch.net.RegexURLFilter
  ......                    
  050102 200337 Plugins: looking in: /u01/nutch/plugins            
  050102 200337 parsing: /u01/nutch/plugins/parse-html/plugin.xml    
  050102 200337 parsing: /u01/nutch/plugins/parse-pdf/plugin.xml      
  050102 200337 parsing: /u01/nutch/plugins/parse-ext/plugin.xml      
  050102 200337 parsing: /u01/nutch/plugins/parse-msword/plugin.xml    
  050102 200337 parsing: /u01/nutch/plugins/query-site/plugin.xml    
  050102 200337 parsing: /u01/nutch/plugins/protocol-http/plugin.xml  
  050102 200337 parsing: /u01/nutch/plugins/creativecommons/plugin.xml
  050102 200337 parsing: /u01/nutch/plugins/language-identifier/plugin.xml
  050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml    
  050102 200337 logging at INFO                            
  050102 200337 fetching http://www.dbanotes.net/                
  050102 200337 http.proxy.host = null                      
  050102 200337 http.proxy.port = 8080                      
  050102 200337 http.timeout = 10000                        
  050102 200337 http.content.limit = 65536                    
  050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html; n
  utch-agent@lists.sourceforge.net)
  050102 200337 fetcher.server.delay = 1000                    
  050102 200337 http.max.delays = 100                        
  050102 200338 http://www.dbanotes.net/: setting encoding to GB18030  
  050102 200338 CC: found http://creativecommons.org/licenses/by-nc-sa/2.0/ in rdf of http:
  //www.dbanotes.net/
  050102 200338 CC: found text in http://www.dbanotes.net/          
  050102 200338 status: 1 pages, 0 errors, 12445 bytes, 1067 ms      
  050102 200338 status: 0.9372071 pages/s, 91.12142 kb/s, 12445.0 bytes/page
  050102 200339 Updating crawl.demo/db                      
  050102 200339 Updating for crawl.demo/segments/20050102200336      
  050102 200339 Finishing update                          
                                                  64,1       7%
  050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml
  050102 200337 logging at INFO
  050102 200337 fetching http://www.dbanotes.net/
  050102 200337 http.proxy.host = null
  050102 200337 http.proxy.port = 8080
  050102 200337 http.timeout = 10000
  050102 200337 http.content.limit = 65536
  050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html;
  nutch-agent@lists.sourceforge.net)
  050102 200337 fetcher.server.delay = 1000
  050102 200337 http.max.delays = 100
  ......

之后配置 Tomcat (我的 tomcat 安装在 /opt/Tomcat) ,

  [root@fc3 nutch]# rm -rf /opt/Tomcat/webapps/ROOT*
  [root@fc3 nutch]# cp nutch*.war /opt/Tomcat/webapps/ROOT.war
  [root@fc3 webapps]# cd /opt/Tomcat/webapps/
  [root@fc3 webapps]# jar xvf ROOT.war
  [root@fc3 webapps]# ../bin/catalina.sh start

浏览器中输入 http://localhost:8080 查看结果(远程查看需要将 localhost 换成相应的IP):
nutch web search interface.png

搜索测试:
nutch web search result.png

可以看到,Nutch 亦提供快照功能。下面进行中文搜索测试:
nutch web Chinese search result.png

注意结果中的那个“评分详解”,是个很有意思的功能(Nutch 具有一个链接分析模块),通过这些数据可以进一步理解该算法。

考虑到带宽的限制,暂时不对整个Web爬行的方式进行了测试了。值得一提的是,在测试的过程中,nutch 的爬行速度还是不错的(相对我的糟糕带宽)。

Nutch 目前还不支持 PDF(开发中,不够完善) 与 图片 等对象的搜索。中文分词技术还不够好,通过“评分详解”可看出,对中文,比如“数据库管理员”,是分成单独的字进行处理的。但作为一个开源搜索引擎软件,功能是可圈可点的。毕竟,主要开发者 Doug Cutting 就是开发 Lucene 的大牛

参考信息

  * Nutch Wiki - http://www.nutch.org/cgi-bin/twiki/view/Main/Nutch
  * 何东的 试用Nutch
  * 车东的 Lucene:基于Java的全文检索引擎简介


Posted by Fenng at January 2, 2005 08:00 PM
Last updated at 06:20 PM on August 20, 2005

相关文章:

  * 关于 Nutch 的一个问题: 中文乱码 - Sep 17, 2005
  * Some Hints for Nutch - Feb 19, 2005
  * Nutch 开始被 Apache "孵化" - Jan 28, 2005

jboss 2006-07-05 11:40
http://blog.csdn.net/zjzcl/archive/2006/02/06/593138.aspx

下面说说我的配置,也好给大家一个参考:
1,Tomcat 4.1.30
2,JDK 1.4.2
3,Nutch 0.6
4,cygwin(装gcc)

安装过程:
1,安装JDK(在C:\jdk),配置环境变量NUTCH_JAVA_HOME = C:jdk
2,安装Tomcat(在C:\Tomcat)
3,安装cygwin
4,在cygwin中你的目录下,建一个目录,用来存放nutch,比如我的是:D:\cygwin\home\iwind\nutch,然后装nutch 0.6压缩包解压到这里。
5,运行Tomcat,在http://localhost:8080/manager/html上传nutch根目录下的nutch-0.6.war文件。
6,关掉Tomcat,将C:\tomcat\webapps下的ROOT文件名改成其它的,比如ROOT1,将nutch 0.6之类的目录名改成ROOT,这样你访问http://localhost:8080 时,就直接到nutch搜索了

以上步骤完成之后,就可以抓取网页了。

在nutch根目录下创建一个文件urls(应该是可以改成其它的),输入抓取的开始页,比如 http://www.4kiki.net/

在nutch/conf下的crawl-urlfilter.txt里可以配置抓到的url特征,比如在# accept anything else下,将+.注释掉,换成自己的
+^http://([a-z0-9]*\.)*4kiki.net/

保存就ok了,这里需要注意的是这个urls里的内容要和这个规则相匹配,不然无法开始抓取。

打开cygwin,cd到nutch目录下,运行
bin/nutch crawl urls -dir crawl.demo -depth 2 -threads 4
可以看到就开始了,这里的depth是深度,threads是线程数,urls就是刚才我们创建的那个文件,dir是抓取内容存放的地址。

过一段时间,cygwin抓完页面后就会停止。我们在
C:\tomcat\webapps\ROOT\WEB-INF\classes\nutch-site.xml
里,将
<nutch-conf>
</nutch-conf>
换成
<nutch-conf>
<property>
<name>searcher.dir</name>
<value>D:\cygwin\home\Administrator\nutch\crawl.demo</value>
</property>
</nutch-conf>

再启动tomcat,输入http://localhost:8080,就会发现我们自己的搜索引擎终于能搜索了。

jboss 2006-07-05 19:07
试用nutch
  今天看站点的log,发现有几个搜索nutch的反向链接过来。其实我只是在java编码规范一文提了一下这个词,这样的结果肯定让前来的朋友倍感失望。
  下面将我对nutch的一些试用公布一下,供有兴趣的朋友参阅。需要说明的是,nutch现在没有稳定的release,还在不断地根据反馈进行修改,而且目前还不支持汉语的检索。总而言之,现在这个版本对中国用户而言还不实用。我想,这也应当是一直研究并关注nutch的车东没有写笔记的原因吧。
  前几天和车东在msn上谈起,觉得目前搭建网站时实现本站检索的最好的方案,是采用车东基于lucene的开源项目web lucene的软件包。而nutch似乎比较适合于建立垂直搜索引擎网站,至少目前如此,我认为。


1、下载安装

  不知为什么,这个网站不能直接访问。我用的是2003-09-18的打包(有兴趣的朋友可从此下载),在Red Hat Linux 8.0+JRE 1.4.1+Tomcat 4.1试用通过。

tar zxvf nutch-2003-09-18.tar.gz
cd nutch-2003-09-18 <----命令执行完后所在目录称之为$NUTCH_HOME,仅供描述之用。
ant
ant package
bin/nutch <---如果一切正常,此时应出现“Usage: nutch COMMAND”等字样



2、试运行脚本说明

  这个脚本是cutting在tutorial中说明的整理。脚本中的命令最好通过脚本依次运行,$s1、$s2和$s3三个变量的赋值表达式是一样的,但三个值不相同,这依赖于运行的上下文。我第一次运行时,就犯了弱智的错误,拆开运行,结果出错。:)

初始准备  
mkdir db 建立目录存放web database
mkdir segments
bin/nutch admin db -create 建一个新的空的数据库
第一轮抓取  
bin/nutch inject db -dmozfile content.rdf.u8 -subset 3000 从DMOZ列表中取得URL并加入数据库
bin/nutch generate db segments 根据数据库内容,生成一个抓取列表(fetchlist)
s1=`ls -d segments/2* | tail -1` 刚才生成的抓取列表放在最后一个目录中,取其名
bin/nutch fetch $s1 利用机器人抓页面
bin/nutch updatedb db $s1 利用抓取结果更新数据库
第二轮抓取  
bin/nutch analyze db 5 迭代5次分析页面的链接
bin/nutch generate db segments -topN 1000 将排行前1000个URL生成新的抓取列表
s2=`ls -d segments/2* | tail -1` 执行抓取、更新、并迭代2次分析链接
bin/nutch fetch $s2
bin/nutch updatedb db $s2
第三轮抓取  
bin/nutch analyze db 2
bin/nutch generate db segments -topN 1000
s3=`ls -d segments/2* | tail -1`
bin/nutch fetch $s3
bin/nutch updatedb db $s3
bin/nutch analyze db 2 (为下一次做准备?)
索引并去重  
bin/nutch index $s1
bin/nutch index $s2
bin/nutch index $s3
bin/nutch dedup segments dedup.tmp
重启tomcat  
catalina.sh start 在./segments所在的目录中启动



3、脚本的改动与下载

  DMOZ的文件太大了,下载不易,如果仅为实验,似乎也没必要从那里选URL。我改了一下脚本,在$NUTCH_HOME目录下建立一个urls.txt文件,里面一行一个打算搜索的网站的URL,nutch将从这个urls.txt中取站点的URL。
  脚本可以下载以参考,运行脚本放在$NUTCH_HOME目录下,参考下列命令运行:
sh all.sh


4、提供web检索

  前面忙活了半天,只是把网页抓回来、解析了网页并做作了索引。下面说明一下如何利用nutch自己带的jsp程序提供检索服务。

cd $TOMCATHOME/webapps
mv ROOT ROOTOLD
mkdir ROOT
cd ROOT
cp $NUTCH_HOME/nutch-2003-09-18.war ./ROOT.war
jar xvf ROOT.war
cd $NUTCH_HOME
$TOMCAT_HOME/bin/shutdown.sh
$TOMCAT_HOME/bin/catalina.sh start


  此时,如果不出意外,应可以访问了。
  我的试用URL是http://cdls.nstl.gov.cn/se/,(其中我把nutch改动了一下,没把它放在ROOT目录下),供参考。此时,不要检索汉字,只能检索英文,如hedong 或lucene什么的。

  试用仓促,难免有错,欢迎朋友进行交流。

参考文献:
基于Lucene/XML的站内全文检索解决方案
http://www.chedong.com/tech/weblucene.html

Lucene学习笔记(2)
http://hedong.3322.org/archives/000208.html

jboss 2006-07-05 19:08
让Nutch支持中文分词
Nutch搜索引擎是一个构建在Lucene上的开放源代码的搜索引擎。可以通过CVS取得它的最新版本。让nutch支持中文分词的方法和Lucene类似,但是nutch很多时候调用了底层的Lucene API。因此需要我们做更多的工作。



一、修改查询分析器



需要修改的文件是:net.nutch.analysis.NutchAnalysis.java。这个文件是从NutchAnalysis.jj使用JavaCC自动生成的,但是我们可以手工修改它以支持中文。



package net.nutch.analysis;



import net.nutch.searcher.Query;

import java.io.*;



/** The JavaCC-generated Nutch lexical analyzer and query parser. */

public class NutchAnalysis {



private String queryString;



/** Construct a query parser for the text in a reader. */

public static Query parseQuery(String queryString) throws IOException {

  NutchAnalysis parser =

    new NutchAnalysis();

  parser.queryString = queryString;

  return parser.parse();

}



/** For debugging. */

public static void main(String[] args) throws Exception {

    String sentence ="厦门大学艺术教育学院副院长李未明教授长期从事音乐教学,";

    StringReader input= new java.io.StringReader(sentence);

  BufferedReader in = new BufferedReader(input);

  //while (true) {

    System.out.print("Query: ");

    String line = in.readLine();

    System.out.println(parseQuery(line));

  //}

}



/** Parse a query. */

final public Query parse() throws IOException {

    Query query = new Query();

    StringReader input;

   

    input = new java.io.StringReader(queryString);



    org.apache.lucene.analysis.TokenStream tokenizer = new seg.result.CnTokenizer(input);



    //just a demo

    for (org.apache.lucene.analysis.Token t = tokenizer.next(); t != null; t = tokenizer.next())

    {

        String[] array = {t.termText()};

        query.addRequiredPhrase(array, t.type());

    }

    return query;

}

}



二、测试



在命令行执行:



>java "-Ddic.dir=D:/SSeg/Dic" -classpath D:\lucenne\lucene-1.4-final.jar;D:\SSeg\lib\seg.jar;D:\SSeg\lib\nutch.jar net.nutch.analysis.NutchAnalysis



返回的查询对象内容是:



Query: ns:厦门 n:大学 n:艺术 vn:教育 n:学院 b:副 n:院长 nr:李 nr:未明 n:教授 d:长期 v:从事 n:音乐 vn:教学 w:,



在unix的命令行下执行略有不同:



$java "-Ddic.dir=/home/nutch/Dic" -cp /home/nutch/lib/lucene-1.4-final.jar:/home/nutch/lib/seg.jar:/home/nutch/lib/nutch.jar net.nutch.analysis.NutchAnalysis


查看完整版本: [-- Nutch 使用之锋芒初试 --] [-- top --]


Powered by PHPWind v6.0 Code © 2003-05 PHPWind
Gzip enabled

You can contact us