我會在從頭開始編寫一個小的搜索引擎使用此問題,分享一些經驗(沒有搜索特定的庫被用於)一個相當小的數據集(它實際上搜索stackoverflow,因爲它既不是太小也不能太大以至於不能在單個服務器上工作)。 Check it out。以下是我關於這個問題的發現。
履帶
首先,爬蟲是一個艱難的事情。真正的問題是在獲取網頁時儘可能快地將數據寫入磁盤。主要的數據結構是一個倒排索引,所以當你得到單詞「香蕉」時,你需要從磁盤中取出「香蕉」索引(它發生的文檔列表 - 連同文檔中的位置),並附加新記錄並寫回來。隨着列表的增長,拉回寫入速度變慢。所以一個技巧是將倒排索引(和文檔)分割成分區,在第一個分區中說1-1000個文檔,等等。另一個「技巧」是在抓取分區時將索引保存在內存中,並且只有在分區完成時纔將其刷新到磁盤。
重要的一點:用什麼來存儲數據?有很多選擇,經過多次實驗,我發現leveldb是今天的最佳選擇。不要忘記SSD磁盤!
因此,總而言之,使用一臺機器(4 Gb ram)以這種方式爬取大部分計算器(大約13 000 000頁)需要大約2個月的時間。結果數據(倒排索引,原始剝離文本等) - 大約80 GB的磁盤空間。
搜索
我們的目標是做快和高品質。要意識到的一件事是,如果您希望速度更快,則無法搜索整個數據集。幸運的是,我已經對所有內容進行了分區,因此搜索需要關鍵字出現的前100個分區(單獨的索引),並且如果它找到「足夠好」的結果 - 停止,如果不是 - 則需要100個分區,等等。
最慢的部分是從磁盤讀取索引並對其進行反序列化。Leveldb支持快速順序讀取,因此數據需要以大部分順序讀取的方式進行存儲。一旦進入內存集合交集非常快。
現在的質量。這是最艱難的,永遠不夠好。我最初的嘗試是不僅保留文本的倒排索引,還保留標題,鏈接文本和網址。這些文件中的每一次打擊都增加了一些要點。另一件事是用同義詞改寫查詢,並以某種方式檢查哪個查詢效果最好。這可能值得在它自己的職位。
無論如何,我希望它會有用的閱讀!
來源
2015-09-02 20:56:28
ren
謝謝!我曾看過這個,但忘記了它在哪裏。 – davemackey