1. 程式人生 > >ES-倒排索引

ES-倒排索引

來源

  • 來源於需要根據屬性的值來查詢響應的記錄
  • 該種索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址
  • 是由屬性值來確定記錄的位置
  • 倒排索引是實現單詞到文件對映關係的最佳實現方式和最有效的索引結構

包含內容

  1. 單詞詞典 : 文件中的關鍵片語成的詞典(使用者可能通過這些個詞典查詢)
  2. 倒排檔案 : 倒排列表記載了出現過某個單詞的所有文件的文件列表及單詞在該文件中出現的位置資訊,每條記錄稱為一個倒排項(Posting)。根據倒排列表,即可獲知哪些文件包含某個單詞。存放倒排列表的檔案就是倒排檔案

構建方法

簡單法

1. 將文件分析成單詞term標記
2. 使用hash去重單詞term
3. 對單詞生成倒排列表

倒排列表就是文件編號DocID,沒有包含其他的資訊(如詞頻,單詞位置等),這就是簡單的索引。
這個簡單索引功能可以用於小資料,例如索引幾千個文件。然而它有兩點限制:
1. 需要有足夠的記憶體來儲存倒排表,對於搜尋引擎來說, 都是G級別資料,特別是當規模不斷擴大時 ,我們根本不可能提供這麼多的記憶體。
2. 演算法是順序執行,不便於並行處理。

合併法

  • 歸併法,即每次將記憶體中資料寫入磁碟時,包括詞典在內的所有中間結果資訊都被寫入磁碟,這樣記憶體所有內容都可以被清空,後續建立索引可以使用全部的定額記憶體。

  • 合併流程:

    1. 頁面分析,生成臨時倒排資料索引A,B,當臨時倒排資料索引A,B佔滿記憶體後,將記憶體索引A,B寫入臨時檔案生成臨時倒排檔案,
    2. 對生成的多個臨時倒排檔案 ,執行多路歸併 ,輸出得到最終的倒排檔案 ( inverted file)。

索引建立過程中的頁面分析 ,特別是中文分詞為主要時間開銷。演算法的第二步相對很快。這樣建立演算法的優化集中在中文分詞效率上。

更新策略

  • 完全重建策略:當新增文件到達一定數量,將新增文件和原先的老文件整合,然後利用靜態索引建立方法對所有文件重建索引,新索引建立完成後老索引會被遺棄。此法代價高,但是主流商業搜尋引擎一般是採用此方式來維護索引的更新(這句話是書中原話)
  • 再合併策略:當新增文件進入系統,解析文件,之後更新記憶體中維護的臨時索引,文件中出現的每個單詞,在其倒排表列表末尾追加倒排表列表項;一旦臨時索引將指定記憶體消耗光,即進行一次索引合併,這裡需要倒排檔案裡的倒排列表存放順序已經按照索引單詞字典順序由低到高排序,這樣直接順序掃描合併即可。其缺點是:因為要生成新的倒排索引檔案,所以對老索引中的很多單詞,儘管其在倒排列表並未發生任何變化,也需要將其從老索引中取出來並寫入新索引中,這樣對磁碟消耗是沒必要的。
  • 原地更新策略:試圖改進再合併策略,在原地合併倒排表,這需要提前分配一定的空間給未來插入,如果提前分配的空間不夠了需要遷移。實際顯示,其索引更新的效率比再合併策略要低。
  • 混合策略:出發點是能夠結合不同索引更新策略的長處,將不同索引更新策略混合,以形成更高效的方法。

原理

  • 文件1:中國古代的精美散文(長文章已關鍵詞進行排序)
  • 文件2:古代精美散文作者
  • 文件3:如何寫出精美散文

詞典集合:

單詞ID 單詞 倒排列表
1 中國 1
2 古代 1,2
3 精美 1,2,3
4 散文 1,2,3
5 作者 2
6 如何 3
7 寫出 2

簡單實施策略

  1. 為文件設定對應的唯一文件編號
  2. 使用粉刺系統對所有文件進行分詞並記錄
  3. 對每個單詞進行唯一編號(單詞詞典:用來維護文件中出現過的所有單詞的相關資訊)
  4. 記錄每個單詞在哪個文件中出現過(單詞ID、單詞、倒排列表(文件ID序列以及其他相應的詳細的檔案屬性資訊(後續用來計算重要性的計算因子,這個計算因子的解決決定了查詢結果的順序)))
  5. 呈現查詢結果