江南白衣
nutch是乙個基於lucene,類似google的完整網路搜尋引擎解決方案,基於hadoop的分布式處理模型保證了系統的效能,類似eclipse的外掛程式機制保證了系統的可客戶化,而且很容易整合到自己的應用之中。
nutch 0.8 完全使用hadoop重寫了骨幹**,另外很多地方作了合理化修正,非常值得公升級。
nutch 0.7.2的中文安裝文件滿街都是,nutch 0.8的安裝文件見tutorial (0.8) , 要注意兩點:
一是 crawl命令裡的urls引數從指定檔案變為了指定目錄, 即原來的urls 要改存到urls/foo 裡。
二是 nutch-default.xml裡http.agent.name屬性預設為空,必須在nutch-site.xml中為該屬性設值,否則會出錯。
注意nutch 爬行時的資訊用log4j輸出在/logs 目錄下了,預設不再直接輸出到螢幕,除非你在配置檔案里設fetcher.verbose為true。
luke(http://www.getopt.org/luke) 是乙個必備的索引閱讀工具。
最後,nutch 0.8的recawl 指令碼也不同了。
nutch的文件不多,而且多是安裝文件,要深入nutch,就必須一字不漏的閱讀:
introduction to nutch, part 1 crawling 和 introduction to nutch, part 2 searching
然後就是看原始碼了,好在nutch的原始碼非常均勻,簡短,沒有花哨的技巧,很容易把事情看明白。
首先理解nutch的三個資料目錄:
1.crawdb,linkdb是web link目錄,存放url 及url的互聯關係,作為爬行與重新爬行的依據,頁面預設30天過期。
2.segments是主目錄,存放抓回來的網頁。頁面內容有bytes的raw content 和 parsed text的形式。nutch以廣度優先的原則來爬行,因此每爬完一輪會生成乙個segment目錄。
3.index是lucene的索引目錄,是indexs裡所有index合併後的完整索引,注意索引檔案只對頁面內容進行索引,沒有進行儲存,因此查詢時要去訪問segments目錄才能獲得頁面內容。
爬行過程在introduction to nutch, part 1 crawling 裡已有詳細說明,或許直接看crawl類來理解爬行的過程。
nutch用入口位址,位址正規表示式,搜尋深度三種形式來限制
1.fetcher類, 在run()裡多執行緒執行fetcherthread,並呼叫恰當的protocol外掛程式(支援http,ftp等協議)獲取內容,呼叫恰當的parser將內容分析為文字,然後把內容放到fetcheroutput類裡,最後由fetcheroutputformat類定義寫盤到segments的過程。
2.indexer類,應用hadoop遍歷所有segments 目錄,將parsedata檔案序列化成parsedata類,從中獲得各種資料然後呼叫外掛程式進行索引,最後仍然由ouputformat類完成寫入索引的工作。
注意,如果你僅想使用nutch的爬蟲,而不是其索引功能,可以仿照indexer重寫自己的實現,比如把segments內容直接搬進資料庫。
3.nutch 每條索引記錄的字段
url: 作為唯一標標識值,由basicindexingfilter類產生。
segment:由indexer類產生。nutch抓回來的頁面內容放在segments目錄,lucene只會索引,不會store原文內容,因此在查詢時要以segment與url作為外來鍵,由fetchedsegments類根據hitsdetail從segments目錄獲得content。
boost:優先順序,由indexer類呼叫外掛程式計算產生。
title:顯示標題,在basicindexingfilter外掛程式中被索引和儲存。
content: 主要的被搜尋項,在basicindexingfilter外掛程式中被索引。
nutch提供了乙個fascade的nutchbean類供我們使用,一段典型的**如下
nutchbean bean=new
nutchbean();
query query
=query.parse(args[
0]);
hits hits
=bean.search(query, num_hits,
"title",
true
);for
(inti =
0; i
<
hits.getlength(); i
++)
這裡nutchbean為我們做了幾樣事情:一是按title field來排序
二是支援分布式查詢,如果有配置servers,就會使用hadoop的ipc系統,呼叫所有server上的nutchbeans,最後規約出總的結果。
三是每個站點只顯示分數最高的一頁,如果使用者還想看同站的其他結果,就需要訪問morehit***culde。
四是生成summary,讀取segments目錄,按segments和url 獲得content, 並按一定演算法抽取出包含關鍵字的文件片斷。
nutch的原始碼很容易修改和重新編譯,注意新編譯的class要壓回nutch-0.8.job(實際是乙個jar)才能生效。
nutch的外掛程式機制及度類似eclipse, 詳看http://wiki.apache.org/nutch/writingpluginexample,只要實現某個外掛程式介面,然後在plugins.xml裡定義class,擴充套件點和依賴的jar,如="
index-basic
"version="
1.0.0
"provider-name="
nutch.org
">="
index-basic.jar
">="
*"/>="
nutch-extensionpoints
"/>="
org.apache.nutch.indexer.basic
"name="
nutch basic indexing filter
"point="
org.apache.nutch.indexer.indexingfilter
">="
basicindexingfilter
"class="
org.apache.nutch.indexer.basic.basicindexingfilter
"/>
大資料day08筆記
day01 大資料及linux安裝 現在的社會發展相當迅速,科技發達,資訊流通,使得人們之間的交流越來越密切,生活也越來越方便,在智慧型手機 智慧型穿戴裝置基本普及的高科技時代的背景下,大資料應運而生。未來的時代將不再是it時代,而是dt data technology 時代。各個行業和領域都已經被...
python基礎語法 day08(筆記)
乙個程式模組太多,需要建立乙個資料夾來管理這些模組,就有了包的概念。什麼是包?可以將多個具有相似或者有關聯的多個模組放在乙個資料夾中,便於統一管理。這個資料夾我們就可以稱之為包 我的test2模組 test1.py y 我的test1模組 test.py from test2 import x im...
動手學深度學習 Task08筆記彙總
終於來到了我感興趣的東西,如何教會機器進 感分析。目標是通過給定的不定長文字序列輸出情緒類別,運用了預訓練的詞向量和多隱藏層的雙向rnn和cnn,是詞嵌入的下游應用。隨機改變樣本從而降低模型對屬性的依賴性,並且也可以擴大資料集規模。例如 翻轉 裁剪 變化顏色 亮度 對比度 跑合度 色調 以及以上各種...