淘寶搜索引擎的緩存機制入門總結

  關於搜索的緩存機制的入門,有一篇很好的文章,在這裏簡單總結一下,下面是文章的連接:http://www.tao-sou.com/840.htmlhtml

  對於一個正常的搜索流程,好比用戶輸入查詢請求「夏季 連衣裙」,淘寶搜索引擎須要分別將存儲在磁盤上的兩個單詞的倒排索引讀入內存,以後進行解壓縮,而後求兩個單詞對應倒排列表的交集,找到全部包含兩個單詞的文檔集合,根據排序算法來對每一個文檔的相關性進行打分,按照相關度輸出相關度最高的搜索結果。
  以上這個流程涉及了磁盤讀/寫、內存運算等一系列操做,相對比較耗費時間和計算資源。若是將本次搜索結果存儲在緩存中,下次遇到相同的查詢請求,則能夠直接將搜索結果返回,不須要通過上述的複雜流程進行計算。緩存通常用最快的內存設備進行存儲,因此響應速度很是快,同時也省略了至關多的磁盤讀取和計算步驟,有效地節省了計算資源。
  淘寶緩存系統包含兩個部分,即緩存存儲區及緩存管理策略。緩存存儲區是高速內存中的一種數據結構,能夠存放某個查詢對應的搜索結果,也能夠存放搜索中間結果,好比一個查詢單詞的倒排列表。
  最多見的緩存對象類型是用戶查詢請求所對應的搜索結果信息,好比寶貝的標題、寶貝URL等。圖3給出了將搜索結果做爲緩存內容的示例,緩存裏保存了「連衣裙" ,「運動鞋」等用戶查詢,以及其對應的搜索結果。若是此時有另一個用戶輸入「連衣裙」做爲查詢,則淘寶搜索引擎首先在緩存裏面查找,發現己經存在這個用戶查詢項,則直接提取原先的搜索結果做爲輸出返回給用戶。
  另一種比較常見的存儲對象類型是查詢詞彙對應的倒排列表(Posting List)。圖4是以單詞倒排列表做爲緩存內容的一個示例圖,從圖中能夠看出,以搜索結果做爲緩存內容的狀況下,用戶查詢即便包含多個單詞,也是做爲一個總體存儲在緩存槽裏的;而以單詞倒排列表做爲緩存內容的方式,其存儲粒度相對會小些,是以用戶查詢的分詞結果存儲在緩存槽裏的。好比「夏季 連衣裙」這個用戶查詢,在搜索結果做爲緩存內容情形下佔用一項緩存槽,而在緩存倒排列表方式下會佔用兩個緩存槽,「夏季」和「連衣裙」各自佔用一個存儲位置。
  這兩種不一樣的緩存存儲內容各自有其優缺點,對於搜索結果型緩存來講,其用戶查詢響應速度很是快,由於只須要進行查找運算便可返回結果,可是其粒度比較粗,好比在如圖3所示的例子中,若是此時用戶輸入查詢「連衣裙 韓版」,則淘寶搜索引擎會發現緩存裏面並不存在這個查詢,只能按照正常搜索流程,去調用索引數據並進行網頁排序等運算。可是倒排列表型緩存由於粒度較小,會發現「連衣裙」這個查詢詞彙已經在緩存中了,此時只須要從存儲在硬盤的倒排索引中讀取「韓版」這個詞彙的倒排列表數據,而後進行排序運算便可返回結果。由這個例子能夠看出,倒排列表型緩存粒度小,因此命中率高,可是由於保存的只是倒排列表這種中間數據,因此仍然須要進行後續的計算才能返回最終結果,在用戶響應效率方面慢於搜索結果型緩存。而搜索結果型緩存粒度大,若是在緩存內命中用戶查詢,則很快給出最終結果,可是命中率要低於倒排列表型緩存。
  以上兩種緩存對象是比較常見的緩存類型,還有一種不太常用的方式,即保留兩個常常搭配出現單詞的倒排列表的交集,以這種中間結果形式做爲緩存內容。由於用戶查詢有很大比例是由2個或者3個單詞組成的,對於多詞構成的用戶查詢,搜索引擎在從硬盤讀出每一個詞彙的倒排列表後,須要進行文檔隊列的交集運算。而若是可以事先將這些交集運算的計算結果緩存起來,則能夠避免後續的交集運算,提升搜索系統返回結果的速度。可是這種詞彙組合的數據量很是大,都放置到內存中每每很困難,因此通常這種中間結果會存儲在磁盤上。這種類型的緩存不能單獨使用,可是能夠做爲多級緩存中的一個緩存級別存在,對其餘類型的緩存起到補充做用。
  根據上面兩種緩存存儲結構,咱們也能夠設計一種二級緩存。二級緩存結構由兩級緩存串聯構成,第1級緩存是搜索結果型緩存,第2級緩存是倒排列表型緩存。當系統接收到用戶查詢時,首先在一級緩存查找,若是找到相同查詢請求,則返回搜索結果;若是在一級緩存沒有找到徹底相同的查詢,則轉向二級緩存查找構成查詢的各個單詞的倒排列表,若是某些單詞的倒排列表沒有在二級緩存中找到,則從磁盤讀取對應的倒排列表,進入二級緩存;以後,對全部單詞的倒排列表進行求交集運算並根據排序算法排序輸出最相關的搜索結果,將相應的用戶查詢和搜索結果放入一級緩存進行存儲,並返回最終結果給用戶。採用兩級緩存結構的出發點在於可以融合搜索結果型緩存的用戶快速響應速度和倒排列表型緩存的命中率高這兩個優勢。
  另外就是緩存的管理策略,一種是淘汰策略,另外一種是更新策略。
  淘汰動態策略的緩存數據徹底來自於在線用戶查詢請求,這種緩存策略的基本思路是:對緩存項保留一個權重值,這個權重值根據查詢命中狀況動態調整,當緩存已滿的狀況出現時,優先淘汰權重值最低的那個緩存項,經過這種方式來騰出空間。比較常見的動態策略包括:LRU策略、LandLord策略及SLRU等改進策略。
  目前不少搜索引擎使用簡單的更新策略,即在搜索引擎比較繁忙的時候不考慮緩存更新問題,而等到搜索引擎請求不多的時候,好比午夜等時間段,將緩存內的內容批量進行更新,使緩存內容保持和索引內容的一致。這種簡單策略適合索引更新不是很是頻繁的應用場景,對於索引更新頻繁的場景,須要相對複雜些的緩存更新策略。算法

相關文章
相關標籤/搜索