倒排與列存

  • 一直傻傻分不清倒排和列存,今天有空梳理一下,主要有四個概念要明確:
    1. 索引方式: 正向索引,反向索引(倒排)
    2. 存儲方式: 行存,列存
    3. 數據結構: HashMap,B-Tree,BitMap...
    4. 存儲結構:
      • 順序組織(順序文件)
      • 索引組織(索引文件)
      • 散列組織(散列文件)
      • 鏈組織(多關鍵字文件)

索引方式

  • 索引方式是種指導性的的思想,和具體數據結構和存儲結構沒有直接關係
  • 正向索引:DocId->Value
  • 反向索引:Value->DocId

倒排索引 Inverted Index

倒排索引
倒排索引

  • 倒排索引就是反向索引,是信息檢索中最基礎的索引方法,具體是把索引存爲倒排表和倒排鏈,倒排表存的是全部的值,倒排鏈存的是 DocId 列表。

存儲方式

  • 存儲方式就是正排中存value的方式,也是種指導思想,和具體數據結構,存儲結構沒有關係的
    行列比較
    行列比較
  • 存儲方式主要分爲按行存儲和按列存儲(column-oriented)兩種

按行存儲

  • 以單行做爲一個最小存儲單元,用偏移量表示各列
  • 沒有索引的查詢使用大量I/O
  • Mysql 就是種按行存儲的方式,對於無條件的單列取出,須要遍歷全表

按列存儲

  • 以一列做爲一個record,採起對齊的方式或者 MetaData 的方式記錄行信息
  • 數據便是索引,只查單列的狀況下能夠大量下降系統IO
  • 同種數據在一塊兒,方便壓縮
  • HBase 就是按列存儲的,採用 MetaData 記錄行信息

數據結構

  • 數據結構是數據真實的組織形態,是邏輯層面的真實結構
  • 同一種數據結構能夠實現不一樣的思想,下面以 B-Tree 舉例

B-Tree

倒排

  • B 樹若是每一個內部節點存的是具體的value,葉子節點存 id,那麼這就是個倒排
  • 真實場景中,的確有很多搜索引擎是這麼存倒排的

正排

  • 若是內部節點存 Id,葉子節點存內容,這就是個正排
  • 真實場景中,mysql 的 pk 索引就是這麼存的
  • 行存列存
    • 若是正排的 B-tree 的葉子節點存的是一行的值,那麼這就是行存,反之,若是是一列的值,就是列存

存儲結構

  • 存儲結構就是數據真實落盤的方式,是物理層面的真實結構
  • 根據不一樣的數據結構有不一樣的存儲結構
  • 通常而言,B-Tree 就是索引文件落盤,而 HashTable 則能夠以散列存儲。
  • 目前基本都是索引結構落盤,不一樣產品的具體實現均不相同。
  • 如 IBM 的VSAM就是存儲 B-tree 的一種文件格式,由三部分組成:索引集,順序集和數據集

列存與倒排

  • 回到開頭的問題,列存和倒排究竟是什麼關係呢?
  • 列存是一種正排的存儲思想,和倒排沒什麼關係
  • 通常因爲搜索引擎的排序都是少數列的,因此通常搜索引擎都是精確查詢用倒排,比較算分用列存

參考資料

  1. 幾張圖看懂列式存儲
  2. 數據結構-文件
  3. 傳統的(Oracle)行存儲和(HBase)列存儲的區別
  4. 二級索引和倒排的區別
  5. 列式存儲 HBase 系統架構學習
相關文章
相關標籤/搜索