by Tom White
Nutch 是一個(gè)開(kāi)源Java 實(shí)現的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具??梢詾槭裁次覀冃枰⒆约旱乃阉饕婺??畢竟我們已經(jīng)有g(shù)oogle可以使用。這里我列出3點(diǎn)原因:
Nutch 的安裝分為3個(gè)層次:基于本地文件系統,基于局域網(wǎng),或者基于 internet 。不同的安裝方式具有不同的特色。比如:索引一個(gè)本地文件系統相對于其他兩個(gè)來(lái)說(shuō)肯定是要穩定多了,因為沒(méi)有 網(wǎng)絡(luò )錯誤也不同緩存文件的拷貝?;贗nternet 的搜索又是另一個(gè)極端:抓取數以千計的網(wǎng)頁(yè)有很多技術(shù)問(wèn)題需要解決:我們從哪些頁(yè)面開(kāi)始抓???我們如何分配抓取工作?何時(shí)需要重新抓???我們如何解決失效的鏈接,沒(méi)有響應的站點(diǎn)和重復的內容?還有如何解決對大型數據的上百個(gè)并發(fā)訪(fǎng)問(wèn)?搭建這樣一個(gè)搜索引擎是一筆不小的投資呀!在 " Building Nutch: Open Source Search," 的作者 Mike Cafarella 和 Doug Cutting 總結如下::
... 一個(gè)具有完全功能的搜索系統:1億頁(yè)面索引量,每秒2個(gè)并發(fā)索引,需要每月800美元。10億頁(yè)面索引量,每秒50個(gè)頁(yè)面請求,大概需要每月30000美元。
這篇文章將為你演示如何在中等級別的網(wǎng)站上搭建Nutch。第一部分集中在抓取上。Nutch的抓取架構,如何運行一個(gè)抓取程序,理解這個(gè)抓取過(guò)程產(chǎn)生了什么。第二部分關(guān)注搜索。演示如何運行Nutch搜索程序。以及如何訂制Nutch 。
Nutch Vs. Lucene
Nutch 是基于 Lucene的。Lucene為 Nutch 提供了文本索引和搜索的API。一個(gè)常見(jiàn)的問(wèn)題是;我應該使用Lucene還是Nutch?最簡(jiǎn)單的回答是:如果你不需要抓取數據的話(huà),應該使用Lucene。常見(jiàn)的應用場(chǎng)合是:你有數據源,需要為這些數據提供一個(gè)搜索頁(yè)面。在這種情況下,最好的方式是直接從數據庫中取出數據并用Lucene API建立索引。中文用戶(hù),可以參考 WebLucene 或者 車(chē)東 的一些列文章。如果需要中文分詞幫助還可以聯(lián)系作者。 http://domolo.oicp.net/bbs/list.asp?boardid=24 Erik Hatcher 和 Otis Gospodneti?‘s 的 Lucene in Action 中詳細講述了這個(gè)過(guò)程。Nutch 適用于你無(wú)法直接獲取數據庫中的網(wǎng)站,或者比較分散的數據源的情況下使用。
架構
總體上Nutch可以分為2個(gè)部分:抓取部分和搜索部分。抓取程序抓取頁(yè)面并把抓取回來(lái)的數據做成反向索引,搜索程序則對反向索引搜索回答用戶(hù)的請求。抓取程序和搜索程序的接口是索引。兩者都使用索引中的字段。()
實(shí)際上搜索程序和抓取程序可以分別位于不同的機器上。()
這里我們先看看Nutch的抓取部分。
抓取程序:
抓取程序是被Nutch的抓取工具驅動(dòng)的。這是一組工具,用來(lái)建立和維護幾個(gè)不同的數據結構: web database, a set of segments, and the index。下面我們逐個(gè)解釋上面提到的3個(gè)不同的數據結構。
The web database, 或者WebDB, 是一個(gè)特殊存儲數據結構,用來(lái)映像被抓取網(wǎng)站數據的結構和屬性的集合。WebDB 用來(lái)存儲從抓取開(kāi)始(包括重新抓?。┑乃芯W(wǎng)站結構數據和屬性。WebDB 只是被 抓取程序使用,搜索程序并不使用它。WebDB 存儲2種實(shí)體:頁(yè)面 和 鏈接。頁(yè)面 表示 網(wǎng)絡(luò )上的一個(gè)網(wǎng)頁(yè),這個(gè)網(wǎng)頁(yè)的Url作為標示被索引,同時(shí)建立一個(gè)對網(wǎng)頁(yè)內容的MD5 哈希簽名。跟網(wǎng)頁(yè)相關(guān)的其它內容也被存儲,包括:頁(yè)面中的鏈接數量(外鏈接),頁(yè)面抓取信息(在頁(yè)面被重復抓取的情況下),還有表示頁(yè)面級別的分數 score 。鏈接 表示從一個(gè)網(wǎng)頁(yè)的鏈接到其它網(wǎng)頁(yè)的鏈接。因此 WebDB 可以說(shuō)是一個(gè)網(wǎng)絡(luò )圖,節點(diǎn)是頁(yè)面,鏈接是邊。
Segment 是 網(wǎng)頁(yè) 的集合,并且它被索引。 Segment 的 Fetchlist 是抓取程序使用的 url 列表 , 它是從 WebDB中生成的。Fetcher 的輸出數據是從 fetchlist 中抓取的網(wǎng)頁(yè)。Fetcher 的輸出數據先被反向索引,然后索引后的結果被存儲在segment 中。 Segment 的生命周期是有限制的,當下一輪抓取開(kāi)始后它就沒(méi)有用了。默認的 重新抓取間隔是30天。因此刪除超過(guò)這個(gè)時(shí)間期限的segment是可以的。而且也可以節省不少磁盤(pán)空間。Segment 的命名是 日期加時(shí)間 ,因此很直觀(guān)的可以看出他們的存活周期。
索引庫 是 反向索引所有系統中被抓取的頁(yè)面,他并不直接從頁(yè)面反向索引產(chǎn)生,它是合并很多小的 segment 的索引中產(chǎn)生的。Nutch 使用 Lucene 來(lái)建立索引,因此所有 Lucene 相關(guān)的工具 API 都用來(lái)建立索引庫。需要說(shuō)明的是 Lucene 的 segment 的概念 和 Nutch 的 segment 概念是完全不同的,不要混淆哦。 可以參考 車(chē)東 的相關(guān)文章。 www.chedong.com 簡(jiǎn)單來(lái)說(shuō) Lucene 的 segment 是 Lucene 索引庫的一部分,而 Nutch 的 Segment 是 WebDB 中 被 抓取和索引的一部分。
下面的部分翻譯中。。。
原文地址:http://today.java.net/pub/a/today/2006/01/10/introduction-to-nutch-1.html
聯(lián)系客服