映射是定義文檔及其包含的字段如何存儲和索引的過程,例如,使用映射來定義:app
每一個索引都有一個映射類型,它決定文檔將如何被索引。code
映射類型具備:orm
元字段對象
_index
、_type
、_id
和_source
字段。字段或屬性排序
每一個字段都有一個數據type
:索引
text
、keyword
、date
、long
、double
、boolean
或ip
。object
或nested
。geo_point
、geo_shape
或completion
這樣的特殊類型。爲不一樣的目的以不一樣的方式索引相同的字段一般是有用的,例如,字符串字段能夠做爲全文搜索的text
字段索引,也能夠做爲排序或聚合的keyword
字段索引,或者,你可使用標準分析器、英語分析器和法語分析器索引字符串字段。ip
這就是多字段的目的,大多數數據類型經過fields
參數支持多字段。內存
在索引中定義太多字段會致使映射爆炸,這會致使內存不足和難以恢復的狀況,這個問題可能比預期的要廣泛。例如,考慮這樣一種狀況,其中插入的每一個新文檔都引入了新字段,這在動態映射中很是常見,每當文檔包含新字段時,這些字段就會出如今索引的映射中。這對於少許數據來講並不使人擔憂,可是隨着映射的增加,這可能會成爲一個問題,如下設置容許你限制能夠手動或動態建立的字段映射的數量,以防止錯誤的文檔致使映射爆炸:文檔
index.mapping.total_fields.limit字符串
1000
。index.mapping.depth.limit
1
,若是有一個對象映射,則深度爲2
,依此類推,默認值是20
。index.mapping.nested_fields.limit
50
。index.mapping.nested_objects.limit
10000
。index.mapping.field_name_length.limit
Long.MAX_VALUE
(沒有限制),這個設置實際上並無解決映射爆炸的問題,可是若是你想限制字段長度,那麼它仍然是有用的,一般不須要設置這個設置,默認值沒有問題,除非用戶開始添加大量具備很是長的名稱的字段。字段和映射類型在使用以前不須要定義,多虧了動態映射,新的字段名將自動添加,只需索引文檔,能夠向頂級映射類型、內部對象和嵌套字段添加新字段。
能夠配置動態映射規則來定製用於新字段的映射。
你對數據的瞭解超過了Elasticsearch所能猜到的,所以,儘管開始動態映射可能頗有用,但在某個時候,你可能但願指定本身的顯式映射。
你能夠在建立索引時建立字段映射,還可使用PUT mapping
API將字段添加到現有索引中。
除非有文檔記錄,不然沒法更新現有字段映射,更改映射將意味着已經索引的文檔無效。相反,應該使用正確的映射建立一個新索引,並將數據從新索引到該索引中,若是隻但願重命名字段而不更改其映射,那麼引入別名字段多是有意義的。
能夠在建立索引時指定映射,以下所示:
PUT my_index { "mappings": { "properties": { "title": { "type": "text" }, "name": { "type": "text" }, "age": { "type": "integer" }, "created": { "type": "date", "format": "strict_date_optional_time||epoch_millis" } } } }
my_index
的索引。title
字段包含text
值。name
字段包含text
值。age
字段包含integer
值。created
字段包含兩種可能格式的date
值。