[[mapping-transform]]
== Transform
The document can be transformed before it is indexed by registering a
script in the `transform` element of the mapping.  The result of the
transform is indexed but the original source is stored in the `_source`
field.  Example:

[source,js]
--------------------------------------------------
{
    "example" : {
        "transform" : {
            "script" : "if (ctx._source['title']?.startsWith('t')) ctx._source['suggest'] = ctx._source['content']",
            "params" : {
                "variable" : "not used but an example anyway"
            },
            "lang": "groovy"
        },
        "properties": {
           "title": { "type": "string" },
           "content": { "type": "string" },
           "suggest": { "type": "string" }
        }
    }
}
--------------------------------------------------

Its also possible to specify multiple transforms:
[source,js]
--------------------------------------------------
{
    "example" : {
        "transform" : [
            {"script": "ctx._source['suggest'] = ctx._source['content']"}
            {"script": "ctx._source['foo'] = ctx._source['bar'];"}
        ]
    }
}
--------------------------------------------------

Because the result isn't stored in the source it can't normally be fetched by
source filtering.  It can be highlighted if it is marked as stored.

=== Get Transformed
The get endpoint will retransform the source if the `_source_transform`
parameter is set.  Example:

[source,bash]
--------------------------------------------------
curl -XGET "http://localhost:9200/test/example/3?pretty&_source_transform"
--------------------------------------------------

The transform is performed before any source filtering but it is mostly
designed to make it easy to see what was passed to the index for debugging.

=== Immutable Transformation

Transform script cannot be added to an existing mapping for an index type 
(regardless of whether the mapping currently uses transform or have any data at all).  
In other words, transform script has to be added at mapping creation time for an index type.

Also, once configured the transform script cannot be modified.  This is not
because that is technically impossible but instead because madness lies
down that road.


