集成Nutch和Solr

兩年前集成NutchSolr 這兩個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),查詢緩存等等。

solr-nutch-setup.png 爲什麼使用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&lt;-1 5&lt;-2 6&lt;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&amp;version=2.2&amp;start=0&amp;rows=10&amp;indent=on&amp;wt=json

 

 

發送引用通告網址: http://www.haoguoliang.com/cgi-bin/mt/mt-tb.cgi/22

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章