動的フィールドマッピング
Elasticsearchがドキュメント内の新しいフィールドを検出すると、デフォルトでそのフィールドをタイプマッピングに動的に追加します。 dynamic
パラメータはこの動作を制御します。
dynamic
パラメータを true
または runtime
に設定することで、Elasticsearchに受信したドキュメントに基づいてフィールドを動的に作成するよう明示的に指示できます。動的フィールドマッピングが有効になっている場合、Elasticsearchは以下の表のルールを使用して、各フィールドのデータタイプをマッピングする方法を決定します。
以下の表のフィールドデータタイプは、Elasticsearchが動的に検出する唯一の フィールドデータタイプ です。他のすべてのデータタイプは明示的にマッピングする必要があります。
Elasticsearchデータタイプ | ||
JSONデータタイプ | "dynamic":"true" |
"dynamic":"runtime" |
null |
フィールドは追加されません | フィールドは追加されません |
true または false |
boolean |
boolean |
double |
float |
double |
long |
long |
long |
object |
object |
フィールドは追加されません |
array |
配列内の最初の非-null 値に依存します |
配列内の最初の非-null 値に依存します |
string 日付検出 を通過する |
date |
date |
string 数値検出 を通過する |
float または long |
double または long |
string date 検出または numeric 検出を通過しない |
text と .keyword サブフィールドを持つ |
keyword |
動的マッピングは、ドキュメントレベルおよび object
レベルの両方で無効にできます。 dynamic
パラメータを false
に設定すると、新しいフィールドが無視され、strict
はElasticsearchが未知のフィールドに遭遇した場合にドキュメントを拒否します。
既存のフィールドの dynamic
設定を更新するには、マッピング更新API を使用します。
日付検出 および 数値検出 のための動的フィールドマッピングルールをカスタマイズできます。追加の動的フィールドに適用できるカスタムマッピングルールを定義するには、dynamic_templates
を使用します。
日付検出
もし date_detection
が有効になっている場合(デフォルト)、新しい文字列フィールドはその内容が dynamic_date_formats
に指定された日付パターンのいずれかに一致するかどうかを確認されます。一致が見つかると、対応するフォーマットで新しい date
フィールドが追加されます。
dynamic_date_formats
のデフォルト値は次のとおりです:
[ "strict_date_optional_time"
,"yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"
]
例えば:
Python
resp = client.index(
index="my-index-000001",
id="1",
document={
"create_date": "2015/09/02"
},
)
print(resp)
resp1 = client.indices.get_mapping(
index="my-index-000001",
)
print(resp1)
Ruby
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
create_date: '2015/09/02'
}
)
puts response
response = client.indices.get_mapping(
index: 'my-index-000001'
)
puts response
Js
const response = await client.index({
index: "my-index-000001",
id: 1,
document: {
create_date: "2015/09/02",
},
});
console.log(response);
const response1 = await client.indices.getMapping({
index: "my-index-000001",
});
console.log(response1);
コンソール
PUT my-index-000001/_doc/1
{
"create_date": "2015/09/02"
}
GET my-index-000001/_mapping
create_date フィールドは date として追加されました。フィールドは format です:`````”yyyy/MM/dd HH:mm:ss Z |
yyyy/MM/dd Z”`````. |
日付検出の無効化
動的日付検出は、date_detection
を false
に設定することで無効にできます:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"date_detection": False
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"create_date": "2015/09/02"
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
date_detection: false
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
create_date: '2015/09/02'
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
date_detection: false,
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
create_date: "2015/09/02",
},
});
console.log(response1);
コンソール
PUT my-index-000001
{
"mappings": {
"date_detection": false
}
}
PUT my-index-000001/_doc/1
{
"create_date": "2015/09/02"
}
create_date フィールドは text フィールドとして追加されました。 |
検出された日付フォーマットのカスタマイズ
また、dynamic_date_formats
をカスタマイズして独自の 日付フォーマット をサポートすることができます:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"dynamic_date_formats": [
"MM/dd/yyyy"
]
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"create_date": "09/25/2015"
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
dynamic_date_formats: [
'MM/dd/yyyy'
]
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
create_date: '09/25/2015'
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
dynamic_date_formats: ["MM/dd/yyyy"],
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
create_date: "09/25/2015",
},
});
console.log(response1);
コンソール
PUT my-index-000001
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
PUT my-index-000001/_doc/1
{
"create_date": "09/25/2015"
}
日付パターンの配列を構成することと、||
で区切られた単一の文字列に複数のパターンを構成することには違いがあります。日付パターンの配列を構成すると、マッピングされていない日付フィールドを持つ最初のドキュメントの日付に一致するパターンが、そのフィールドのマッピングを決定します:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"dynamic_date_formats": [
"yyyy/MM",
"MM/dd/yyyy"
]
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"create_date": "09/25/2015"
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
dynamic_date_formats: [
'yyyy/MM',
'MM/dd/yyyy'
]
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
create_date: '09/25/2015'
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
dynamic_date_formats: ["yyyy/MM", "MM/dd/yyyy"],
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
create_date: "09/25/2015",
},
});
console.log(response1);
コンソール
PUT my-index-000001
{
"mappings": {
"dynamic_date_formats": [ "yyyy/MM", "MM/dd/yyyy"]
}
}
PUT my-index-000001/_doc/1
{
"create_date": "09/25/2015"
}
コンソール-結果
{
"my-index-000001": {
"mappings": {
"dynamic_date_formats": [
"yyyy/MM",
"MM/dd/yyyy"
],
"properties": {
"create_date": {
"type": "date",
"format": "MM/dd/yyyy"
}
}
}
}
}
||
で区切られた単一の文字列に複数のパターンを構成すると、任意の日付フォーマットをサポートするマッピングが生成されます。これにより、異なるフォーマットを使用するドキュメントをインデックスすることができます:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"dynamic_date_formats": [
"yyyy/MM||MM/dd/yyyy"
]
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"create_date": "09/25/2015"
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
dynamic_date_formats: [
'yyyy/MM||MM/dd/yyyy'
]
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
create_date: '09/25/2015'
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
dynamic_date_formats: ["yyyy/MM||MM/dd/yyyy"],
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
create_date: "09/25/2015",
},
});
console.log(response1);
コンソール
PUT my-index-000001
{
"mappings": {
"dynamic_date_formats": [ "yyyy/MM||MM/dd/yyyy"]
}
}
PUT my-index-000001/_doc/1
{
"create_date": "09/25/2015"
}
コンソール-結果
{
"my-index-000001": {
"mappings": {
"dynamic_date_formats": [
"yyyy/MM||MM/dd/yyyy"
],
"properties": {
"create_date": {
"type": "date",
"format": "yyyy/MM||MM/dd/yyyy"
}
}
}
}
}
エポックフォーマット(epoch_millis
と epoch_second
)は、動的日付フォーマットとしてサポートされていません。
数値検出
JSONはネイティブの浮動小数点および整数データタイプをサポートしていますが、一部のアプリケーションや言語では、数値が文字列としてレンダリングされることがあります。通常、正しい解決策はこれらのフィールドを明示的にマッピングすることですが、数値検出(デフォルトでは無効)は自動的にこれを行うために有効にできます:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"numeric_detection": True
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"my_float": "1.0",
"my_integer": "1"
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
numeric_detection: true
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
my_float: '1.0',
my_integer: '1'
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
numeric_detection: true,
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
my_float: "1.0",
my_integer: "1",
},
});
console.log(response1);
コンソール
PUT my-index-000001
{
"mappings": {
"numeric_detection": true
}
}
PUT my-index-000001/_doc/1
{
"my_float": "1.0",
"my_integer": "1"
}
my_float フィールドは float フィールドとして追加されます。 |
|
my_integer フィールドは long フィールドとして追加されます。 |