elasticsearch
Loading

Update by query context

Serverless Stack

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:

  1. The product’s base_price is greater than or equal to 20.
  2. The product currently has a 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;
                product.discount_amount = product.base_price * (params.discount_rate / 100) ;

                product.price = product.base_price - product.discount_amount;
            }
        }
    """,
    "params": {
      "discount_rate": 15
    }
  }
}
		
  1. Assigns the discount rate
  2. Calculates and assigns the total discount
  3. Calculates and assigns the product price with discount