2013-07-21 63 views
8

這不是第一次在Stackoverflow發佈asked - 但它已經過了將近五年之後 - 時代和技術也發生了一些變化。我想知道現在人們在想什麼建立一個搜索引擎?如何構建搜索引擎? (2013更新)

例如,我知道Nutch正在繼續開發 - 但它仍然是最強大的解決方案嗎?是否有其他成熟的解決方案可用於其他語言 - 例如C#,PHP,VB.NET?

我也知道現在有一個公開可用的質量指標可以使用,減少了從Common Crawl執行自己的蜘蛛的需要。

當然,還有一些定製的搜索引擎解決方案,其中最知名的是Google's CSE ......但我不知道任何其他主要/穩定/有信譽的,我相信建立一個引擎?

現在有哪些資源可用於學習幾年前甚至去年沒有的編程搜索引擎?

回答

1

我會在從頭開始編寫一個小的搜索引擎使用此問題,分享一些經驗(沒有搜索特定的庫被用於)一個相當小的數據集(它實際上搜索stackoverflow,因爲它既不是太小也不能太大以至於不能在單個服務器上工作)。 Check it out。以下是我關於這個問題的發現。

履帶

首先,爬蟲是一個艱難的事情。真正的問題是在獲取網頁時儘可能快地將數據寫入磁盤。主要的數據結構是一個倒排索引,所以當你得到單詞「香蕉」時,你需要從磁盤中取出「香蕉」索引(它發生的文檔列表 - 連同文檔中的位置),並附加新記錄並寫回來。隨着列表的增長,拉回寫入速度變慢。所以一個技巧是將倒排索引(和文檔)分割成分區,在第一個分區中說1-1000個文檔,等等。另一個「技巧」是在抓取分區時將索引保存在內存中,並且只有在分區完成時纔將其刷新到磁盤。

重要的一點:用什麼來存儲數據?有很多選擇,經過多次實驗,我發現leveldb是今天的最佳選擇。不要忘記SSD磁盤!

因此,總而言之,使用一臺機器(4 Gb ram)以這種方式爬取大部分計算器(大約13 000 000頁)需要大約2個月的時間。結果數據(倒排索引,原始剝離文本等) - 大約80 GB的磁盤空間。

搜索

我們的目標是做快和高品質。要意識到的一件事是,如果您希望速度更快,則無法搜索整個數據集。幸運的是,我已經對所有內容進行了分區,因此搜索需要關鍵字出現的前100個分區(單獨的索引),並且如果它找到「足夠好」的結果 - 停止,如果不是 - 則需要100個分區,等等。

最慢的部分是從磁盤讀取索引並對其進行反序列化。Leveldb支持快速順序讀取,因此數據需要以大部分順序讀取的方式進行存儲。一旦進入內存集合交集非常快。

現在的質量。這是最艱難的,永遠不夠好。我最初的嘗試是不僅保留文本的倒排索引,還保留標題,鏈接文本和網址。這些文件中的每一次打擊都增加了一些要點。另一件事是用同義詞改寫查詢,並以某種方式檢查哪個查詢效果最好。這可能值得在它自己的職位。

無論如何,我希望它會有用的閱讀!