首页 > 搜索引擎开发学习 > 基于Nutch的站内搜索引擎搭建

基于Nutch的站内搜索引擎搭建

2012年8月8日 发表评论 阅读评论
文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathinking.com)   转载请注明,谢谢合作。

---

以前配置过一次Nutch,后来干脆忘干净了,最近又折腾一次,记录下来,方便以后查阅。现在Nutch的版本已经出到1.51了(截止到7月份),新版资料少,入门还是找经典的版本混个眼熟先,本文采用0.9版,在Windows下搭建一个简单的站内搜索引擎,内容如下:

===所需装备===

===基本部件安装(从简述)===

===Nutch的安装与配置===

===Nutch部署到Eclipse===

===爬取网页:Nutch和Eclipse进行站内抓取===

===实现站内搜索:Nutch部署到Tomcat===

===参考资料===

===========================================

===所需装备

JDK1.6 不多说,大多数人都装有

Eclipse 不多说

Tomcat 开源web应用服务器,下载地址:http://tomcat.apache.org/

Nutch 0.9 下载地址:http://nutch.apache.org/  我安装时,官方没找到这个版本,这里提供一个快盘下载链接:Nutch-0.9

Cygwin 用来模拟运行UNIX类环境的,因Nutch是在Linux下开发的,故Windows环境下需要用Cygwin协助。下载地址:http://www.cygwin.com/ (本文没有在Cygwin环境下,大部分命令是通过Eclipse完成)

============================================

===基本部件安装(从简述)

安装Eclipse,解压缩包即可

安装JDK,注意设置环境变量:JAVA_HOME ,CLASSPATH,PATH

安装Tomcat 7,解压缩包,设置环境变量TOMCAT_HOME为tomcat根目录;设置环境变量CATALINA_HOME为tomcat根目录;打开tomcat的bin文件,运行startup.bat,启动tomcat,此时tomcat将监听8080端口,浏览器测试:http://localhost:8080。如果出现startup.bat一闪而过,可cmd测试startup.bat或tomcat7命令,依据提示解决,不多说。

安装Cygwin,这个一路装下去就行了

===========================================

===Nutch的安装与配置

解压缩包,鉴于Nutch是Java开发,运行Nutch必须告诉它JDK在哪里,设置环境变量NUTCH_HOME为JDK根目录路径,设置好以后,通过Cygwin测试,方法如下:

1)   打开Cygwin

2)  进入nutch-0.9解压包所在路径,这个命令跟命令行差不多,试探着就能进去,注意保证没有中文字符(Cygwin不支持Unicode字符),进入后,测试命令bin/nutch,看是否出现nutch所支持的一系列命令,如下是进入我所解压nutch的路径截图

此时的Nutch已经可以运行了,为了进一步进行Nutch的开发,我们将其部署到Eclipse环境下。在这之前,我们可以对nutch有个感官上的体验,将其部署到tomcat上,将nutch中自带的nutch-0.9.war文件复制到tomcat目录中的webapps文件夹下,运行tomcat,浏览器输入:http://localhost:8080/nutch-0.9,让tomcat对nutch进行解压,此时会看到如下图的nutch界面,同时在tomcat中的webapps目录中也可以看到解压的nutch-0.9文件夹了。

===========================================

===Nutch部署到Eclipse

1)   导入Eclipse。打开Eclipse,创建Java Project,工程名Search Engine,选择Create project from existing source,选择你所解压的nutch所在的位置,然后选择next,如图所示,此时Eclipse已经自动将.java作为源文件,.jar添加到Libraries中了

2)  添加配置文件,方便后续配置。将默认输出文件路径改为my_build,如图左所示;为了方便对nutch进行配置,选择选项卡Libraries,选择add class folder,将nutch的配置文件加入工程Libraries中,并通过第四个选项卡将该配置文件conf置顶,这样方便后续的更改配置,如图右

 

3)  添加缺少的jar包。此时该工程会自动提示有错误,编译是不会通过的,经查,是缺少两个包,分别是rtf-parser.jar(可以看到对应的nutch-0.9\src\plugin\parse-rtf\lib文件夹下为空)和jid3lib-0.5.1.jar(可以看到对应的E:\My Search Engine\nutch-0.9\src\plugin\parse-mp3\lib文件夹下为空),这里提供这两个jar包的下载链接:rtf-parser.jarjid3lib-0.5.1.jar,下载后加入到上面提到的相应文件lib下,刷新Eclipse工程(不然找不到刚添加的文件),将刚刚这两个jar文件添加到工程中:右键选择buildpath,然后configure buildpath,选择java buildpath,第三个选项卡Libraries,选择add jars,找到刚才的上述lib路径下的jar添加到工程,此时错误就消失了。

