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字段。ui

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

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

_type字段用來和文檔的_id字段聯合生成_uid字段,因此有着相同_id的不一樣類型的文檔能夠存在同一個索引裏。類型也用來創建文檔間的父子關係,因此question類型的文檔多是anser類型文檔的父文檔。code

爲何類型被移除了?

起初,咱們說"索引"和關係數據庫的「庫」是類似的,「類型」和「表」是對等的。 這是一個不正確的對比,致使了不正確的假設。在關係型數據庫裏,"表"是相互獨立的,一個「表」裏的列和另一個「表」的同名列沒有關係,互不影響。但在類型裏字段不是這樣的。索引

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

這可能致使一些問題,例如你但願同一個索引中"deleted"字段在一個類型裏是存儲日期值,在另一個類型裏存儲布爾值。it

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

由於這些緣由,咱們決定從Elasticsearch中移除類型的概念。ast

相關文章
相關標籤/搜索