Elasticsearch7.X為什么移除類型(type)


Elasticsearch7.X為什么移除類型(type)

什么是類型(type)?

從Elasticsearch的第一個發布版本以來,每一個文檔都被存儲在一個單獨的索引里,並被賦予了一個type,一個映射類型代表着一個被索引的文檔或實體的類型,例如,一個twitter索引可能有一個user類型和tweet類型。

每種映射類型都有他自己的字段,所以user類型可能有一個full_name字段,一個user_name字段和一個email字段,而一個tweet類型可能有一個content字段,一個tweet_at字段,和user類型一樣一個user_name字段。

每一個文檔類型都有一個_type元字段來存儲type名稱,並且根據URL里指定的類型名稱,查詢(搜索)被限定在一個或多個類型(type)里:

GET twitter/user,tweet/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
    }
  }
}

_type字段用來和文檔的_id字段聯合生成_uid字段,所以有着相同_id的不同類型的文檔可以存在同一個索引里。類型也用來建立文檔間的父子關系,所以question類型的文檔可能是anser類型文檔的父文檔。

為什么類型被移除了?

起初,我們說"索引"和關系數據庫的“庫”是相似的,“類型”和“表”是對等的。
這是一個不正確的對比,導致了不正確的假設。在關系型數據庫里,"表"是相互獨立的,一個“表”里的列和另外一個“表”的同名列沒有關系,互不影響。但在類型里字段不是這樣的。

在一個Elasticsearch索引里,所有不同類型的同名字段內部使用的是同一個lucene字段存儲。也就是說,上面例子中,user類型的user_name字段和tweet類型的user_name字段是存儲在一個字段里的,兩個類型里的user_name必須有一樣的字段定義。

這可能導致一些問題,例如你希望同一個索引中"deleted"字段在一個類型里是存儲日期值,在另外一個類型里存儲布爾值。

最后,在同一個索引中,存儲僅有小部分字段相同或者全部字段都不相同的文檔,會導致數據稀疏,影響Lucene有效壓縮數據的能力。

因為這些原因,我們決定從Elasticsearch中移除類型的概念。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM