copy_to
editcopy_to
editThe copy_to parameter allows you to copy the values of multiple
fields into a group field, which can then be queried as a single
field.
If you often search multiple fields, you can improve search speeds by using
copy_to to search fewer fields. See Search as few fields as possible.
For example, the first_name and last_name fields can be copied to
the full_name field as follows:
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
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"
}
}
}
}
|
The values of the |
|
|
The |
Some important points:
- It is the field value which is copied, not the terms (which result from the analysis process).
-
The original
_sourcefield will not be modified to show the copied values. -
The same value can be copied to multiple fields, with
"copy_to": [ "field_1", "field_2" ] -
You cannot copy recursively using intermediary fields. The following configuration will not copy data from
field_1tofield_3: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" } } } }Instead, copy to multiple fields from the source field:
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 is not supported for field types where values take the form of objects, e.g. date_range.
Dynamic mapping
editConsider the following points when using copy_to with dynamic mappings:
-
If the target field does not exist in the index mappings, the usual
dynamic mapping behavior applies. By default, with
dynamicset totrue, a non-existent target field will be dynamically added to the index mappings. -
If
dynamicis set tofalse, the target field will not be added to the index mappings, and the value will not be copied. -
If
dynamicis set tostrict, copying to a non-existent field will result in an error.
|
The In this example, |