本方案中,Solr作为处理搜索结果的源和入口,有效的减轻对Nutch的搜索负担,让Nutch负责她最擅长的工作:抓取(crawling)和提取(extracting)内容。使用Solr作为搜索后端,换句话说,就是允许使用所有Solr Server的高级特性,诸如:查询拼写检查(spell-check),搜索提醒(suggestion),数据复制(data-replication),查询缓存等等。
 
Nutch和Solr的安装
 
首先下载我们需要的软件,ApacheSolr Nutch
1、从官方下载Solr Version1.3.0
2、解压Solr安装包。
3、下载Nutch Version 1.0
4、解压Nutch安装包。
 
5、配置Solr
 
简单起见,我们以SolrExample中的配置为基础
a、从apache-nutch-1.0/conf拷贝NutchSchema到apache-solr-1.3.0/example/solr/conf目录下,覆盖掉已经存在的。
我们希望允许Solr为搜索结果创建摘要,因此我们需要存储内容以便能够索引它。
b、调整schema.xml,以便"content"字段的"stored"属性等于true。
<fieldname="content" type="text" stored="true"indexed="true"/>
另外,我们希望能够容易的调整查询的关联度,因此这里创建一个新的请求处理器(requesthandler)叫dismax。
c、打开apache-solr-1.3.0/example/solr/conf/solrconfig.xml文件,把下面这段粘贴进去
 
<requestHandlername="/nutch" class="solr.SearchHandler" >
<lstname="defaults">
<strname="defType">dismax</str>
<strname="echoParams">explicit</str>
<floatname="tie">0.01</float>
<strname="qf">
content^0.5 anchor^1.0title^1.2
</str>
<strname="pf">
content^0.5 anchor^1.5title^1.2 site^1.5
</str>
<strname="fl">
url
</str>
<strname="mm">
2&lt;-1 5&lt;-26&lt;90%
</str>
<intname="ps">100</int>
<boolhl="true"/>
<strname="q.alt">*:*</str>
<strname="hl.fl">title url content</str>
<strname="f.title.hl.fragsize">0</str>
<strname="f.title.hl.alternateField">title</str>
<strname="f.url.hl.fragsize">0</str>
<strname="f.url.hl.alternateField">url</str>
<strname="f.content.hl.fragmenter">regex</str>
</lst>
</requestHandler>
 
6、启动Solr
 
cdapache-solr-1.3.0/example
java -jar start.jar
 
7、配置Nutch
a、打开apache-nutch-1.0/conf下的nutch-site.xml,用下面的内容(我们制定了蜘蛛的名称,激活插件,限制单机一次运行抓取的最大URL数为100)替换:
 
<?xmlversion="1.0"?>
<configuration>
<property>
<name>http.agent.name</name>
<value>nutch-solr-integration</value>
</property>
<property>
<name>generate.max.per.host</name>
<value>100</value>
</property>
<property>
<name>plugin.includes</name>
<value>protocol-http|urlfilter-regex|parse-html|index-(basic|anchor)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)</value>
</property>
</configuration>
 
b、打开apache-nutch-1.0/conf下的regex-urlfilter.txt,用下面的内容替换:
 
-^(https|telnet|file|ftp|mailto):
 
# skip some suffixes
-/.(swf|SWF|doc|DOC|mp3|MP3|WMV|wmv|txt|TXT|rtf|RTF|avi|AVI|m3u|M3U|flv|FLV|WAV|wav|mp4|MP4|avi|AVI|rss|RSS|xml|XML|pdf|PDF|js|JS|gif|GIF|jpg|JPG|png|PNG|ico|ICO|css|sit|eps|wmf|zip|ppt|mpg|xls|gz|rpm|tgz|mov|MOV|exe|jpeg|JPEG|bmp|BMP)$
 
# skip URLs containingcertain characters as probable queries, etc.
-[?*!@=]
 
# allow urls infoofactory.fi domain
+^http://([a-z0-9/-A-Z]*/.)*lucidimagination.com/
 
# deny anything else
-.
 
8、创建一个种子列表(初始化的URL列表)
 
mkdir urls
echo "http://www.haoguoliang.com/" >urls/seed.txt
 
9、将种子URL列表导入Nutch的crawldb(注意在nutch文件夹下执行)
 
bin/nutch injectcrawl/crawldb urls
 
10、生成获取(fetch)列表,以便获取和分析内容
 
bin/nutch generatecrawl/crawldb crawl/segments
 
以上命令在crawl/segments目录下生成了一个新的segment目录,里边存储了抓到的URLs,下边的指令里,我们需要最新的segment目录作为参数,存储到环境变量SEGMENT里:
 
exportSEGMENT=crawl/segments/`ls -tr crawl/segments|tail -1`
 
现在,启动抓取程序真正开始抓取内容
 
bin/nutch fetch$SEGMENT -noParsing
 
接下来我们分析、解析抓取下来的内容
 
bin/nutch parse$SEGMENT
 
更 新Nutchcrawldb,updatedb命令会存储以上两步抓取(fetch)和分析(parse)最新的segment而得到的新的URLs到Nutchcrawldb,以便后续的继续抓取,除了URLs之外,Nutch也存储了相应的页面内容,防止相同的URLs被反反复复的抓取。
 
bin/nutch updatedbcrawl/crawldb $SEGMENT -filter -normalize
 
到此,一个完整的抓取周期结束了,你可以重复步骤10多次以便可以抓取更多的内容。
 
11、创建超链库
 
bin/nutch invertlinkscrawl/linkdb -dir crawl/segments
 
12、索引所有segments中的内容到Solr中
 
bin/nutch solrindex http://127.0.0.1:8983/solr/crawl/crawldb crawl/linkdb crawl/segments/*
 
现在,所有Nutch抓取的内容已经被Solr索引了,你可以通过SolrAdmin执行查询操作了