Вложенные объекты
При индексировании документа или обновлении отображения Elasticsearch принимает поля с точками в именах, которые расширяются до соответствующей структуры объекта. Например, поле metrics.time.max отображается как поле max уровня с родительским объектом time, относящимся к родительскому объекту metrics.
Это стандартное поведение приемлемо для большинства сценариев, но вызывает проблемы в некоторых ситуациях, например, когда поле metrics.time также содержит значение, что часто встречается при индексировании метрических данных. Документ, содержащий значение для metrics.time.max и metrics.time, отклоняется, поскольку time должно быть полем уровня для хранения значения, а также объектом для хранения вложенного поля max.
Настройка subobjects, которую можно применять только к определению отображения верхнего уровня и к полям типа object, отключает возможность для объекта содержать дополнительные вложенные объекты и позволяет хранить документы, где имена полей содержат точки и общие префиксы. Из примера выше, если контейнер объекта metrics имеет настройку subobjects, установленную в значение false, он может содержать значения для time и time.max напрямую без необходимости промежуточного объекта, так как точки в именах полей сохраняются.
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"metrics": {
"type": "object",
"subobjects": False,
"properties": {
"time": {
"type": "long"
},
"time.min": {
"type": "long"
},
"time.max": {
"type": "long"
}
}
}
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="metric_1",
document={
"metrics.time": 100,
"metrics.time.min": 10,
"metrics.time.max": 900
},
)
print(resp1)
resp2 = client.index(
index="my-index-000001",
id="metric_2",
document={
"metrics": {
"time": 100,
"time.min": 10,
"time.max": 900
}
},
)
print(resp2)
resp3 = client.indices.get_mapping(
index="my-index-000001",
)
print(resp3) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
metrics: {
type: 'object',
subobjects: false,
properties: {
time: {
type: 'long'
},
'time.min' => {
type: 'long'
},
'time.max' => {
type: 'long'
}
}
}
}
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'metric_1',
body: {
'metrics.time' => 100,
'metrics.time.min' => 10,
'metrics.time.max' => 900
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'metric_2',
body: {
metrics: {
time: 100,
'time.min' => 10,
'time.max' => 900
}
}
)
puts response
response = client.indices.get_mapping(
index: 'my-index-000001'
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
metrics: {
type: "object",
subobjects: false,
properties: {
time: {
type: "long",
},
"time.min": {
type: "long",
},
"time.max": {
type: "long",
},
},
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: "metric_1",
document: {
"metrics.time": 100,
"metrics.time.min": 10,
"metrics.time.max": 900,
},
});
console.log(response1);
const response2 = await client.index({
index: "my-index-000001",
id: "metric_2",
document: {
metrics: {
time: 100,
"time.min": 10,
"time.max": 900,
},
},
});
console.log(response2);
const response3 = await client.indices.getMapping({
index: "my-index-000001",
});
console.log(response3); PUT my-index-000001
{
"mappings": {
"properties": {
"metrics": {
"type": "object",
"subobjects": false,
"properties": {
"time": { "type": "long" },
"time.min": { "type": "long" },
"time.max": { "type": "long" }
}
}
}
}
}
PUT my-index-000001/_doc/metric_1
{
"metrics.time" : 100,
"metrics.time.min" : 10,
"metrics.time.max" : 900
}
PUT my-index-000001/_doc/metric_2
{
"metrics" : {
"time" : 100,
"time.min" : 10,
"time.max" : 900
}
}
GET my-index-000001/_mapping {
"my-index-000001" : {
"mappings" : {
"properties" : {
"metrics" : {
"subobjects" : false,
"properties" : {
"time" : {
"type" : "long"
},
"time.min" : {
"type" : "long"
},
"time.max" : {
"type" : "long"
}
}
}
}
}
}
} | Поле | |
| Пример документа, содержащего плоские пути | |
| Пример документа, содержащего объект (настроенный так, чтобы не содержать вложенных объектов) и его поля-листья | |
| Результирующее отображение, где точки в именах полей сохранились |
Все отображение может быть настроено так, чтобы не поддерживать вложенные объекты, в этом случае документ может содержать только поля-листья:
resp = client.indices.create(
index="my-index-000001",
mappings={
"subobjects": False
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="metric_1",
document={
"time": "100ms",
"time.min": "10ms",
"time.max": "900ms"
},
)
print(resp1) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
subobjects: false
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'metric_1',
body: {
time: '100ms',
'time.min' => '10ms',
'time.max' => '900ms'
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
subobjects: false,
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: "metric_1",
document: {
time: "100ms",
"time.min": "10ms",
"time.max": "900ms",
},
});
console.log(response1); PUT my-index-000001
{
"mappings": {
"subobjects": false
}
}
PUT my-index-000001/_doc/metric_1
{
"time" : "100ms",
"time.min" : "10ms",
"time.max" : "900ms"
} | Все отображение настроено так, чтобы не поддерживать объекты. | |
| Документ не поддерживает объекты |
Настройка subobjects для существующих полей и определения отображения верхнего уровня не может быть обновлена.
Автоматическое сплющивание отображений объектов
В целом рекомендуется определять свойства объекта, настроенного с помощью параметра subobjects: false, с именами полей через точки (как показано в первом примере). Однако также возможно определить эти свойства как вложенные объекты в отображении. В этом случае отображение будет автоматически сплющено перед сохранением. Это упрощает повторное использование существующих отображений без необходимости переписывания.
Обратите внимание, что автоматическое сплющивание не будет работать, если заданы определенные параметры отображения для отображений объектов, определенных в объекте, настроенном с параметром subobjects: false:
- Параметр отображения
enabledне должен бытьfalse. - Параметр отображения
dynamicне должен противоречить неявным или явным значениям родителя. Например, когдаdynamicустанавливается в значениеfalseв корне отображения, отображения объектов, устанавливающиеdynamicв значениеtrue, не могут быть автоматически сплющены. - Параметр отображения
subobjectsне должен быть явно установлен в значениеtrue.
resp = client.indices.create(
index="my-index-000002",
mappings={
"properties": {
"metrics": {
"subobjects": False,
"properties": {
"time": {
"type": "object",
"properties": {
"min": {
"type": "long"
},
"max": {
"type": "long"
}
}
}
}
}
}
},
)
print(resp)
resp1 = client.indices.get_mapping(
index="my-index-000002",
)
print(resp1) response = client.indices.create(
index: 'my-index-000002',
body: {
mappings: {
properties: {
metrics: {
subobjects: false,
properties: {
time: {
type: 'object',
properties: {
min: {
type: 'long'
},
max: {
type: 'long'
}
}
}
}
}
}
}
}
)
puts response
response = client.indices.get_mapping(
index: 'my-index-000002'
)
puts response const response = await client.indices.create({
index: "my-index-000002",
mappings: {
properties: {
metrics: {
subobjects: false,
properties: {
time: {
type: "object",
properties: {
min: {
type: "long",
},
max: {
type: "long",
},
},
},
},
},
},
},
});
console.log(response);
const response1 = await client.indices.getMapping({
index: "my-index-000002",
});
console.log(response1); PUT my-index-000002
{
"mappings": {
"properties": {
"metrics": {
"subobjects": false,
"properties": {
"time": {
"type": "object",
"properties": {
"min": { "type": "long" },
"max": { "type": "long" }
}
}
}
}
}
}
}
GET my-index-000002/_mapping {
"my-index-000002" : {
"mappings" : {
"properties" : {
"metrics" : {
"subobjects" : false,
"properties" : {
"time.min" : {
"type" : "long"
},
"time.max" : {
"type" : "long"
}
}
}
}
}
}
} | Объект метрик может содержать дополнительные отображения объектов, которые будут автоматически сплющены. Отображения объектов на этом уровне не должны устанавливать определенные параметры отображения, как описано выше. | |
| Это поле будет автоматически сплющено до значения | |
| Автоматически сплющенное поле |
© 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/subobjects.html