Reindex context
Serverless Stack
Use a Painless script in a reindex operation to add, modify, or delete fields within each document in an original index as its reindexed into a target index.
params(Map, read-only)- User-defined parameters passed in as part of the query.
ctx['op'](String)- The name of the operation.
ctx['_routing'](String)- The value used to select a shard for document storage.
ctx['_index'](String)- The name of the index.
ctx['_id'](String)- The unique document id.
ctx['_version'](int)- The current version of the document.
ctx['_source'](Map)- Contains extracted JSON in a
MapandListstructure for the fields existing in a stored document.
ctx['op']- Use the default of
indexto update a document. Set tonoopto specify no operation ordeleteto delete the current document from the index. ctx['_routing']- Modify this to change the routing value for the current document.
ctx['_index']- Modify this to change the destination index for the current document.
ctx['_id']- Modify this to change the id for the current document.
ctx['_version'](int)- Modify this to modify the version for the current document.
ctx['_source']- Modify the values in the
Map/Liststructure to add, modify, or delete the fields of a document.
void- No expected return value.
The standard Painless API is available.
To run the example, first install the eCommerce sample data.
The following request copies all documents from the kibana_sample_data_ecommerce index to a new index called data_ecommerce_usd. During this process, a script is used to convert all monetary values to a new currency using a specified exchange rate in the params.
POST /_reindex
{
"source": {
"index": "kibana_sample_data_ecommerce"
},
"dest": {
"index": "data_ecommerce_usd"
},
"script": {
"source": """
float er = (float) params.exchange_rate;
ctx._source.currency = params.target_currency;
// Convert all prices to dollar
ctx._source.taxful_total_price = Math.round(ctx._source.taxful_total_price * er * 100) / 100;
ctx._source.taxless_total_price = Math.round(ctx._source.taxless_total_price * er * 100) / 100;
for (product in ctx._source.products) {
product.price = Math.round(product.price * er * 100) / 100;
product.base_price = Math.round(product.base_price * er * 100) / 100;
product.taxful_price = Math.round(product.taxful_price * er * 100) / 100;
product.taxless_price = Math.round(product.taxless_price * er * 100) / 100;
}
""",
"lang": "painless",
"params": {
"exchange_rate": 1.10,
"target_currency": "USD"
}
}
}
- Cast parameter to float to ensure proper decimal calculations