到这一步,算是将nutch项目导入到了Eclipse,下面就是进行简易配置运行或开发了。

===========================================

===爬取网页:使用NutchEclipse进行站内抓取

1)   修改nutch配置文件default

Nutch的配置文件都在conf文件夹下,我们刚刚将其加入到了Libraries中,并置顶了,所以在工程中打开Referenced Libraries在最上方第一个就可以看到conf文件夹,如图所示。

打开conf下的nutch-default.xml文件,找到属性plugin.folders,这个属性告诉nutch在哪里寻找插件程序,将其value值修改为“./src/plugin”(注:“./”为当前目录,“../”上一层目录,“/”为根目录)。

2)  配置nutch爬虫爬取策略

首先建立抓取入口,在工程文件夹根目录下新建一个文本文件weburl.txt,里面作为爬虫的入口url,这里我们设置本站的地址:http://www.ahathinking.com.

然后进行站内抓取配置,找到crawl_urlfilter.txt,这里设置nutch抓取的url限制策略,修改属性如下:

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

此配置告诉nutch只抓取http://www.ahathinking.com/下的网页,注释中的原配置抓取策略是抓取my.domain.name站内的一个配置,由于本博还没有子域名设置,故这样改了就。

最后要配置的是nutch-site.xml文件,这里的目的是nutch的源代码中遵守了robots协议,所以必须进行配置,以便nutch在获取response时,将自己的相关信息提交给被爬取的网站,格式如下图所示,这个熟悉http协议的都知道,在发送请求时是需要HTTP‘User-Agent’在头部信息的,这里就是告诉网站爬取者身份。这里可以通用基本,我附上自己的文件下载链接:nutch-site-myxmlfile,下载后将其内容复制到nutch-site.xml中就行了。

<property>
<name>http.agent.name</name>
<value>ahathinkingSpider</value>
<description>HTTP 'User-Agent' request header. My Search Engine</description>
</property>

<property>
<name>http.agent.description</name>
<value>My web</value>
<description>Further description of our bot- this text is used in
User-Agent header. It appears in parenthesis after the agent name.</description>
</property>

这里给出了agent.name和agent.description,在上面的文件中还有agent.url和agent.email的配置,其实都是一样的。

3)  配置Eclipse运行时相应参数,即传入nutch软件的一些命令。

首先窗口选择Run,Run Configuration,Main选项卡中,选择工程SearchEngine,Main Class选择nutch类Crawl,如下图所示,注意不要着急点击Run,点击Apply即可,还要配置其他参数。

然后选择选项卡Arguments配置运行参数,并配置JavaVM参数,如下图所示,其第一行参数含义:nutch爬虫网页入口地址在weburl.txt中,nutch抓取的网页,索引信息存在本地Local文件夹中,爬虫的抓取深度为5,每层只抓取前100个网页,开启5个线程;第二行参数是配置nutch抓取过程log日志记录的地址,后面是配置Java虚拟机分配内存大小为1G,防止JavaVMware溢出。配置好以后点击Apply,然后点击Run,此时Nutch就开始运行了。

Nutch运行结果按照本博配置,如下所示(一部分)

crawl started in: Local
rootUrlDir = weburl.txt
threads = 5
depth = 5
topN = 100
Injector: starting
Injector: crawlDb: Local/crawldb
Injector: urlDir: weburl.txt
Injector: Converting injected urls to crawl db entries.
Injector: Merging injected urls into crawl db.
Injector: done
Generator: Selecting best-scoring urls due for fetch.
Generator: starting
... ...
Generator: done.
Fetcher: starting
Fetcher: segment: Local segments/20120807122004
Fetcher: threads: 5
fetching http://www.ahathinking.com/
Fetcher: done
CrawlDb update: starting
... ...
Generator: done.
Fetcher: starting
Fetcher: segment: Local segments/20120807122023
Fetcher: threads: 5
fetching http://www.ahathinking.com/wp-content/themes/inove/js/base.js
fetching http://www.ahathinking.com/feed
fetching http://www.ahathinking.com/archives/133.html
... ...
Optimizing index.
merging segments _ram_5k (1 docs) _ram_5l (1 docs) _ram_5m (1 docs) _ram_5n (1 docs)
... ...
merging segments _0 (50 docs) _1 (50 docs) _2 (50 docs) _3 (50 docs) _4 (45 docs) into
... ...
Indexer: done
Dedup: starting
Dedup: adding indexes in: Local/indexes
Dedup: done
merging indexes to: Local/index
Adding Local/indexes/part-00000
done merging
crawl finished: Local

