實現自己的搜尋引擎(一)

2021-06-08 06:45:32 字數 1291 閱讀 8293

搜尋引擎的原理其實很簡單,寫出來沒兩頁紙,但是實現中的各種細節寫成的**可以堆滿兩個圖書館。

讓我們先從原理說起。

首先需要用輸入資料建立索引,對於網際網路搜尋引擎,輸入資料是乙個個由爬蟲從網上抓回來的網頁,經過清洗之後進行內容抽取,然後整理成統一的格式交給索引程式建立索引。

索引由以下幾個基本的組成部分:

1. 倒排索引,這一部分存放"關鍵字"->文件的對映,一般來說會把同乙個關鍵字對應的所有文件按照統一方法整理成乙個排好序的線性結構,以便遍歷和各種and/or之類的操作。

2. 正排索引,這一部分存放每個文件的各種屬性

索引程式要幹的事就是從源資料中拿出每個關鍵字和各種屬性,整理成索引檔案。文字變成關鍵字的過程叫做關鍵字提取,對於英語等語言,這個過程相對容易,一般就是進行大小鑫轉換,拼寫檢查,字根提取等工作,例如源文字中的「goes」,「going」,「went」統一轉換為「go」等;對於中文來說這個過程會比較麻煩,需要進行分詞,常用的分詞方法有單字切分、正/反向最大匹配、n元分詞、隱馬模型等。沒有那一種單一的方法能滿足所有需求,所以實際應用中一般會將多種方法結合使用。

索引建立好之後就可以搜尋了,乙個典型的搜尋過程有這幾個步驟:

1. 倒排索引的查詢,一般稱為「全文檢索」,根據輸入的關鍵字序列t1,t2..tn,在倒排索引中找到對應的文件鏈,根據查詢需求進行and或者or的組合,得到乙個滿足條件的結果集,對於典型的全文搜尋引擎,這個階段還需要計算每個文件的文字相關性以便排序,常用的文字相關性演算法有tfidf、bm25、vsm、lm等。

2. 正排索引過濾,在得到滿足全文檢索的文件集後,對每個文件檢查其屬性是否滿足過濾條件,如果不滿足則丟棄,剩下的就是最終的結果集。

3. 排序,全文搜尋引擎一般的做法是:基於倒排索引查詢得到的文字相關性,結合正排索引中的各種屬性進行加權,例如給較新的文件加分等,最終得到乙個分值,然後對結果集進行排序,保留前若干個結果返回給使用者。

垂直搜尋引擎的基本工作原理和上述的一樣,但是側重點不同,一般來說垂直**更重視文字之外的各種屬性,例如電商**會很關注商品的庫存量和售價,如果排序結果將無庫存或者過於昂貴的商品放在最前面會嚴重影響銷售量;本地搜尋**會很關注poi和使用者之間的距離,如果將一家距離使用者很遠的商戶排在結果的前面同樣也會造成很不好的體驗。

另外還有乙個很重要的問題就是索引的更新,對於網際網路搜尋引擎來說,一般會採用定期重建的策略,例如google就是每個幾個小時將乙個索引塊整個重建,但是這種策略對於電商**顯然不行,例如在**上可以進行拍賣,使用者出價會導致拍賣**迅速變化,需要在很短時間內迅速將這個**的變化反映到搜尋結果中,這就需要一些專門設計的索引結構來支援。

下一節我們將看看搜尋引擎中的一些基本資料結構

自己動手寫搜尋引擎

radic 是我用go語言實現搜尋引擎的索引部分,包括 倒排索引 正排索引 分布式索引 首先需要go get github.com orisun radic package main import radic types bytes encoding gob fmt radic time book ...

搜尋引擎 索引

正排索引 文件編號,單詞編號,單詞的數量,單詞出現的位置。倒排索引 1,單詞詞典,儲存單詞以及統計資訊,單詞在記錄表中的便宜,可常駐記憶體,用雜湊表儲存。2,記錄表,單詞對應的文件集合,記錄單詞出現的數目 位置。文件採用差分變長編碼。其中文件可按編號公升序排列 可利用差分編碼 也可按出現次數排列,可...

搜尋引擎的實現原理

2006年11月15日 10 43 00 自由出版人2008 閱讀數 798 標籤 搜尋引擎 資料庫全文檢索 網路網際網路 伺服器 3 在索引資料庫中搜尋關鍵內容。當使用者輸入搜尋內容,單擊搜尋按鈕後,系統自定義的程式開始根據相關技術,分析使用者的搜尋內容,然後從網頁索引資料庫中,找到包含使用者搜尋...