映射是定義文檔及其包含的字段的存儲和索引方式的過程。
映射定義具有:
- 元字段
元字段用於自定義如何處理關聯的文檔元數據。包括文檔 _index,_id和 _source領域。 - 字段或屬性
映射包含properties與文檔相關的字段列表。
字段數據類型
每個字段都有一個數據type,可以是:
- 簡單類型等text,keyword,date,long, double,boolean或ip。
- 支持JSON的層次結構性質的類型,如 object或nested。
- 或一種特殊類型的像geo_point, geo_shape或completion。
為不同的目的以不同的方式為同一字段建立索引通常很有用。例如,一個string字段可以被索引為text全文搜索的字段,也可以被索引keyword為排序或聚合的字段。或者,您可以使用standard分析器, english分析器和 french分析器為字符串字段建立索引。
防止映射爆炸的設置
在索引中定義太多字段的情況可能導致映射爆炸,從而可能導致內存不足錯誤和難以恢復的情況。此問題可能比預期的更常見。例如,考慮一種情況,其中插入的每個新文檔都引入了新字段。這在動態映射中很常見。每次文檔包含新字段時,這些字段最終都會出現在索引的映射中。對於少量數據,這並不擔心,但是隨着映射的增長,它可能會成為問題。以下設置允許您限制可以手動或動態創建的字段映射的數量,以防止不良文檔導致映射爆炸:
index.mapping.total_fields.limit:索引中的最大字段數。字段和對象的映射以及字段別名都計入此限制。默認值為1000。
該限制已到位,以防止映射和搜索變得太大。較高的值可能導致性能下降和內存問題,尤其是在負載較高或資源很少的群集中。
如果增加此設置,建議您也增加該 indices.query.bool.max_clause_count設置,這將限制查詢中布爾子句的最大數量。
index.mapping.depth.limit:字段的最大深度,以內部對象的數量衡量。例如,如果所有字段都在根對象級別定義,則深度為1。如果存在一個對象映射,則深度為 2,等等。默認值為20。
index.mapping.nested_fields.limit:nested索引中 最大不同映射的數量,默認為50。
index.mapping.nested_objects.limit:nested單個文檔中所有嵌套類型 中JSON對象的最大數量,默認為10000。
index.mapping.field_name_length.limit:設置字段名稱的最大長度。默認值為Long.MAX_VALUE(無限制)。此設置實際上不能解決映射爆炸問題,但是如果您想限制字段長度,該設置可能仍然有用。通常不需要設置此設置。除非用戶開始添加大量名稱很長的字段,否則默認設置是可以的。
動態映射
字段和映射類型在使用之前不需要定義。通過動態映射,僅通過索引文檔即可自動添加新的字段名稱。可以將新字段添加到頂級映射類型以及內部object 和nested字段中。
可以將動態映射規則配置為自定義用於新字段的映射。
顯式映射
您對數據的了解超出了Elasticsearch的猜測,因此盡管動態映射對於入門非常有用,但有時您仍需要指定自己的顯式映射。
當你可以創建字段映射創建索引和 字段添加到現有的索引。
使用顯式映射創建索引
您可以使用create index API創建帶有顯式映射的新索引。
PUT /my-index
{
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"email": {
"type": "keyword"
},
"name": {
"type": "text"
}
}
}
}
將字段添加到現有映射
您可以使用放置映射 API將一個或多個新字段添加到現有索引。
以下示例添加employee-id了keyword一個index映射參數值為的字段 false。這意味着該employee-id字段的值已存儲,但未索引或不可搜索。
PUT /my-index/_mapping
{
"properties": {
"employee-id": {
"type": "keyword",
"index": false
}
}
}
更新字段的映射
除了支持的映射參數外,您無法更改現有字段的映射或字段類型。更改現有字段可能會使已經建立索引的數據無效。
如果您需要更改字段映射,創建具有正確映射一個新的索引和重新索引的數據轉換成指數。
重命名字段會使在舊字段名稱下已建立索引的數據無效。而是添加一個alias字段以創建備用字段名稱。
查看索引的映射
您可以使用get mapping API查看現有索引的映射。
GET my-index/_mapping
API返回以下響應:
{
"my-index" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "integer"
},
"email" : {
"type" : "keyword"
},
"employee-id" : {
"type" : "keyword",
"index" : false
},
"name" : {
"type" : "text"
}
}
}
}
}
查看特定字段的映射
如果您只想查看一個或多個特定字段的映射,則可以使用get字段映射 API。
如果您不需要索引的完整映射或索引包含大量字段,這將很有用。
以下請求檢索該employee-id字段的映射。
GET /my-index/_mapping/field/employee-id
API返回以下響應:
{
"my-index" : {
"mappings" : {
"employee-id" : {
"full_name" : "employee-id",
"mapping" : {
"employee-id" : {
"type" : "keyword",
"index" : false
}
}
}
}
}
}