[[script-processor]]
=== Script processor
++++
Script
++++
Allows inline and stored scripts to be executed within ingest pipelines.
See <> to learn more about writing scripts. The Script Processor
leverages caching of compiled scripts for improved performance. Since the
script specified within the processor is potentially re-compiled per document, it is important
to understand how script caching works. To learn more about
caching see <>.
[[script-options]]
.Script Options
[options="header"]
|======
| Name | Required | Default | Description
| `lang` | no | "painless" | The scripting language
| `id` | no | - | The stored script id to refer to
| `source` | no | - | An inline script to be executed
| `params` | no | - | Script Parameters
include::common-options.asciidoc[]
|======
One of `id` or `source` options must be provided in order to properly reference a script to execute.
You can access the current ingest document from within the script context by using the `ctx` variable.
The following example sets a new field called `field_a_plus_b_times_c` to be the sum of two existing
numeric fields `field_a` and `field_b` multiplied by the parameter param_c:
[source,js]
--------------------------------------------------
{
"script": {
"lang": "painless",
"source": "ctx.field_a_plus_b_times_c = (ctx.field_a + ctx.field_b) * params.param_c",
"params": {
"param_c": 10
}
}
}
--------------------------------------------------
// NOTCONSOLE
It is possible to use the Script Processor to manipulate document metadata like `_index` and `_type` during
ingestion. Here is an example of an Ingest Pipeline that renames the index and type to `my-index` no matter what
was provided in the original index request:
[source,console]
--------------------------------------------------
PUT _ingest/pipeline/my-index
{
"description": "use index:my-index",
"processors": [
{
"script": {
"source": """
ctx._index = 'my-index';
ctx._type = '_doc';
"""
}
}
]
}
--------------------------------------------------
Using the above pipeline, we can attempt to index a document into the `any-index` index.
[source,console]
--------------------------------------------------
PUT any-index/_doc/1?pipeline=my-index
{
"message": "text"
}
--------------------------------------------------
// TEST[continued]
The response from the above index request:
[source,console-result]
--------------------------------------------------
{
"_index": "my-index",
"_type": "_doc",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 89,
"_primary_term": 1,
}
--------------------------------------------------
// TESTRESPONSE[s/"_seq_no": \d+/"_seq_no" : $body._seq_no/ s/"_primary_term" : 1/"_primary_term" : $body._primary_term/]
In the above response, you can see that our document was actually indexed into `my-index` instead of
`any-index`. This type of manipulation is often convenient in pipelines that have various branches of transformation,
and depending on the progress made, indexed into different indices.