想自己手動開發一個搜索引擎,想知道Google搜索引擎的框架和實現所用到的技術?

1.我是一個在讀研究生,想自己做一個搜索引擎作為自己的畢設,我的想法是自己做出來一個小的模型,然後自己對搜索引擎上的某些演算法進行創新。

2.我已經看過一本入門的書:《這就是搜索引擎:核心技術詳解》裡面講到的搜索引擎用到的一些演算法,而且都是大概講了一下。

3.我也看到有一本書《自己動手寫搜索引擎》,但是這本書用到的是Java,一方面是這裡面寫的搜索引擎用到的是已經寫好的函數庫,我想自己寫,比如倒排索引,比如爬蟲程序等等;另一方面,我現在剛把python學完,還有我想好好再學學C++,所以我想用著兩門語言進行開發。

4.我現在迫切想知道的是兩點:一、整個搜索引擎分為哪些部分,二每一個部分都用什麼語言開發,或者說用到了什麼技術,我現在無從下手。

非常希望大神們來解惑!


一個完整的搜索引擎,分為兩個部分:索引和查詢。

一、索引階段

就是我們從各個不同來源(文本、網路、資料庫、xml等)獲取所關注的數據,然後把它們從非結構化或半結構化的狀態轉為一個搜索引擎能識別的結構化數據。

普遍意義上的全文檢索,主要是針對文本的檢索,例如百度、谷歌、必應等,在加上一些特定域的查詢,就組成了某些專業領域的搜索。例如全文檢索(商品標題、產地、描述組成的文本)+特定域(價格、品牌、顏色、分類)檢索=電子商務搜索引擎

搜索引擎對於全文檢索的效率之所以高且准,是因為在索引階段做好了充分的準備:分詞,就是我們最常聽到的「倒排鏈表」的建立。

簡單來說,就是拿到一系列文檔,通過分詞器,將文檔分割成不同的有意義的辭彙(term),然後給每個辭彙建立一個鏈表,鏈表主要存放的是文檔在搜索引擎內部的一個主鍵(可以理解為傳統關係資料庫的自增主鍵,和數據本身沒有關係)。

例如有兩段文字:

A:中華人民共和國成立了

B:中國人民從此站起來了

A的最小分詞結果大概是:[中華, 中華人民, 中華人民共和國, 華人, 人民, 人民共和國, 共和, 共和國, 成立, 立了]

B的最小分詞結果大概是:[[中國, 中國人, 中國人民, 國人, 人民, 從此, 站起, 站起來, 起來, 來了]

搜索引擎系統遇到A文本是,當作是第一篇文檔,自動生成一個內部ID=1,B的ID=2;所以,對於分詞結果簡歷的倒排鏈表如下:

中華:1

中華人民:1

中華人民共和國:1

華人:1,

人民:1,2

人民共和國:1

共和:1

共和國:1

成立:1

立了:1

中國:2

中國人:2

中國人民:2

國人:2

從此:2

站起:2

站起來:2

起來:2

來了:2

(最終生成的term是按照字典順序排列的)

上面,對於分詞(term)「人民」,其倒排鏈表就是[1,2]

註:以上只是一個最簡單的倒排鏈表生成,實際上,每個鏈表的節點至少保存term的次數、各個位置、boost等信息以及數據的壓縮存儲。

對於簡單的索引階段,個人建議:

1、分詞器,初期可以搞一個簡單的版本,用字典樹+詞庫的方式就可以很迅速的分詞了

2、倒排鏈表的建立,也可以將最終分詞得到的倒排鏈表建立成一棵樹,鏈表就放在樹的節點上,這樣,隨意一個關鍵字,可以參照分詞的演算法,找到對應詞,立即得到倒排鏈表

3、這樣可以從最簡單的方法上,熟悉整個索引階段的核心演算法、思路

二、查詢階段

其實就是拿到一串關鍵字,系統將關鍵字分割,然後根據不同關鍵字對應的不同倒排鏈表進行一個組合(交集、並集、差集),然後按照關鍵字的權重,域的權重,索引時的權重,進行一個綜合打分,通過二叉堆的演算法,取得最符合的前若干條。建議初始學習搜索引擎,可以不考慮pageRank演算法,此演算法與網頁爬蟲關係比較緊密,要保存各個文本的url,來源url,去向url,初學起來太複雜了。

例如,查詢關鍵字:人民,很簡單,直接在倒排鏈表字典樹中拿到倒排鏈表[1,2]

查詢關鍵字:華人來了,分詞得到【華人,來了】,然後將其倒排表[1]和[2]進行一個交集,就是無結果,如果是普通的全文檢索,其實就是儘可能多的匹配,就是多個鏈表進行並集,綜合計算得分,然後倒序。如果「華人」的權重大,結果就是[1,2],否則就是[2,1]。

最終的排序演算法,最普遍的就是關鍵字的「空間向量模型」:查詢關鍵字的向量和每個文本的關鍵字向量,進行一個夾角(餘弦值)計算,值即為得分。當然,百度、谷歌這種的排序演算法,比這種複雜太多了。

總結下,上文提到的兩個過程和演算法,基本可以簡單的完成一個搜索項目,對於了解搜索引擎的原理、思路比較有幫助。基於以上的思路,隨便什麼語言,都可以完成一個可用的搜索引擎,我個人曾經也寫過基於js的搜索引擎的索引階段。

涉及到的演算法:分詞、字典樹、有序鏈表的交集、並集、差集、相似度演算法、二叉堆topN演算法。

參考:Lucene學習總結之七:Lucene搜索過程解析(5)

三、爬蟲(算索引階段的前置吧)

至於爬蟲的話,如果不使用開源框架,其實也可以簡單的實現下,就是輸入一個url,然後爬到網頁的內容,解析html,拿到其中的超鏈接,作為下一次遞歸爬蟲的輸入源。

重點就是:

1、判斷url是否已經爬過,小數據量,用set就行了,或者其他緩存;如果是海量數據,則利用bloom-filter演算法。

2、設置一個遞歸的廣度和深度,防止死循環即可。

其實,互聯網電子商務的搜索引擎(垂直領域的搜索引擎)非常有意思,行業的不同,其關注的核心也不同,排序方式、重點簡直是天差地別,還有各種專業詞庫、同義詞庫。本人剛從電子商務搜索引擎開發,轉為互聯網招聘行業的搜索引擎開發,感覺發現了一個新的小天地,專心的鑽研搜索引擎,非常有趣!

祝你愛上搜索,畢設順利!

以上,僅僅是個人從事互聯網、電子商務以來的一些經驗,如有失誤,還請指出!


題主可以看看Stanford NLP大牛教授Christopher Manning的Introduction to Data Retrieval. 這本書對於搜索引擎各個方面都講解得十分詳細,同時十分淺顯易懂

http://nlp.stanford.edu/IR-book/pdf/irbookonlinereading.pdf


。。。其實說實話,你寫爬蟲都夠你畢業的工作量了。

但是創新度不夠,後面的東西其實怎麼寫都差不太多


把NUTCH吃透、用好,在各個擴展點實踐你的想法。我相信這樣做的收穫會比你從零開始造輪子要大得多


推薦閱讀:

如何找到一些大師的攝影圖集?
怎麼使用google scholar和各類數據 庫,還包括各類搜索方法?
如何提高搜商?
被人肉搜索以後應該怎麼辦?
Google 如何利用收購摩托羅拉移動所獲得的專利來幫助 Android 開發商?HTC、三星還會繼續向微軟支付專利費用嗎?

TAG:搜索 | 開發框架 | 搜索引擎 |