兩年前集成Nutch
和Solr
這兩個Apache
Lucene
項目組下的子項目實在是件困難的事情,需要打很多補丁(patches),爲他們的聯姻搜尋各種必需的組件(required components)。今非昔比,時下,在Solr4.0
也即將浮出水面的時候,兩者的結合變的相對容易。
今年早些時候發佈的Nutch
1.0包含了"開盒即用"的原裝的(out of the box)Solr集成。雖然有各種不同的方法來利用這個新特性,這裏僅介紹其中的一種方案。本方案中,Solr
作爲處理搜索結果的源和入口,有效的減輕對Nutch
的搜索負擔,讓Nutch
負責她最擅長的工作:抓取(crawling)和提取(extracting)內容。使用Solr
作爲搜索後端,換句話說,就是允許使用所有Solr
Server的高級特性,諸如:查詢拼寫檢查(spell-check),搜索提醒(suggestion),數據複製(data-replication),查詢緩存等等。
爲什麼使用Nutch
而不是其他的簡單抓取程序?
實現本文說的類似功能的替代方法也可能是使用簡單的類似於Apache Droids
抓取框架,但是Nutch
提供了我們很多很好的優勢。其中,顯而易見的一點是Nutch
提供了可以讓你完整的實現搜索應用的特性集,其次是Nutch
的高可伸縮性(scalablity)和健壯性(robust),Nutch
運行在Hadoop
上,你可以運行在單態機器上,也可以運行在一個100臺機器構成的集羣(cluster)上,另外,Nutch
有很高的抓取質量,你可以配置哪些頁面更重要,優先抓取,擁有豐富的APIs可以讓你容易的集成Nutch
到你的應用中(可擴展性),更重要的一點是,Nutch
的內建組件,超鏈數據庫(LinkDatabase),擁有該組件,可以大幅的提高搜索結果的關聯度,Nutch
在被抓取的頁面之間跟蹤超鏈接,以便依靠內部鏈接來判斷頁面和頁面之間的相關度。
Nutch和Solr的安裝
首先下載我們需要的軟件,Apache Solr 和 Nutch。
1、從官方
下載Solr Version 1.3.0或者從這裏
下載LucidWorks for Solr。
2、解壓Solr安裝包。
3、下載Nutch Version 1.0
(也可以下載nightly版本
)。
4、解壓Nutch安裝包。
tar zxvf apache-nutch-1.0.tar.gz
5、配置Solr
簡單起見,我們以Solr Example中的配置爲基礎
a、從apache-nutch-1.0/conf拷貝Nutch Schema到apache-solr-1.3.0/example/solr/conf目錄下,覆蓋掉已經存在的。
我們希望允許Solr爲搜索結果創建摘要,因此我們需要存儲內容以便能夠索引它。
b、調整schema.xml,以便"content"字段的"stored"屬性等於true。
<field name="content" type="text" stored="true" indexed="true"/>
另外,我們希望能夠容易的調整查詢的關聯度,因此這裏創建一個新的請求處理器(request handler)交dismax
c、打開apache-solr-1.3.0/example/solr/conf/solrconfig.xml文件,把下面這段粘貼進去
<requestHandler name="/nutch" class="solr.SearchHandler" >
<lst name="defaults">
<str name="defType">dismax</str>
<str name="echoParams">explicit</str>
<float name="tie">0.01</float>
<str name="qf">
content^0.5 anchor^1.0 title^1.2
</str>
<str name="pf">
content^0.5 anchor^1.5 title^1.2 site^1.5
</str>
<str name="fl">
url
</str>
<str name="mm">
2<-1 5<-2 6<90%
</str>
<int name="ps">100</int>
<bool hl="true"/>
<str name="q.alt">*:*</str>
<str name="hl.fl">title url content</str>
<str name="f.title.hl.fragsize">0</str>
<str name="f.title.hl.alternateField">title</str>
<str name="f.url.hl.fragsize">0</str>
<str name="f.url.hl.alternateField">url</str>
<str name="f.content.hl.fragmenter">regex</str>
</lst>
</requestHandler>
6、啓動Solr
cd apache-solr-1.3.0/example
java -jar start.jar
7、配置Nutch
a、打開apache-nutch-1.0/conf下的nutch-site.xml,用下面的內容(我們制定了蜘蛛的名稱,激活插件,限制單機一次運行抓取的最大URL數爲100)替換:
<?xml version="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 containing certain characters as probable queries, etc.
-[?*!@=]
# allow urls in foofactory.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 inject crawl/crawldb urls
10、生成獲取(fetch)列表,以便獲取和分析內容
bin/nutch generate crawl/crawldb crawl/segments
以上命令在crawl/segments目錄下生成了一個新的segment目錄,裏邊存儲了抓到的URLs,下邊的指令裏,我們需要最新的segment目錄作爲參數,存儲到環境變量SEGMENT裏:
export SEGMENT=crawl/segments/`ls -tr crawl/segments|tail -1`
現在,啓動抓取程序真正開始抓取內容
bin/nutch fetch $SEGMENT -noParsing
接下來我們分析、解析抓取下來的內容
bin/nutch parse $SEGMENT
更
新Nutch
crawldb,updatedb命令會存儲以上兩步抓取(fetch)和分析(parse)最新的segment而得到的新的URLs到Nutch
crawldb,以便後續的繼續抓取,除了URLs之外,Nutch也存儲了相應的頁面內容,防止相同的URLs被反反覆覆的抓取。
bin/nutch updatedb crawl/crawldb $SEGMENT -filter -normalize
到此,一個完整的抓取週期結束了,你可以重複步驟10多次以便可以抓取更多的內容。
11、創建超鏈庫
bin/nutch invertlinks crawl/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索引了,你可以通過Solr Admin執行查詢操作了
http://127.0.0.1:8983/solr/admin 或者直接通過
http://127.0.0.1:8983/solr/nutch/?q=solr&version=2.2&start=0&rows=10&indent=on&wt=json
發送引用通告網址: http://www.haoguoliang.com/cgi-bin/mt/mt-tb.cgi/22