copy_to
copy_to
パラメータを使用すると、複数のフィールドの値をグループフィールドにコピーでき、その後、単一のフィールドとしてクエリできます。
複数のフィールドを頻繁に検索する場合は、copy_to
を使用して検索するフィールドを減らすことで、検索速度を向上させることができます。 できるだけ少ないフィールドで検索するを参照してください。
たとえば、first_name
および last_name
フィールドは、次のように full_name
フィールドにコピーできます:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"first_name": "John",
"last_name": "Smith"
},
)
print(resp1)
resp2 = client.search(
index="my-index-000001",
query={
"match": {
"full_name": {
"query": "John Smith",
"operator": "and"
}
}
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
first_name: {
type: 'text',
copy_to: 'full_name'
},
last_name: {
type: 'text',
copy_to: 'full_name'
},
full_name: {
type: 'text'
}
}
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
first_name: 'John',
last_name: 'Smith'
}
)
puts response
response = client.search(
index: 'my-index-000001',
body: {
query: {
match: {
full_name: {
query: 'John Smith',
operator: 'and'
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
first_name: {
type: "text",
copy_to: "full_name",
},
last_name: {
type: "text",
copy_to: "full_name",
},
full_name: {
type: "text",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
first_name: "John",
last_name: "Smith",
},
});
console.log(response1);
const response2 = await client.search({
index: "my-index-000001",
query: {
match: {
full_name: {
query: "John Smith",
operator: "and",
},
},
},
});
console.log(response2);
Console
PUT my-index-000001
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
PUT my-index-000001/_doc/1
{
"first_name": "John",
"last_name": "Smith"
}
GET my-index-000001/_search
{
"query": {
"match": {
"full_name": {
"query": "John Smith",
"operator": "and"
}
}
}
}
first_name および last_name フィールドの値は、full_name フィールドにコピーされます。 |
|
first_name および last_name フィールドは、それぞれ名と姓のためにクエリできますが、full_name フィールドは名と姓の両方をクエリできます。 |
いくつかの重要なポイント:
- コピーされるのはフィールドの値であり、分析プロセスから得られる用語ではありません。
- 元の
_source
フィールドは、コピーされた値を表示するために変更されません。 - 同じ値を複数のフィールドにコピーできますが、
"copy_to": [ "field_1", "field_2" ]
- 中間フィールドを使用して再帰的にコピーすることはできません。次の構成では、
field_1
からfield_3
へのデータはコピーされません:
Python
resp = client.indices.create(
index="bad_example_index",
mappings={
"properties": {
"field_1": {
"type": "text",
"copy_to": "field_2"
},
"field_2": {
"type": "text",
"copy_to": "field_3"
},
"field_3": {
"type": "text"
}
}
},
)
print(resp)
Js
const response = await client.indices.create({
index: "bad_example_index",
mappings: {
properties: {
field_1: {
type: "text",
copy_to: "field_2",
},
field_2: {
type: "text",
copy_to: "field_3",
},
field_3: {
type: "text",
},
},
},
});
console.log(response);
Console
PUT bad_example_index
{
"mappings": {
"properties": {
"field_1": {
"type": "text",
"copy_to": "field_2"
},
"field_2": {
"type": "text",
"copy_to": "field_3"
},
"field_3": {
"type": "text"
}
}
}
}
代わりに、ソースフィールドから複数のフィールドにコピーします:
Python
resp = client.indices.create(
index="good_example_index",
mappings={
"properties": {
"field_1": {
"type": "text",
"copy_to": [
"field_2",
"field_3"
]
},
"field_2": {
"type": "text"
},
"field_3": {
"type": "text"
}
}
},
)
print(resp)
Js
const response = await client.indices.create({
index: "good_example_index",
mappings: {
properties: {
field_1: {
type: "text",
copy_to: ["field_2", "field_3"],
},
field_2: {
type: "text",
},
field_3: {
type: "text",
},
},
},
});
console.log(response);
Console
PUT good_example_index
{
"mappings": {
"properties": {
"field_1": {
"type": "text",
"copy_to": ["field_2", "field_3"]
},
"field_2": {
"type": "text"
},
"field_3": {
"type": "text"
}
}
}
}
copy_to
は、値がオブジェクトの形式を取るフィールドタイプ(例: date_range
)ではサポートされていません。
Dynamic mapping
copy_to
を動的マッピングで使用する際は、次の点に注意してください:
- ターゲットフィールドがインデックスマッピングに存在しない場合、通常の 動的マッピング の動作が適用されます。デフォルトでは、
dynamic
がtrue
に設定されている場合、存在しないターゲットフィールドはインデックスマッピングに動的に追加されます。 dynamic
がfalse
に設定されている場合、ターゲットフィールドはインデックスマッピングに追加されず、値はコピーされません。dynamic
がstrict
に設定されている場合、存在しないフィールドへのコピーはエラーになります。- ターゲットフィールドがネストされている場合、
copy_to
フィールドはネストされたフィールドへの完全なパスを指定する必要があります。完全なパスを省略すると、strict_dynamic_mapping_exception
になります。"copy_to": ["parent_field.child_field"]
を使用してネストされたフィールドを正しくターゲットにします。
たとえば:
- ターゲットフィールドがネストされている場合、
Python
resp = client.indices.create(
index="test_index",
mappings={
"dynamic": "strict",
"properties": {
"description": {
"properties": {
"notes": {
"type": "text",
"copy_to": [
"description.notes_raw"
],
"analyzer": "standard",
"search_analyzer": "standard"
},
"notes_raw": {
"type": "keyword"
}
}
}
}
},
)
print(resp)
Js
const response = await client.indices.create({
index: "test_index",
mappings: {
dynamic: "strict",
properties: {
description: {
properties: {
notes: {
type: "text",
copy_to: ["description.notes_raw"],
analyzer: "standard",
search_analyzer: "standard",
},
notes_raw: {
type: "keyword",
},
},
},
},
},
});
console.log(response);
Console
PUT /test_index
{
"mappings": {
"dynamic": "strict",
"properties": {
"description": {
"properties": {
"notes": {
"type": "text",
"copy_to": [ "description.notes_raw"],
"analyzer": "standard",
"search_analyzer": "standard"
},
"notes_raw": {
"type": "keyword"
}
}
}
}
}
}
notes フィールドは notes_raw フィールドにコピーされます。 notes_raw のみをターゲットにする代わりに description.notes_raw をターゲットにすると、 strict_dynamic_mapping_exception になります。この例では、 notes_raw はマッピングのルートに定義されておらず、description フィールドの下にあります。完全修飾パスがないと、Elasticsearch は copy_to ターゲットをルートレベルのフィールドとして解釈し、description の下のネストされたフィールドとしては解釈しません。 |