第一章 Nutch印象
Nutch是什么
Nutch是Apache旗下的Java开源项目,最初是一个搜索引擎,现在是一个网络爬虫。
研究nutch的原因
我们有google,有百度,为何还需要建立自己的搜索引擎呢?
透明度
nutch是开放源代码的,因此任何人都可以查看它的排序算法是如
何工作的。商业的搜索引擎排序算法都是保密的,我们不知道搜索出来的排序结果是如何计算的。更进一步,一些搜索引擎允许竞价排名,比如百度,这样的索引结果并不是和站点内容相关的。因此nutch 对学术搜索和政府类站点的搜索来说,是个好选择,因为一个公平的排序结果是非常重要的。
对搜索引擎的理解
我们并没有google的源代码,因此学习搜索引擎Nutch是个不错的选择。
扩展性
利用Nutch构建自己的搜索引擎,Nutch 是非常灵活的:他可以被很好的客户订制并集成到你的应用程序中,使用Nutch 的插件机制,Nutch 可以作为一个搜索不同信息载体的搜索平台。当然,最简单的就是集成Nutch到你的站点,为你的用户提供搜索服务。
Nutch的特性
插件架构,高度模块化
大多数功能可通过插件来实现和改变
易扩展,极强的伸缩性
增加机器即可,不用修改代码,从一台可扩展到成千上万台
高可用性,健壮容错
容忍宕机情况的出现
灵活可配置
提供了162个配置参数
Nutch的设计初衷
商业搜索引擎不开源,搜索结果不仅仅是根据网页本身的价值进行排序,而是有众多商业利益考虑。Nutch提供了开源的解决方案,帮助人们很容易地建立一个搜索引擎,为用户提供优质的搜索结果,并能从一台机器扩展到成百上千台。
我们学习的目的
通过Nutch爬取邮箱账号。
第二章 Nutch的安装配置
必备环境
Linux操作系统、jdk
Nutch安装
#从svn检出Nutch1.6项目
[root@nutch nutch2]# svn co https://svn.apache.org/repos/asf/nutch/tags/release-1.6/
#进入release-1.6目录
[root@nutch nutch2]# cd release-1.6/
#ant命令编译nutch1.6
[root@nutch release-1.6]# ant
注意:需要在build.xml所在目录中运行ant命令编译nutch
Ant构建之后,生成runtime文件夹,在runtime下有local和deploy两个子文件夹,分别代表nutch的两种运行方式。
Deploy:使用hadoop的方式运行,数据存储在hdfs文件系统中
Local:使用本地文件系统来运行
deploy和local区别
数据的存储位置不同
local模式中对hadoop没有依赖
deploy运行方式必须将数据存储到hadoop,对hadoop依赖
#查看bin/nutch脚本
[root@nutch local]# vi bin/nutch
通过查看bin/nutch脚本可以发现,在deploy模式下nutch是依赖于hadoop平台的
Nutch和Hadoop是通过什么连接起来的?
通过nutch脚本,hadoop命令把apache-nutch-1.6.job提交给hadoop的JobTracker。
#启动nutch
[root@nutch local]# bin/nutch
三、bin/nutch下相关命令
Crawl 命令
#查看crawl命令用法
[root@nutch local]# bin/nutch crawl
Usage: Crawl <urlDir> -solr <solrURL> [-dir d] [-threads n] [-depth i] [-topN N]
初学时不知道每一个命令选项用于干嘛?这种情况下我们可以通过研读源代码的方式查看相应选项参数。
<urlDir>选项参数
#放置需要爬取的网站的url文件
[root@nutch local]# mkdir urls
#建立url文件,放置需要爬取的url网址
[root@nutch urls]# vi url
-solr <solrURL>选项参数
此参数可选,可加可不加
Nutch把网页爬取下来后,将爬取网页交给solr进行索引,之后用户通过solr来进行内容的搜索,Nutch本身并不做索引方面的工作,它只是把文档提交给solr,solr负责索引。
从这些可以看出,Nutch目前是一个网络爬虫,而不是一个搜索引擎。它的目标已经从搜索引擎蜕变为网络爬虫。
[-dir d]选项参数
爬取的页面保存地址
[-threads n]选项参数
因为现在是本地模式,在本地模式下只有一个map和一个reduce。在一个map和一个reduce的情况下,map/reduce的工作是串行的。
没办法充分利用cpu的多线程特性。虽然map/reduce不能并行,但是在网页抓取的过程中,即fetch阶段是可以使用多线程的。
[-depth i] 选项参数
抓取深度
四、抓取之前要做的一些配置
建立url文件,放置需要爬取的url网址,用于生成crawlDB数据库
以urls/crawl.txt进行配置,修改conf/nutch-site.xml,加入<property>
<name>http.agent.name</name>
<value>test-nutch</value>
</property>信息
配置JAVA_HOME环境变量,一般在/usr/lib/jvm下会装有java的环境。
五、#运行crawl命令,爬取网页
[root@nutch local]#nohup bin/nutch crawl urls -dir data -threads 3 -depth 3 &
六、查找命令匹配的类
打开bin/nutch脚本,查找相关命令。如查找fetch命令所对应的类
[root@nutch local]# vi bin/nutch
按“/fetch”回车,再按“n”查找相匹配的下一条记录。
Nutch入门重点在于分析nutch脚本文件
七、安装配置Solr3.6.2
#下载solr3.6.2
[root@nutch nutch2]# wget http://archive.apache.org/dist/lucene/solr/3.6.2/apache-solr-3.6.2.tgz
Solr可运行在tomcat下,为简化配置,我们使用默认的solr内嵌的服务器jetty。
#进入nutch的conf目录
把nutch/conf的配置文件scheme.xml复制到solr/conf中,告诉solr在建立的索引的时候要建立哪些字段。
在nutch的conf文件中,有两个scheme打头的文件,schema.xml、schema-solr4.xml文件。schema-solr4.xml对应solr4.x的版本,schema.xml对应solr3.6的版本。因为我们用的solr是3.6.2版本,所以把nutch/conf目录下的schema.xml文件复制到solr主目录下的conf目录中。
比较关键的配置
把nutch/conf的配置文件scheme.xml复制到solr/conf中
告诉solr在建立的索引的时候要建立哪些字段。
修改solr默认的配置文件solr/conf/solrconfig.xml
将<str name=”df”>text</str>全部替换为<str name=”df”>content</str>
因为solr配置文件内默认使用的搜索字段是text,而我们nutch中默认搜索字段是content,所以需要对solrconfig.xml文件做搜索字段的替换。
#以后台进程的方式启动solr服务器
[root@nutch local]# java -jar start.jar &
使用nutch的本地模式提交索引
[root@nutch local]# bin/nutch solrindex http://192.168.1.49:8983/solr/ data/crawldb/ -linkdb data/linkdb/ -dir data/segments/
使用lukeall工具查看索引
提交索引后把索引下载到桌面用lukeall打开,可看到索引的字段、文档数目、term的数目,也可以在documents选项内查看每一个特定的文档。
#通过web界面查看solr服务器的情况
http://192.168.1.49:8983/solr/
八、给solr3.6.2配置分词器mmseg4j
配置分词器关键在于,将分词器相应jar包mmseg4j-all-1.8.5-with-dic.jar复制到solr下的lib目录。
将nutch/conf/scheme.xml文件的<tokenizer class="solr.WhitespaceTokenizerFactory"/>和<tokenizer class="solr.StandardTokenizerFactory"/>配置替换为<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode=”complex”/>