原文地址: https://www.elastic.co/guide/cn/elasticsearch/guide/current/dynamic-mapping.html, 版权归 www.elastic.co 所有
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/dynamic-mapping.html
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/dynamic-mapping.html
请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
动态映射edit
当 Elasticsearch 遇到文档中以前 未遇到的字段,它用 dynamic mapping 来确定字段的数据类型并自动把新的字段添加到类型映射。
有时这是想要的行为有时又不希望这样。通常没有人知道以后会有什么新字段加到文档,但是又希望这些字段被自动的索引。也许你只想忽略它们。如果Elasticsearch是作为重要的数据存储,可能就会期望遇到新字段就会抛出异常,这样能及时发现问题。
幸运的是可以用 dynamic
配置来控制这种行为 ,可接受的选项如下:
-
true
- 动态添加新的字段—缺省
-
false
- 忽略新的字段
-
strict
- 如果遇到新字段抛出异常
配置参数 dynamic
可以用在根 object
或任何 object
类型的字段上。你可以将 dynamic
的默认值设置为 strict
, 而只在指定的内部对象中开启它, 例如:
PUT /my_index { "mappings": { "my_type": { "dynamic": "strict", "properties": { "title": { "type": "string"}, "stash": { "type": "object", "dynamic": true } } } } }
使用上述动态映射, 你可以给 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文档。只是新的字段不会被加到映射中也不可搜索。