https://www.elastic.co/guide/cn/elasticsearch/guide/current/dynamic-mapping.html#dynamic-mapping
當 Elasticsearch 遇到文檔中以前 未遇到的字段,它用 dynamic mapping 來確定字段的數據類型並自動把新的字段添加到類型映射。
有時這是想要的行為有時又不希望這樣。通常沒有人知道以后會有什么新字段加到文檔,但是又希望這些字段被自動的索引。也許你只想忽略它們。如果Elasticsearch是作為重要的數據存儲,可能就會期望遇到新字段就會拋出異常,這樣能及時發現問題。
幸運的是可以用 dynamic 配置來控制這種行為 ,可接受的選項如下:
true 動態添加新的字段--缺省
false 忽略新的字段,不會添加字段映射,但是會存在於_source中
strict 如果遇到新字段拋出異常
配置參數 dynamic 可以用在根 object 或任何 object 類型的字段上。你可以將 dynamic 的默認值設置為 strict , 而只在指定的內部對象中開啟它, 例如:
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic": "strict",
"properties": {
"title": { "type": "string"},
"stash": {
"type": "object",
"dynamic": true
}
}
}
}
}
如果遇到新字段,對象 my_type 就會拋出異常。而內部對象 stash 遇到新字段就會動態創建新字段。
使用上述動態映射, 你可以給 stash 對象添加新的可檢索的字段:
PUT /my_index/my_type/1
{
"title": "This doc adds a new field",
"stash": { "new_field": "Success!" }
}
但是對根節點對象 my_type 進行同樣的操作會失敗:
PUT /my_index/my_type/1
{
"title": "This throws a StrictDynamicMappingException",
"new_field": "Fail!"
}
把 dynamic 設置為 false 一點兒也不會改變 _source 的字段內容。 _source 仍然包含被索引的整個JSON文檔。只是新的字段不會被加到映射中也不可搜索。
缺省映射
通常,一個索引中的所有類型共享相同的字段和設置。 _default_ 映射更加方便地指定通用設置,而不是每次創建新類型時都要重復設置。 _default_ 映射是新類型的模板。在設置 _default_ 映射之后創建的所有類型都將應用這些缺省的設置,除非類型在自己的映射中明確覆蓋這些設置。
例如,我們可以使用 _default_ 映射為所有的類型禁用 _all 字段, 而只在 blog 類型啟用:
PUT /my_index
{
"mappings": {
"_default_": {
"_all": { "enabled": false }
},
"blog": {
"_all": { "enabled": true }
}
}
}