docs/reference/scripting-languages/painless/painless-update-by-query-context.md
Use a Painless script in an update by query operation to add, modify, or delete fields within each of a set of documents collected as the result of query.
Check out the document update tutorial for related examples.
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, read-only)
: The value used to select a shard for document storage.
ctx['_index'] (String, read-only)
: The name of the index.
ctx['_id'] (String, read-only)
: The unique document id.
ctx['_version'] (int, read-only)
: The current version of the document.
ctx['_source'] (Map)
: Contains extracted JSON in a Map and List structure for the fields existing in a stored document.
ctx['op']
: Use the default of index to update a document. Set to none to specify no operation or delete to delete the current document from the index.
ctx['_source']
: Modify the values in the Map/List structure 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 uses the _update_by_query API to apply a discount to products that meet two conditions:
base_price is greater than or equal to 20.discount_percentage of 0 (no discount applied).POST /kibana_sample_data_ecommerce/_update_by_query
{
"query": {
"bool": {
"filter": [
{
"range": {
"products.base_price": {
"gte": 20
}
}
},
{
"match": {
"products.discount_percentage": 0
}
}
]
}
},
"script": {
"lang": "painless",
"source": """
for (product in ctx._source.products) {
// If product has no discount applied
if (product.discount_percentage == 0) {
product.discount_percentage = params.discount_rate; // Assigns the discount rate
product.discount_amount = product.base_price * (params.discount_rate / 100) ; // Calculates and assigns the total discount
product.price = product.base_price - product.discount_amount; // Calculates and assigns the product price with discount
}
}
""",
"params": {
"discount_rate": 15
}
}
}