2013-05-17 75 views
0

考慮與存儲在MySQL數據庫中的位置的記錄倒排索引:你如何添加新文檔到一個倒排索引

Word (VARCHAR) | Documents (LONGTEXT) 
------------------------------------------------------------- 
    Hello  | {id: 11, freq: 4, pos: [18, 37, 43, 119]}, 
        | {id: 19, freq: 2, pos: [17, 32]} 
------------------------------------------------------------- 

現在,一個新的文件來和它的大多數話都已經編入索引。現在應該是什麼索引操作?基本方法似乎是,如果該單詞已經存在於數據庫中,那麼獲取它的文檔並將當前文檔添加到它並更新記錄。

這是可持續的文件達到增加,比方說,數以百萬計的數目? Solr,Xapain,Google,Bing等真實世界的搜索引擎如何處理這個問題?

回答

0

當一個新的文檔添加到您的收藏,操作將是:

  1. 指定文件的ID,說20,它唯一標識文檔。對於添加到集合中的每個新文檔,此ID通常會遞增1。

  2. 做一個列表在新文檔中的所有單詞,以及在什麼位置,他們發生。

    對於文檔Hi Hello Hello Bye,這將是:

    Bye: {id: 20, freq: 1, pos: [15]} 
    Hello: {id: 20, freq: 2, pos: [3, 9]} 
    Hi: {id: 20, freq: 1, pos: [0]}
  3. 對於任何一個新單詞(再見,你好),添加到數據庫中該字的條目。對於數據庫中的任何現有單詞(Hello),將新數據添加到該值。

    下面是你的數據庫是什麼樣子加入文檔後。

Word (VARCHAR) | Documents (LONGTEXT) 
    ------------------------------------------------------------- 
     Bye   | {id: 20, freq: 1, pos: [15]} 
     Hello  | {id: 11, freq: 4, pos: [18, 37, 43, 119]}, 
        | {id: 19, freq: 2, pos: [17, 32]} 
        | {id: 20, freq: 2, pos: [3, 9]} 
     Hi   | {id: 20, freq: 1, pos: [0]} 
    -------------------------------------------------------------

快速回答你的另一個問題是:是的,這是可持續發展的大型索引。倒排索引通常針對查找進行優化,使用散列表或二叉樹,使得檢索實際上與文檔集合的大小無關。

對於大型搜索引擎如何處理這個問題:我不知道的細節(即使我想)。他們顯然使用數據集羣將負載分散到多個服務器上(是的,我說傳播負載,這不是故意的)。我敢打賭,他們已經預處理一堆東西,和緩存像「堆棧溢出」通用查詢,以便已經有一個解決方案頁面爲。