https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping.html
如果有兩個不同的類型,每個類型都有同名的字段,但映射不同(例如:一個是字符串一個是數字),將會出現什么情況?
簡單回答是,Elasticsearch 不會允許你定義這個映射。當你配置這個映射時,將會出現異常。
詳細回答是,每個 Lucene 索引中的所有字段都包含一個單一的、扁平的模式。一個特定字段可以映射成 string 類型也可以是 number 類型,但是不能兩者兼具。因為類型是 Elasticsearch 添加的 優於 Lucene 的額外機制(以元數據 _type 字段的形式),在 Elasticsearch 中的所有類型最終都共享相同的映射。
以 data 索引中兩種類型的映射為例:
{
"data": {
"mappings": {
"people": {
"properties": {
"name": {
"type": "string",
},
"address": {
"type": "string"
}
}
},
"transactions": {
"properties": {
"timestamp": {
"type": "date",
"format": "strict_date_optional_time"
},
"message": {
"type": "string"
}
}
}
}
}
}
每個類型定義兩個字段 (分別是 "name"/"address" 和 "timestamp"/"message" )。它們看起來是相互獨立的,但在后台 Lucene 將創建一個映射,如:
{
"data": {
"mappings": {
"_type": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type": "string"
}
"address": {
"type": "string"
}
"timestamp": {
"type": "long"
}
"message": {
"type": "string"
}
}
}
}
注: 這不是真實有效的映射語法,只是用於演示
對於整個索引,映射在本質上被 扁平化 成一個單一的、全局的模式。這就是為什么兩個類型不能定義沖突的字段:當映射被扁平化時,Lucene 不知道如何去處理。
結論
技術上講,多個類型可以在相同的索引中存在,只要它們的字段不沖突(要么因為字段是互為獨占模式,要么因為它們共享相同的字段)。
重要的一點是: 類型可以很好的區分同一個集合中的不同細分。在不同的細分中數據的整體模式是相同的(或相似的)。
類型不適合 完全不同類型的數據 。如果兩個類型的字段集是互不相同的,這就意味着索引中將有一半的數據是空的(字段將是 稀疏的 ),最終將導致性能問題。在這種情況下,最好是使用兩個單獨的索引。
在Elaticsearch 6.x版本中已經只允許一個索引下只有一個type,聲明多個type已經標記為過期,但是仍可以使用。7.0之后的版本將完全移除
https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html
