強制変換
データは常にクリーンではありません。生成方法によっては、数値がJSONボディ内で真のJSON数値として表示されることがあります。例えば、5
ですが、文字列として表示されることもあります。例えば、"5"
。あるいは、整数であるべき数値が浮動小数点数として表示されることもあります。例えば、5.0
、または"5.0"
。
強制変換は、フィールドのデータ型に合わせて不正な値をクリーンアップしようとします。例えば:
- 文字列は数値に強制変換されます。
- 浮動小数点数は整数値のために切り捨てられます。
例えば:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"number_one": {
"type": "integer"
},
"number_two": {
"type": "integer",
"coerce": False
}
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"number_one": "10"
},
)
print(resp1)
resp2 = client.index(
index="my-index-000001",
id="2",
document={
"number_two": "10"
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
number_one: {
type: 'integer'
},
number_two: {
type: 'integer',
coerce: false
}
}
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
number_one: '10'
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 2,
body: {
number_two: '10'
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
number_one: {
type: "integer",
},
number_two: {
type: "integer",
coerce: false,
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
number_one: "10",
},
});
console.log(response1);
const response2 = await client.index({
index: "my-index-000001",
id: 2,
document: {
number_two: "10",
},
});
console.log(response2);
コンソール
PUT my-index-000001
{
"mappings": {
"properties": {
"number_one": {
"type": "integer"
},
"number_two": {
"type": "integer",
"coerce": false
}
}
}
}
PUT my-index-000001/_doc/1
{
"number_one": "10"
}
PUT my-index-000001/_doc/2
{
"number_two": "10"
}
number_one フィールドには整数 10 が含まれます。 |
|
このドキュメントは強制変換が無効なため拒否されます。 |
coerce
設定値は、マッピング更新APIを使用して既存のフィールドで更新できます。
インデックスレベルのデフォルト
index.mapping.coerce
設定は、すべてのマッピングタイプに対して強制変換をグローバルに無効にするためにインデックスレベルで設定できます:
Python
resp = client.indices.create(
index="my-index-000001",
settings={
"index.mapping.coerce": False
},
mappings={
"properties": {
"number_one": {
"type": "integer",
"coerce": True
},
"number_two": {
"type": "integer"
}
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"number_one": "10"
},
)
print(resp1)
resp2 = client.index(
index="my-index-000001",
id="2",
document={
"number_two": "10"
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
'index.mapping.coerce' => false
},
mappings: {
properties: {
number_one: {
type: 'integer',
coerce: true
},
number_two: {
type: 'integer'
}
}
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
number_one: '10'
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 2,
body: {
number_two: '10'
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
settings: {
"index.mapping.coerce": false,
},
mappings: {
properties: {
number_one: {
type: "integer",
coerce: true,
},
number_two: {
type: "integer",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
number_one: "10",
},
});
console.log(response1);
const response2 = await client.index({
index: "my-index-000001",
id: 2,
document: {
number_two: "10",
},
});
console.log(response2);
コンソール
PUT my-index-000001
{
"settings": {
"index.mapping.coerce": false
},
"mappings": {
"properties": {
"number_one": {
"type": "integer",
"coerce": true
},
"number_two": {
"type": "integer"
}
}
}
}
PUT my-index-000001/_doc/1
{ "number_one": "10" }
PUT my-index-000001/_doc/2
{ "number_two": "10" }
number_one フィールドはインデックスレベルの設定を上書きして強制変換を有効にします。 |
|
このドキュメントは、number_two フィールドがインデックスレベルの強制変換設定を継承しているため拒否されます。 |