搜索引擎设计实用教程(5)-以百度为例
?/*版權聲明:可以任意轉載,轉載時請務必標明文章原始出處和作者信息 .*/
?
搜索引擎設計實用教程(5)-以百度為例
?
?????????????????????????? 之五:CACHE結構
?
中科院軟件所? 張俊林
2006年1月4日
???????????????????????
?
?
??? Cache是目前實用的搜索引擎都必備的功能,因為研究表明用戶的查詢有相當比例(30%-40%)是重復的,而且大多數重復的用戶查詢會在較短的間隔時間被再次重復訪問.比如說目前"芙蓉姐姐"成為街頭巷議的美談,那么不僅張三想搜索"芙蓉姐姐",王二麻子同樣也想搜索,以免被隔壁的李四笑話趕不上時代潮流.既然大家的關注焦點是差不多的,那么沒有必要每次接受到查詢后都從索引庫里面查找,把大量的用戶查詢放到CACHE里面,肯定能夠節省不少計算資源.
?? 那么如何設計一個CACHE能夠更加有效的節省計算資源呢?我們還是照舊分析一下百度是如何做的,當然,因為CACHE分析可以獲得的外部信息非常少而且即使是獲得的信息也不太可靠所以分析起來難度還是比較大的,所以下面的分析中有很大的比例是猜測的成分.
? CACHE設計主要關注兩個大的方面:
?? 一個是CACHE的結構是怎樣的?是只設計一個CACHE就拉倒呢?還是設計兩級CACHE乃至三級CACHE?當然這里的二級三級不是咱們大老爺們們喜聞樂見的電影分級標準,而是優先級別的意思,你別指望從三級CACHE里面看到的都是清涼圖片.
? 第二個方面是采取何種替換算法?畢竟CACHE是寶貴的資源,當CACHE里面已經被塞滿的時候,把哪個記錄踢出CACHE才合算呢?
?
? 我們看看百度的CACHE結構是怎樣的.經過分析加推測,百度的CACHE系統可能有三個CACHE,用魯迅先生的說法:百度有三個加快查詢匹配的結構,其中一個是CACHE,另外一個也是CACHE,還有一個同樣是CACHE.也就是說有一級CACHE,有二級CACHE,還有三級CACHE.
?? 這個一級CACHE是相當容易看出來的,我們可以隨便想一個比較古怪的查詢,之所以這樣是避免CACHE里面已經保存了這個查詢條件,以免影響我們的判斷,比如說用"可見阿斯蒂芬健康法",這個查詢夠怪了吧,不會有哪位老兄象我一樣無聊到要查這個東西吧,提交給百度,百度提示"找到相關網頁約9,890篇,用時0.236秒",至于這個查詢是否在CACHE里面,除了上帝,我估計連百度設計CACHE系統的技術人員也不知道.接著我們再次把這個查詢提交給百度,百度提示"找到相關網頁約9,890篇,用時0.001秒",嗯,這下有了一些線索了,看看時間的變化,從0.236秒到0.001秒(當然,分析CACHE是相當困難的,因為可以看到的線索太少,這里如果只憑借搜索時間是無法判斷是否從CACHE里面存取的,必須結合幾個方面:時間變化,找到的頁面個數以及首頁內容排序是否變化.如果找到頁面個數不變,首頁內容排序不變,即使時間變得很大,也極有可能是從CACHE里面獲得的結果),從時間變化和返回結果以及首頁排序來說,雖然我不知道第一次查詢是否從CACHE里面返回結果,但是可以肯行的是第二次查詢肯定是從CACHE里面獲取的.再用其它幾個例子測試,你會發現,只要是你兩次提交同樣的查詢,第二次返回時間總是0.001秒.這明顯是從第一級CACHE取得的結果,也就是說如果百度第一次檢索發現查詢不在一級CACHE里面,那么立即把這個查詢調入一級CACHE.同時,這個一級CACHE是完全精確匹配的,如果查詢有任何細微的變化,那么都無法從一級CACHE里面找到,百度對于一級CACHE的匹配很有可能是采用HASH計算,這樣速度會相當快.我們可以設想百度的一級CACHE里面記錄結構如下:
???? HASH_id--->|record1<Query1,doc1_info,doc2_info,....docn_info>|record2<Query2,doc1'_info,doc2'_info,...docm'_info>...
?? 當然,上面是個簡略的表達,還有很多其它的信息比如加入CACHE的時間長短以及命中次數等其它信息.
?? 二級CACHE是否存在呢?為了能夠將故事講明白,在分析其它CACHE是否存在之前,我們首先需要介紹一下搜索引擎的索引.
?? 簡單來說,搜索引擎的最核心的索引是倒排文檔,這種數據結構是為了加快信息提取的速度,倒排文檔的結構如下:
???? word--><doc_id1,other info>|<doc_id2,other info>|....<doc_idk,other info>
???? 倒排文檔記錄了哪些文件出現過詞匯word,上面的結構表明了doc_id1,doc_id2一直到doc_idk這么K個文檔都出現過單詞word.有了這個數據結構,假設用戶的查詢是單詞"word",那么直接查找倒排文檔表,就能把包含單詞word的網頁信息全部提取出來,然后按照一定規則排序輸出即可.假設用戶的查詢有兩個單詞"word1 word2",那么從倒排文檔里面提取包含word1的網頁ID列表,再提取包含word2的網頁ID列表,然后求兩個列表的交集(搜索引擎一般假設用戶查詢是"與"的關系)這個交集里面的網頁就是同時包含word1和word2的頁面,然后按照一定規則排序輸出,對于包含更多查詢詞匯的用戶查詢,基本上道理是一樣的.
??? 好了,我們在轉回來分析二級CACHE的問題,假設讓我們來設計CACHE系統的話,一個最容易想到的方法是設立兩個CACHE,一個放在內存,另外一個放在磁盤,兩者都采取精確匹配,如果在內存CACHE里面沒有找到,那么就到磁盤CACHE里面查找,如果找到則只執行一次磁盤I/O就可以輸出結果,如果還是沒有找到,那么在索引庫里面按照切分好的單詞進行查找,一方面切分出多少單詞,就查找索引幾次,另外一方面索引庫總是遠遠大于磁盤CACHE,所以搜索時間肯定比磁盤CACHE查找慢.所以我們可以假定百度的二級CACHE是存儲在磁盤的常用用戶查詢,當然至于百度是否有這么個CACHE我也不知道,全當猜測好了.
至于三級CACHE是否存在的問題,只能說很可能存在,之所以這么說,這里面有部分證據因素,也有部分推理因素。我們先說一下三級CACHE應該存在的推理因素,通過上面的分析,我們已經確認的是:百度的一級CACHE是存在的,而且是完全精確匹配.如果有兩個查詢:查詢1:"芙蓉 姐姐" 查詢2:"芙蓉 姐夫" 假設第一個查詢已經進入一級CACHE,再搜索第二個查詢的時候,因為一級CACHE要求精確匹配,所以第二個查詢會被認為沒有在CACHE找到,如果二級CACHE存在,也同樣無法找到,那么這兩個查詢單詞都必須從索引里面提取,但是事實上兩個查詢是存在交集"芙蓉"這個詞匯的,沒有理由每次都從索引里面提取,更合理的方式是把常用單詞的倒排文檔信息放在另外一個內存的CACHE里面,假設用戶新的查詢經過分詞后包含若干單詞,如果發現這個三級CACHE包含這個單詞那么直接從CACHE里面讀取,如果CACHE沒有那么需要通過讀磁盤文件來獲得單詞的倒排文檔信息,這個CACHE的作用主要是節省磁盤I/O時間,直接在內存讀取信息當然比讀取磁盤快很多.所以從道理上是應該有這么一個在內存的三級CACHE的.
?? 接著提供一些證據來確認,輸入查詢"流浪",百度提示"找到相關網頁約11,000,000篇,用時0.001秒",說明這個查詢是在一級CACHE里面找到的,修改查詢為"流浪 流浪"百度提示為"找到相關網頁約11,000,000篇,用時0.144秒",從時間信息看說明一級CACHE里面沒有找到,另外由于找到的頁面沒有變化,首頁內容排序沒有變化,所以很有可能是從CACHE里面讀取的,當然這只能是一種可能性,并不能排除是從磁盤讀取的.另外一個證據,輸入查詢"流浪 在線",百度提示"找到相關網頁約2,080,000篇,用時0.174秒",修改查詢為"在線 流浪",百度返回信息"找到相關網頁約2,080,000篇,用時0.178秒 ",同時首頁排序沒有變化,另外時間0.178秒也不是很長. 所以很有可能是從CACHE里面讀取的,當然同樣并不能排除是從磁盤讀取的.然而,如果一個查詢是從磁盤讀取的,那么必然查詢越長,磁盤讀寫次數越多,時間越慢.但是構造一個很長的查詢"在線 流浪 在線 流浪 在線 流浪 在線 流浪",百度提示"找到相關網頁約2,080,000篇,用時0.179秒",時間基本上沒有增加,頁面排序也沒有變化,所以有很大的可能是采用了上面講的第三級CACHE。
?? 至于CACHE淘汰算法,現有的成熟并常用的CACHE淘汰算法包括LRU,SLRU,FBR,LRU/2等等,因為研究表明如果CACHE足夠大的話,這些算法的效率盡管有細微的差別,但是總體上差不多,在實現的時候選擇最簡單的一個即可.
?? 所以,歸納上面的敘述內容,可以得到如下的三級CACHE算法:
?? 1.存在三級CACHE,一級CACHE在內存中,采取完全精確匹配,二級CACHE在磁盤中,采取完全精確匹配,三級CACHE在內存中,采取非完全精確匹配;
?? 2.得到用戶查詢編碼,HASH計算得到HASH編碼,在一級CACHE里面查找,如果找到輸出,同時該查詢命中次數計數器加1;
?? 3.如果在一級CACHE沒有命中,則在二級CACHE精確查找,如果找到輸出,同時該查詢命中次數計數器加1并將該查詢相關信息加載到一級CACHE;
?? 4.如果在二級CACHE沒有找到,用戶查詢分詞,判斷組成查詢的各個詞匯是否在三級CACHE里面存在,如果存在則直接得到倒排文檔列表,如果不存在則從索引庫里面查找該詞匯的倒排文檔列表,并將該詞匯及其倒排文檔列表加入三級CACHE,計算各個查詢詞匯倒排文檔列表的交集,并將其放入一級CACHE和二級CACHE;
??
?
?
?
??
?
?
總結
以上是生活随笔為你收集整理的搜索引擎设计实用教程(5)-以百度为例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人,人生,人类,思考
- 下一篇: 百度国学搜索探密