Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Руководство [8.17] ›Отображение ›Параметры отображения

dynamic

При индексировании документа, содержащего новое поле, Elasticsearch динамически добавляет поле в документ или во внутренние объекты документа. Следующий документ добавляет строковое поле username, объектное поле name и два строковых поля внутри объекта name:

resp = client.index(
    index="my-index-000001",
    id="1",
    document={
        "username": "johnsmith",
        "name": {
            "first": "John",
            "last": "Smith"
        }
    },
)
print(resp)

resp1 = client.indices.get_mapping(
    index="my-index-000001",
)
print(resp1)
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
const response = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    username: "johnsmith",
    name: {
      first: "John",
      last: "Smith",
    },
  },
});
console.log(response);

const response1 = await client.indices.getMapping({
  index: "my-index-000001",
});
console.log(response1);
PUT my-index-000001/_doc/1
{
  "username": "johnsmith",
  "name": { 
    "first": "John",
    "last": "Smith"
  }
}

GET my-index-000001/_mapping 

Обратитесь к полям внутри объекта name как к полям name.first и name.last.

Проверьте отображение, чтобы увидеть изменения.

Следующий документ добавляет два строковых поля: email и name.middle:

resp = client.index(
    index="my-index-000001",
    id="2",
    document={
        "username": "marywhite",
        "email": "mary@white.com",
        "name": {
            "first": "Mary",
            "middle": "Alice",
            "last": "White"
        }
    },
)
print(resp)

resp1 = client.indices.get_mapping(
    index="my-index-000001",
)
print(resp1)
response = client.index(
  index: 'my-index-000001',
  id: 2,
  body: {
    username: 'marywhite',
    email: 'mary@white.com',
    name: {
      first: 'Mary',
      middle: 'Alice',
      last: 'White'
    }
  }
)
puts response

response = client.indices.get_mapping(
  index: 'my-index-000001'
)
puts response
const response = await client.index({
  index: "my-index-000001",
  id: 2,
  document: {
    username: "marywhite",
    email: "mary@white.com",
    name: {
      first: "Mary",
      middle: "Alice",
      last: "White",
    },
  },
});
console.log(response);

const response1 = await client.indices.getMapping({
  index: "my-index-000001",
});
console.log(response1);
PUT my-index-000001/_doc/2
{
  "username": "marywhite",
  "email": "mary@white.com",
  "name": {
    "first": "Mary",
    "middle": "Alice",
    "last": "White"
  }
}

GET my-index-000001/_mapping

Настройка dynamic для вложенных объектов

Вложенные объекты наследуют настройку dynamic от родительского объекта. В приведенном ниже примере динамическое отображение отключено на уровне типа, поэтому новые поля верхнего уровня не будут добавляться динамически.

Однако объект user.social_networks включает динамическое отображение, поэтому вы можете добавлять поля в этот вложенный объект.

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "dynamic": False,
        "properties": {
            "user": {
                "properties": {
                    "name": {
                        "type": "text"
                    },
                    "social_networks": {
                        "dynamic": True,
                        "properties": {}
                    }
                }
            }
        }
    },
)
print(resp)
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
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    dynamic: false,
    properties: {
      user: {
        properties: {
          name: {
            type: "text",
          },
          social_networks: {
            dynamic: true,
            properties: {},
          },
        },
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "dynamic": false, 
    "properties": {
      "user": { 
        "properties": {
          "name": {
            "type": "text"
          },
          "social_networks": {
            "dynamic": true, 
            "properties": {}
          }
        }
      }
    }
  }
}

Отключает динамическое отображение на уровне типа.

Объект user наследует настройку на уровне типа.

Включает динамическое отображение для этого внутреннего объекта.

Параметры для dynamic

Параметр dynamic управляет тем, добавляются ли новые поля динамически, и принимает следующие параметры:

true

Новые поля добавляются в отображение (по умолчанию).

runtime

Новые поля добавляются в отображение как поля runtime. Эти поля не индексируются и загружаются из _source во время запроса.

false

Новые поля игнорируются. Эти поля не будут индексироваться или проверяться, но всё равно будут появляться в поле _source возвращённых результатов. Эти поля не будут добавляться в отображение, и новые поля необходимо добавлять явно.

strict

Если новые поля обнаруживаются, генерируется исключение, и документ отклоняется. Новые поля должны быть явно добавлены в отображение.

Поведение при достижении лимита полей

Установка dynamic в true или runtime добавит динамические поля до тех пор, пока не будет достигнут index.mapping.total_fields.limit. По умолчанию запросы индексации документов, превышающих лимит полей, завершатся ошибкой, если index.mapping.total_fields.ignore_dynamic_beyond_limit не установлен в true. В этом случае игнорируемые поля добавляются в _ignored поле метаданных.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/dynamic.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API