ES遇到文档中未遇到的字段,会用dynamic mapping来确定字段的数据类型并自动把新的字段添加到类型映射。

    通常我们不知道会添加什么新字段。但又希望这些字段被自动索引。如果ES是作为重要的数据存储,可能就会期望遇到新字段就会抛出异常,这样能及时发现问题。

    dynamic配置来控制这种行为,可以接受的选项如下:

    • true: 动态添加新的字段-缺省值
    • false:忽略新字段
    • strict:如果遇到新字段抛出异常

    配置参数dynamic可以用在根object或任何object类型的字段上。你可以将dynamic的默认值为strict,而旨在指定的内部对象中开其他:

    1. PUT /my_index
    2. {
    3. "mappings:" {
    4. "dynamic":"strict",
    5. "properties": {
    6. "title": {"type": "text"},
    7. "stash": {
    8. "type":"object",
    9. "dynamic":true,
    10. }
    11. }
    12. }
    13. }

    如果遇到新字段,对象 my_type 就会抛出异常。 内部对象stash遇到新字段会动态创建新字段

    使用上述动态映射,你可以给stash对象添加新的可检索的字段:

    1. PUT /my_index/_doc/1
    2. {
    3. "title": "This doc adds a new field",
    4. "stash": { "new_field": "Success!" }
    5. }

    但是对根节点对象 my_type 进行同样的操作会失败:

    1. PUT /my_index/_doc/1
    2. {
    3. "title": "This throws a StrictDynamicMappingException",
    4. "new_field": "Fail!"
    5. }