运行结束之后,此时,Nutch已经完成了爬取、索引的过程。在本地Local文件夹下会生成5个文件夹:crawldb、index、indexes、linkdb、segments

其中,linkdb是存放URL的互联关系的,是所有页面下载完成后所分析的来;indexes为每次下载的索引目录;index为Lucene格式的索引目录,为indexes中的索引合并后的完整索引,这一点从控制台的最后输出也可以看出来;segments存放抓取的页面信息,抓取多少层数的页面,就会有几个子文件夹,本文抓取层数为5,所以该文件下有5个子文件,每个子文件中又有一些子目录:其中,context为下载的页面内容;crawl_fetch为下载URL的状态;crawl_generate为待下载的URL集合信息;crawl_parse为外部链接库;parse_data为下载URL解析的外部链接及其他数据;parse_text为URL解析的文本内容

到此,使用Nutch的爬取也进行完了,同时Nutch也对爬取内容建好了索引,下面就将爬取的内容部署到Tomcat上吧。

===========================================

===实现站内搜索:Nutch部署到Tomcat

上一步执行完之后,在nutch根目录会发现,nutch-0.9.war文件已经变成十几兆了,部署跟本文之前的Nutch初体验一样,将该文件复制到tomcat的webapps目录下,启动tomcat,解压,输入网址:http://localhost:8080/nutch-0.9即可

1)配置索引文件。不过,此时还不可以进行搜索,因为Nutch不知道索引文件在哪里,打开apache-tomcat-7.0.29\webapps\nutch-0.9\WEB-INF\classes目录下的nutch-site.xml文件,修改其中的属性,添加:

<property>
<name>searcher.dir</name>
<value>E:\My Search Engine\nutch-0.9\Local</value>
</property>

Value值是我们eclipse工程项目SearchEngine下的Local文件夹,上面已经介绍过,nutch最终整理的索引文件就放在Local中,这就告诉了nutch去这里面找Nutch索引文件。

2)改出厂bug。此时搜索,发现出错误,如下,这是Nutch-0.9的一个出厂bug,需我们改正

/search.jsp (line: 151, column: 22) Attribute value language + "/include/header.html" is quoted with " which must be escaped when used within the value

找到apache-tomcat-7.0.29\webapps\nutch-0.9\下的search.jsp的151行,转义字符的错误,修改如下:


<jsp:include page="<%= language + \"/include/header.html\"%>"/>

此时,可以搜索了,不过还不支持中文

4)  Tomcat添加中文字符支持。因为tomcat默认不支持中文字符集(悲催),所以还需要添加中文字符支持,这个没有多么复杂,找到tomcat根目录下的conf,即apache-tomcat-7.0.29\conf中,找到server.xml,修改其中的Connector port属性即可,如下:

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

最后这两句是为Tomcat添加对中文字符的支持。

如此,便完成了所有的配置,可以搜索了,好折腾啊。。。不过,这只是利用Nutch框架本身经过“基本”的配置后实现的功能,为了真正做一个站内搜索,还需要进行后续的配置和开发,例如中文分词等等。不过这些我们以后再弄吧,先来享受下搜索的喜悦。

如图,搜索基数排序的部分结果:

搜索动态规划的部分结果:

Nutch的插件机制使其具有很大的扩展性和灵活性,了解Nutch原理、工作流程、以及Nutch分析方法和工具可参见北邮李阳的《Nutch入门教程》(参考资料),该资料相当全面。

(本文完)

参考资料:

北京邮电大学,李阳:Nutch入门教程

Nutch Wiki:http://wiki.apache.org/nutch/

WinXP+cygwin+eclipse配置nutch-1.2,添加IKAnalyzer中文分词

Nutch Wiki old: http://wiki.apache.org/nutch/RunNutchInEclipse1.0

Windows环境下nutch0.9的配置

windows上搭建自己的搜索引擎nutch

Nutch开发攻略

  • kelvin

    你好!请教一些问题:
    请问一下
    1。你是如何把nutch抓取到的二进制内容,在项目中读取的。
    2。nutch抓取时候,发现有很多url没有被成功抓取过来,请问你做的时候,有什么 办法是提高成功率。
    3。对抓取过来内容你们是如何进行关键词搜索

    希望群主可以帮忙解答一下。万分感激!
    email:83132614@qq.com

    • Yx.Ac

      @kelvin 抱歉,我这里只是傻瓜式的搭建,并没有用到如此细致,,建议看看社区或其他地方是否有类似的问题解决方案