マッピングAPIの更新
既存のデータストリームまたはインデックスに新しいフィールドを追加します。このAPIを使用して、既存のフィールドの検索設定を変更することもできます。
データストリームの場合、これらの変更はデフォルトですべてのバックインデックスに適用されます。
Python
resp = client.indices.put_mapping(
index="my-index-000001",
properties={
"email": {
"type": "keyword"
}
},
)
print(resp)
Ruby
response = client.indices.put_mapping(
index: 'my-index-000001',
body: {
properties: {
email: {
type: 'keyword'
}
}
}
)
puts response
Js
const response = await client.indices.putMapping({
index: "my-index-000001",
properties: {
email: {
type: "keyword",
},
},
});
console.log(response);
Console
PUT /my-index-000001/_mapping
{
"properties": {
"email": {
"type": "keyword"
}
}
}
Request
PUT /<target>/_mapping
前提条件
- Elasticsearchのセキュリティ機能が有効になっている場合、ターゲットデータストリーム、インデックス、またはエイリアスに対して
manage
インデックス権限を持っている必要があります。
[7.9] 7.9で非推奨。リクエストがインデックスまたはインデックスエイリアスを対象とする場合、create
、create_doc
、index
、またはwrite
インデックス権限を使用してそのマッピングを更新することもできます。
パスパラメータ
<target>
- (必須、文字列) リクエストを制限するために使用されるデータストリーム、インデックス、およびエイリアスのカンマ区切りリスト。ワイルドカード(
*
)をサポートします。すべてのデータストリームとインデックスを対象とするには、このパラメータを省略するか、*
または_all
を使用します。
クエリパラメータ
allow_no_indices
- (オプション、ブール値)
false
の場合、リクエストは、ワイルドカード式、インデックスエイリアス、または_all
の値が欠落または閉じたインデックスのみを対象とする場合にエラーを返します。この動作は、リクエストが他のオープンインデックスを対象とする場合でも適用されます。たとえば、foo*,bar*
を対象とするリクエストは、インデックスがfoo
で始まるがbar
で始まるインデックスがない場合にエラーを返します。
デフォルトはfalse
です。 expand_wildcards
- (オプション、文字列) ワイルドカードパターンが一致できるインデックスのタイプ。リクエストがデータストリームを対象とできる場合、この引数はワイルドカード式が隠れたデータストリームに一致するかどうかを決定します。カンマ区切りの値(
open,hidden
など)をサポートします。有効な値は次のとおりです:all
- すべてのデータストリームまたはインデックスに一致し、隠れたものも含まれます。
open
- オープンで非隠れたインデックスに一致します。また、非隠れたデータストリームにも一致します。
closed
- クローズドで非隠れたインデックスに一致します。また、非隠れたデータストリームにも一致します。データストリームはクローズできません。
hidden
- 隠れたデータストリームと隠れたインデックスに一致します。
open
、closed
、またはその両方と組み合わせる必要があります。 none
- ワイルドカードパターンは受け付けられません。
デフォルトはopen
です。
ignore_unavailable
- (オプション、ブール値)
false
の場合、リクエストは欠落またはクローズドインデックスを対象とする場合にエラーを返します。デフォルトはfalse
です。 master_timeout
- (オプション、時間単位) マスターノードを待機する期間。タイムアウトが切れる前にマスターノードが利用できない場合、リクエストは失敗し、エラーを返します。デフォルトは
30s
です。リクエストがタイムアウトしないことを示すために-1
に設定することもできます。 timeout
- (オプション、時間単位) クラスタメタデータを更新した後、クラスタ内のすべての関連ノードからの応答を待機する期間。タイムアウトが切れる前に応答が受信されない場合、クラスタメタデータの更新は適用されますが、応答は完全に承認されなかったことを示します。デフォルトは
30s
です。リクエストがタイムアウトしないことを示すために-1
に設定することもできます。 write_index_only
- (オプション、ブール値)
true
の場合、マッピングはターゲットの現在の書き込みインデックスにのみ適用されます。デフォルトはfalse
です。
リクエストボディ
properties
- (必須、マッピングオブジェクト) フィールドのマッピング。新しいフィールドの場合、このマッピングには次のものが含まれる場合があります:
- フィールド名
- フィールドデータ型
- マッピングパラメータ
既存のフィールドについては、既存のフィールドのマッピングを変更するを参照してください。
例
単一ターゲットの例
マッピングAPIの更新には、既存のデータストリームまたはインデックスが必要です。次のインデックス作成 APIリクエストは、publications
インデックスをマッピングなしで作成します。
Php
$params = [
'index' => 'publications',
];
$response = $client->indices()->create($params);
Python
resp = client.indices.create(
index="publications",
)
print(resp)
Ruby
response = client.indices.create(
index: 'publications'
)
puts response
Go
res, err := es.Indices.Create("publications")
fmt.Println(res, err)
Js
const response = await client.indices.create({
index: "publications",
});
console.log(response);
Console
PUT /publications
次のマッピングAPIの更新リクエストは、title
、新しいtext
フィールドをpublications
インデックスに追加します。
Php
$params = [
'index' => 'publications',
'body' => [
'properties' => [
'title' => [
'type' => 'text',
],
],
],
];
$response = $client->indices()->putMapping($params);
Python
resp = client.indices.put_mapping(
index="publications",
properties={
"title": {
"type": "text"
}
},
)
print(resp)
Ruby
response = client.indices.put_mapping(
index: 'publications',
body: {
properties: {
title: {
type: 'text'
}
}
}
)
puts response
Go
res, err := es.Indices.PutMapping(
[]string{"publications"},
strings.NewReader(`{
"properties": {
"title": {
"type": "text"
}
}
}`),
)
fmt.Println(res, err)
Js
const response = await client.indices.putMapping({
index: "publications",
properties: {
title: {
type: "text",
},
},
});
console.log(response);
Console
PUT /publications/_mapping
{
"properties": {
"title": { "type": "text"}
}
}
複数ターゲット
マッピングAPIは、単一のリクエストで複数のデータストリームまたはインデックスに適用できます。たとえば、my-index-000001
およびmy-index-000002
インデックスのマッピングを同時に更新できます:
Python
resp = client.indices.create(
index="my-index-000001",
)
print(resp)
resp1 = client.indices.create(
index="my-index-000002",
)
print(resp1)
resp2 = client.indices.put_mapping(
index="my-index-000001,my-index-000002",
properties={
"user": {
"properties": {
"name": {
"type": "keyword"
}
}
}
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'my-index-000001'
)
puts response
response = client.indices.create(
index: 'my-index-000002'
)
puts response
response = client.indices.put_mapping(
index: 'my-index-000001,my-index-000002',
body: {
properties: {
user: {
properties: {
name: {
type: 'keyword'
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
});
console.log(response);
const response1 = await client.indices.create({
index: "my-index-000002",
});
console.log(response1);
const response2 = await client.indices.putMapping({
index: "my-index-000001,my-index-000002",
properties: {
user: {
properties: {
name: {
type: "keyword",
},
},
},
},
});
console.log(response2);
Console
# 2つのインデックスを作成
PUT /my-index-000001
PUT /my-index-000002
# 両方のマッピングを更新
PUT /my-index-000001,my-index-000002/_mapping
{
"properties": {
"user": {
"properties": {
"name": {
"type": "keyword"
}
}
}
}
}
既存のオブジェクトフィールドに新しいプロパティを追加
更新マッピングAPIを使用して、既存のobject
フィールドに新しいプロパティを追加できます。これがどのように機能するかを確認するには、次の例を試してください。
name
オブジェクトフィールドと内部[first
]テキストフィールドを持つインデックスを作成するために、インデックス作成 APIを使用します。
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"name": {
"properties": {
"first": {
"type": "text"
}
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
name: {
properties: {
first: {
type: 'text'
}
}
}
}
}
}
)
puts response
Go
res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"name": {
"properties": {
"first": {
"type": "text"
}
}
}
}
}
}`)),
)
fmt.Println(res, err)
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
name: {
properties: {
first: {
type: "text",
},
},
},
},
},
});
console.log(response);
Console
PUT /my-index-000001
{
"mappings": {
"properties": {
"name": {
"properties": {
"first": {
"type": "text"
}
}
}
}
}
}
更新マッピングAPIを使用して、name
フィールドに新しい内部last
テキストフィールドを追加します。
Python
resp = client.indices.put_mapping(
index="my-index-000001",
properties={
"name": {
"properties": {
"last": {
"type": "text"
}
}
}
},
)
print(resp)
Ruby
response = client.indices.put_mapping(
index: 'my-index-000001',
body: {
properties: {
name: {
properties: {
last: {
type: 'text'
}
}
}
}
}
)
puts response
Go
res, err := es.Indices.PutMapping(
[]string{"my-index-000001"},
strings.NewReader(`{
"properties": {
"name": {
"properties": {
"last": {
"type": "text"
}
}
}
}
}`),
)
fmt.Println(res, err)
Js
const response = await client.indices.putMapping({
index: "my-index-000001",
properties: {
name: {
properties: {
last: {
type: "text",
},
},
},
},
});
console.log(response);
Console
PUT /my-index-000001/_mapping
{
"properties": {
"name": {
"properties": {
"last": {
"type": "text"
}
}
}
}
}
既存のフィールドにマルチフィールドを追加
マルチフィールドを使用すると、同じフィールドを異なる方法でインデックスできます。更新マッピングAPIを使用して、fields
マッピングパラメータを更新し、既存のフィールドにマルチフィールドを有効にできます。
インデックス(またはデータストリーム)にドキュメントが含まれている場合、マルチフィールドを追加しても、それらのドキュメントには新しいマルチフィールドの値がありません。新しいマルチフィールドをクエリによる更新APIで埋めることができます。
これがどのように機能するかを確認するには、次の例を試してください。
city
テキストフィールドを持つインデックスを作成するために、インデックス作成 APIを使用します。
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"city": {
"type": "text"
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
city: {
type: 'text'
}
}
}
}
)
puts response
Go
res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"city": {
"type": "text"
}
}
}
}`)),
)
fmt.Println(res, err)
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
city: {
type: "text",
},
},
},
});
console.log(response);
Console
PUT /my-index-000001
{
"mappings": {
"properties": {
"city": {
"type": "text"
}
}
}
}
テキストフィールドはフルテキスト検索に適していますが、キーワードフィールドは分析されず、ソートや集計に適している場合があります。
更新マッピングAPIを使用して、city
フィールドにマルチフィールドを有効にします。このリクエストは、ソートに使用できるcity.raw
キーワードマルチフィールドを追加します。
Python
resp = client.indices.put_mapping(
index="my-index-000001",
properties={
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
},
)
print(resp)
Ruby
response = client.indices.put_mapping(
index: 'my-index-000001',
body: {
properties: {
city: {
type: 'text',
fields: {
raw: {
type: 'keyword'
}
}
}
}
}
)
puts response
Go
res, err := es.Indices.PutMapping(
[]string{"my-index-000001"},
strings.NewReader(`{
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}`),
)
fmt.Println(res, err)
Js
const response = await client.indices.putMapping({
index: "my-index-000001",
properties: {
city: {
type: "text",
fields: {
raw: {
type: "keyword",
},
},
},
},
});
console.log(response);
Console
PUT /my-index-000001/_mapping
{
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
既存のフィールドのサポートされているマッピングパラメータを変更
各ignore_above
パラメータのドキュメントには、更新マッピングAPIを使用して既存のフィールドに対して更新できるかどうかが示されています。たとえば、更新マッピングAPIを使用してignore_above
パラメータを更新できます。
これがどのように機能するかを確認するには、次の例を試してください。
user_id
キーワードフィールドを含むインデックスを作成するために、インデックス作成 APIを使用します。user_id
フィールドはignore_above
パラメータ値が20
です。
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"user_id": {
"type": "keyword",
"ignore_above": 20
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
user_id: {
type: 'keyword',
ignore_above: 20
}
}
}
}
)
puts response
Go
res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"user_id": {
"type": "keyword",
"ignore_above": 20
}
}
}
}`)),
)
fmt.Println(res, err)
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
user_id: {
type: "keyword",
ignore_above: 20,
},
},
},
});
console.log(response);
Console
PUT /my-index-000001
{
"mappings": {
"properties": {
"user_id": {
"type": "keyword",
"ignore_above": 20
}
}
}
}
更新マッピングAPIを使用して、ignore_above
パラメータ値を100
に変更します。
Python
resp = client.indices.put_mapping(
index="my-index-000001",
properties={
"user_id": {
"type": "keyword",
"ignore_above": 100
}
},
)
print(resp)
Ruby
response = client.indices.put_mapping(
index: 'my-index-000001',
body: {
properties: {
user_id: {
type: 'keyword',
ignore_above: 100
}
}
}
)
puts response
Go
res, err := es.Indices.PutMapping(
[]string{"my-index-000001"},
strings.NewReader(`{
"properties": {
"user_id": {
"type": "keyword",
"ignore_above": 100
}
}
}`),
)
fmt.Println(res, err)
Js
const response = await client.indices.putMapping({
index: "my-index-000001",
properties: {
user_id: {
type: "keyword",
ignore_above: 100,
},
},
});
console.log(response);
Console
PUT /my-index-000001/_mapping
{
"properties": {
"user_id": {
"type": "keyword",
"ignore_above": 100
}
}
}
既存のフィールドのマッピングを変更
サポートされているuser_id
を除いて、既存のフィールドのマッピングやフィールドタイプを変更することはできません。既存のフィールドを変更すると、すでにインデックスされたデータが無効になる可能性があります。
データストリームのバックインデックスのフィールドのマッピングを変更する必要がある場合は、データストリームのマッピングと設定を変更するを参照してください。
他のインデックスのフィールドのマッピングを変更する必要がある場合は、正しいマッピングを持つ新しいインデックスを作成し、そのインデックスにデータを再インデックスします。
インデックス内の既存のフィールドのマッピングを変更する方法を確認するには、次の例を試してください。
[user_id
]フィールドを持つインデックスを作成するために、インデックス作成 APIを使用します。long
フィールドタイプを持っています。
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"user_id": {
"type": "long"
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
user_id: {
type: 'long'
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
user_id: {
type: "long",
},
},
},
});
console.log(response);
Console
PUT /my-index-000001
{
"mappings" : {
"properties": {
"user_id": {
"type": "long"
}
}
}
}
[user_id
]フィールド値を持ついくつかのドキュメントをインデックスするために、インデックス APIを使用します。
Python
resp = client.index(
index="my-index-000001",
refresh="wait_for",
document={
"user_id": 12345
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
refresh="wait_for",
document={
"user_id": 12346
},
)
print(resp1)
Ruby
response = client.index(
index: 'my-index-000001',
refresh: 'wait_for',
body: {
user_id: 12_345
}
)
puts response
response = client.index(
index: 'my-index-000001',
refresh: 'wait_for',
body: {
user_id: 12_346
}
)
puts response
Js
const response = await client.index({
index: "my-index-000001",
refresh: "wait_for",
document: {
user_id: 12345,
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
refresh: "wait_for",
document: {
user_id: 12346,
},
});
console.log(response1);
Console
POST /my-index-000001/_doc?refresh=wait_for
{
"user_id" : 12345
}
POST /my-index-000001/_doc?refresh=wait_for
{
"user_id" : 12346
}
[user_id
]フィールドをkeyword
フィールドタイプに変更するには、正しいマッピングを持つ新しいインデックスを作成するために、インデックス作成APIを使用します。
Python
resp = client.indices.create(
index="my-new-index-000001",
mappings={
"properties": {
"user_id": {
"type": "keyword"
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-new-index-000001',
body: {
mappings: {
properties: {
user_id: {
type: 'keyword'
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-new-index-000001",
mappings: {
properties: {
user_id: {
type: "keyword",
},
},
},
});
console.log(response);
Console
PUT /my-new-index-000001
{
"mappings" : {
"properties": {
"user_id": {
"type": "keyword"
}
}
}
}
再インデックス APIを使用して、古いインデックスから新しいインデックスにドキュメントをコピーします。
Python
resp = client.reindex(
source={
"index": "my-index-000001"
},
dest={
"index": "my-new-index-000001"
},
)
print(resp)
Ruby
response = client.reindex(
body: {
source: {
index: 'my-index-000001'
},
dest: {
index: 'my-new-index-000001'
}
}
)
puts response
Js
const response = await client.reindex({
source: {
index: "my-index-000001",
},
dest: {
index: "my-new-index-000001",
},
});
console.log(response);
Console
POST /_reindex
{
"source": {
"index": "my-index-000001"
},
"dest": {
"index": "my-new-index-000001"
}
}
フィールドの名前を変更
フィールドの名前を変更すると、古いフィールド名の下で既にインデックスされたデータが無効になります。代わりに、alias
フィールドを追加して、代替フィールド名を作成します。
たとえば、[user_identifier
]フィールドを持つインデックスを作成するために、インデックス作成 APIを使用します。
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"user_identifier": {
"type": "keyword"
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
user_identifier: {
type: 'keyword'
}
}
}
}
)
puts response
Go
res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"user_identifier": {
"type": "keyword"
}
}
}
}`)),
)
fmt.Println(res, err)
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
user_identifier: {
type: "keyword",
},
},
},
});
console.log(response);
Console
PUT /my-index-000001
{
"mappings": {
"properties": {
"user_identifier": {
"type": "keyword"
}
}
}
}
更新マッピングAPIを使用して、既存のuser_identifier
フィールドのuser_id
フィールドエイリアスを追加します。
Python
resp = client.indices.put_mapping(
index="my-index-000001",
properties={
"user_id": {
"type": "alias",
"path": "user_identifier"
}
},
)
print(resp)
Ruby
response = client.indices.put_mapping(
index: 'my-index-000001',
body: {
properties: {
user_id: {
type: 'alias',
path: 'user_identifier'
}
}
}
)
puts response
Go
res, err := es.Indices.PutMapping(
[]string{"my-index-000001"},
strings.NewReader(`{
"properties": {
"user_id": {
"type": "alias",
"path": "user_identifier"
}
}
}`),
)
fmt.Println(res, err)
Js
const response = await client.indices.putMapping({
index: "my-index-000001",
properties: {
user_id: {
type: "alias",
path: "user_identifier",
},
},
});
console.log(response);
Console
PUT /my-index-000001/_mapping
{
"properties": {
"user_id": {
"type": "alias",
"path": "user_identifier"
}
}
}