サブオブジェクト
ドキュメントをインデックス化したりマッピングを更新したりする際、Elasticsearchは名前にドットを含むフィールドを受け入れ、それが対応するオブジェクト構造に展開されます。たとえば、フィールド metrics.time.max
は、親 time
オブジェクトに属する max
リーフフィールドとしてマッピングされます。
説明されたデフォルトの動作はほとんどのシナリオに対して合理的ですが、たとえばフィールド metrics.time
が値を保持する場合など、特定の状況では問題を引き起こします。これはメトリクスデータをインデックス化する際によく見られます。metrics.time.max
と metrics.time
の両方の値を持つドキュメントは、time
がリーフフィールドであり、max
サブフィールドを保持するオブジェクトである必要があるため、拒否されます。
subobjects
設定は、トップレベルのマッピング定義と object
フィールドにのみ適用でき、オブジェクトがさらにサブオブジェクトを保持する能力を無効にし、フィールド名にドットを含むドキュメントを保存できるようにします。上記の例から、オブジェクトコンテナ metrics
が subobjects
を false
に設定している場合、フィールド名にドットが保持されるため、time
と time.max
の両方の値を中間オブジェクトなしで直接保持できます。
Python
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)
Ruby
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
Js
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"
}
}
}
}
}
}
}
metrics フィールドは他のオブジェクトを保持できません。 |
|
フラットパスを保持するサンプルドキュメント | |
サブオブジェクトを保持しないように構成されたオブジェクトとそのリーフサブフィールドを保持するサンプルドキュメント | |
フィールド名のドットが保持された結果のマッピング |
全体のマッピングもサブオブジェクトをサポートしないように構成でき、その場合、ドキュメントはリーフサブフィールドのみを保持できます:
Python
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)
Ruby
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
Js
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
に明示的に設定されてはなりません。
Python
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)
Ruby
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
コンソール
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"
}
}
}
}
}
}
}
メトリクスオブジェクトは、さらにオブジェクトマッピングを含むことができ、自動的にフラット化されます。 オブジェクトマッピングは、このレベルで上記のように特定のマッピングパラメータを設定してはなりません。 |
|
このフィールドは、マッピングが保存される前に "time.min" に自動的にフラット化されます。 |
|
自動フラット化された "time.min" フィールドは、インデックスマッピングを確認することで検査できます。 |