dynamic(动态设置)

原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/5.3/dynamic.html

译文链接 : http://www.apache.wiki/pages/createpage-entervariables.action?templateId=4816898&spaceKey=Elasticsearch&title=&newSpaceKey=Elasticsearch&fromPageId=9405287

贡献者 : @您的名字,ApacheCNApache中文网

默认情况下,字段会动态的添加到 document 或者 document inner objects(内部对象),只需要通过索引包含这个新字段的 document。例如:

  1. curl -XPUT 'localhost:9200/my_index/my_type/1?pretty' -H 'Content-Type: application/json' -d' # 1
  2. {
  3. "username": "johnsmith",
  4. "name": {
  5. "first": "John",
  6. "last": "Smith"
  7. }
  8. }
  9. '
  10. curl -XGET 'localhost:9200/my_index/_mapping?pretty' # 2
  11. curl -XPUT 'localhost:9200/my_index/my_type/2?pretty' -H 'Content-Type: application/json' -d' # 3
  12. {
  13. "username": "marywhite",
  14. "email": "mary@white.com",
  15. "name": {
  16. "first": "Mary",
  17. "middle": "Alice",
  18. "last": "White"
  19. }
  20. }
  21. '
  22. curl -XGET 'localhost:9200/my_index/_mapping?pretty' # 4

| 1 | 这个文档介绍了字符串字段 username ,对象字段name,和两个在 name 对象下的字符串字段 ,可以称为 name.firstname.last。 | | 2 | 检查映射来验证上面的 PUT。 | | 3 | 这个文档添加两个字符串字段 emailname.middle。 | | 4 | 检查映射来验证上面的改动. |

新字段如何被检测和添加到映射的细节可以见 Dynamic Mapping.

dynamic 设置控制着新的字段是否可以动态的添加.有三个配置参数:

| true | 新检测的字段被添加到映射中.(默认配置) | | false | 新检测的字段将被忽略。 必须明确添加新字段。 | | strict | 如果检测到新字段,将抛出异常并且文档是拒绝的。 |

dynamic 可以在映射类型级别和每个inner object(内部对象)进行设置。 inner object(内部对象)继承其父对象和来自于映射类型的设置. 例如 :

  1. curl -XPUT 'localhost:9200/my_index?pretty' -H 'Content-Type: application/json' -d'
  2. {
  3. "mappings": {
  4. "my_type": {
  5. "dynamic": false, # 1
  6. "properties": {
  7. "user": { # 2
  8. "properties": {
  9. "name": {
  10. "type": "text"
  11. },
  12. "social_networks": { # 3
  13. "dynamic": true,
  14. "properties": {}
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }
  22. '

| 1 | dynamic mapping(动态映射)在类型级别被禁用,所以不会有新的顶级字段动态添加. | | 2 | user 对象继承类型级别设置. | | 3 | user.social_networks 对象允许动态映射,因此可以将新字段添加到该 inner object (内部对象)。 |

建议

dynamic 设置允许在同一索引中相同名称的字段的有不同设置。 可以使用 PUT mapping API(PUT映射API)在现有字段上更新字段的值。