dynamic编辑

当您索引包含新字段的文档时,Elasticsearch 会将该字段动态添加到文档或文档内的内部对象。以下文档添加了字符串字段 username、对象字段 name 以及 name 对象下的两个字符串字段

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    username: 'johnsmith',
    name: {
      first: 'John',
      last: 'Smith'
    }
  }
)
puts response

response = client.indices.get_mapping(
  index: 'my-index-000001'
)
puts response
PUT my-index-000001/_doc/1
{
  "username": "johnsmith",
  "name": { 
    "first": "John",
    "last": "Smith"
  }
}

GET my-index-000001/_mapping 

name 对象下的字段称为 name.firstname.last

检查映射以查看更改。

以下文档添加了两个字符串字段:emailname.middle

response = client.index(
  index: 'my-index-000001',
  id: 2,
  body: {
    username: 'marywhite',
    email: '[email protected]',
    name: {
      first: 'Mary',
      middle: 'Alice',
      last: 'White'
    }
  }
)
puts response

response = client.indices.get_mapping(
  index: 'my-index-000001'
)
puts response
PUT my-index-000001/_doc/2
{
  "username": "marywhite",
  "email": "[email protected]",
  "name": {
    "first": "Mary",
    "middle": "Alice",
    "last": "White"
  }
}

GET my-index-000001/_mapping

在内部对象上设置 dynamic编辑

内部对象从其父对象继承 dynamic 设置。在以下示例中,在类型级别禁用了动态映射,因此不会动态添加新的顶级字段。

但是,user.social_networks 对象启用了动态映射,因此您可以向此内部对象添加字段。

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      dynamic: false,
      properties: {
        user: {
          properties: {
            name: {
              type: 'text'
            },
            social_networks: {
              dynamic: true,
              properties: {}
            }
          }
        }
      }
    }
  }
)
puts response
PUT my-index-000001
{
  "mappings": {
    "dynamic": false, 
    "properties": {
      "user": { 
        "properties": {
          "name": {
            "type": "text"
          },
          "social_networks": {
            "dynamic": true, 
            "properties": {}
          }
        }
      }
    }
  }
}

在类型级别禁用动态映射。

user 对象继承类型级别的设置。

为此内部对象启用动态映射。

dynamic 的参数编辑

dynamic 参数控制是否动态添加新字段,并接受以下参数

true

新字段将添加到映射中(默认)。

runtime

新字段作为运行时字段添加到映射中。这些字段未编入索引,并且在查询时从 _source 加载。

false

新字段将被忽略。这些字段将不会被索引或搜索,但仍将出现在返回结果的 _source 字段中。这些字段不会添加到映射中,必须显式添加新字段。

strict

如果检测到新字段,则会抛出异常并拒绝该文档。必须将新字段显式添加到映射中。

达到字段限制时的行为编辑

dynamic 设置为 trueruntime 只会添加动态字段,直到达到 index.mapping.total_fields.limit。默认情况下,索引请求中包含超过字段限制的文档将会失败,除非将 index.mapping.total_fields.ignore_dynamic_beyond_limit 设置为 true。在这种情况下,被忽略的字段将添加到 _ignored 元数据字段 中。