[轉]:ElasticSearch: Index 和 Type 的區別

原文: Index vs. Type By Adrien Grand
譯者: fengchang

對於 ES 的新用戶來說,有一個常見的問題:要存儲一批新的數據時,應該在已有 index 裏新建一個 type,還是給它新建一個 index?要想回答這個問題,我們必須先理解這兩者是怎麼實現的。

過去,我們爲了讓 ES 更容易理解,經常用關係型數據庫做一個比喻: index 就像關係型數據庫裏的 database, type 就像 database 裏的 table。但是這並不正確。由於兩種數據庫存儲數據的方式是如此不同,任何比喻都是沒有意義的。這種比喻往往會導致對 type 的濫用。

 

Index 是什麼

Index 存儲在多個分片中,其中每一個分片都是一個獨立的 Lucene Index。這就應該能提醒你,添加新 index 應該有個限度:每個 Lucene Index 都需要消耗一些磁盤,內存和文件描述符。因此,一個大的 index 比多個小 index 效率更高:Lucene Index 的固定開銷被攤分到更多文檔上了。

另一個重要因素是你準備怎麼搜索你的數據。在搜索時,每個分片都需要搜索一次, 然後 ES 會合並來自所有分片的結果。例如,你要搜索 10 個 index,每個 index 有 5 個分片,那麼協調這次搜索的節點就需要合併 5×10=50 個分片的結果。這也是一個你需要注意的地方:如果有太多分片的結果需要合併,或者你發起了一個結果巨大的搜索請求,合併任務會需要大量 CPU 和內存資源。這是第二個讓 index 少一些的理由。

Type 是什麼

使用 type 允許我們在一個 index 裏存儲多種類型的數據,這樣就可以減少 index 的數量了。在使用時,向每個文檔加入 _type 字段,在指定 type 搜索時就會被用於過濾。使用 type 的一個好處是,搜索一個 index 下的多個 type,和只搜索一個 type 相比沒有額外的開銷 —— 需要合併結果的分片數量是一樣的。

但是,這也是有限制的:

  • 不同 type 裏的字段需要保持一致。例如,一個 index 下的不同 type 裏有兩個名字相同的字段,他們的類型(string, date 等等)和配置也必須相同。
  • 只在某個 type 裏存在的字段,在其他沒有該字段的 type 中也會消耗資源。這是 Lucene Index 帶來的常見問題:它不喜歡稀疏。由於連續文檔之間的差異太大,稀疏的 posting list 的壓縮效率不高。這個問題在 doc value 上更爲嚴重:爲了提高速度,doc value 通常會爲每個文檔預留一個固定大小的空間,以便文檔可以被高速檢索。這意味着,如果 Lucene 確定它需要一個字節來存儲某個數字類型的字段,它同樣會給沒有這個字段的文檔預留一個字節。未來版本的 ES 會在這方面做一些改進,但是我仍然建議你在建模的時候儘量避免稀疏。[1]
  • 得分是由 index 內的統計數據來決定的。也就是說,一個 type 中的文檔會影響另一個 type 中的文檔的得分。

這意味着,只有同一個 index 的中的 type 都有類似的映射 (mapping) 時,才應該使用 type。否則,使用多個 type 可能比使用多個 index 消耗的資源更多。

我應該用哪個

這是個困難的問題,它的答案取決於你用的硬件、數據和用例。首先你要明白 type 是有用的,因爲它能減少 ES 需要管理的 Lucene Index 的數量。但是也有另外一種方式可以減少這個數量:創建 index 的時候讓它的分片少一些。例如,與其在一個 index 裏塞上 5 個 type,不如創建 5 個只有一個分片的 index。

在你做決定的時候可以問自己下面幾個問題:

  • 你需要使用父子文檔嗎?如果需要,只能在一個 index 裏建立多個 type。
  • 你的文檔的映射是否相似?如果不相似,使用多個 index。
  • 如果你的每個 type 都有足夠多的文檔,Lucene Index 的開銷可以被分攤掉,你就可以安全的使用多個 index 了。如果有必要的話,可以把分片數量設小一點。
  • 如果文檔不夠多,你可以考慮把文檔放進一個 index 裏的多個 type 裏,甚至放進一個 type 裏。

總之,你可能有點驚訝,因爲 type 的使用場景沒有你想象的多,這是正確的。由於我們上面提到原因,在一個 index 中使用多個 type 的情景其實很少。如果你的數據有不同的映射,那就給他們分配不同的 index。但是請記住,如果不需要很高的寫入吞吐量,或者存儲的文檔數量不多,你可以通過減少 index 的分片來使集羣中的分片數量保持合理。


[1] posting list 和 doc value 都是 Lucene 的壓縮技術,原理是保存後一個文檔和前一個文檔的差異,而不是完整的文檔。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章