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中移除類型的概念。