123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- [[modules-scripting-using]]
- == How to use scripts
- Wherever scripting is supported in the Elasticsearch API, the syntax follows
- the same pattern:
- [source,js]
- -------------------------------------
- "script": {
- "lang": "...", <1>
- "source" | "id": "...", <2>
- "params": { ... } <3>
- }
- -------------------------------------
- // NOTCONSOLE
- <1> The language the script is written in, which defaults to `painless`.
- <2> The script itself which may be specified as `source` for an inline script or `id` for a stored script.
- <3> Any named parameters that should be passed into the script.
- For example, the following script is used in a search request to return a
- <<request-body-search-script-fields, scripted field>>:
- [source,console]
- -------------------------------------
- PUT my_index/_doc/1
- {
- "my_field": 5
- }
- GET my_index/_search
- {
- "script_fields": {
- "my_doubled_field": {
- "script": {
- "lang": "expression",
- "source": "doc['my_field'] * multiplier",
- "params": {
- "multiplier": 2
- }
- }
- }
- }
- }
- -------------------------------------
- [float]
- === Script parameters
- `lang`::
- Specifies the language the script is written in. Defaults to `painless`.
- `source`, `id`::
- Specifies the source of the script. An `inline` script is specified
- `source` as in the example above. A `stored` script is specified `id`
- and is retrieved from the cluster state (see <<modules-scripting-stored-scripts,Stored Scripts>>).
- `params`::
- Specifies any named parameters that are passed into the script as
- variables.
- [IMPORTANT]
- [[prefer-params]]
- .Prefer parameters
- ========================================
- The first time Elasticsearch sees a new script, it compiles it and stores the
- compiled version in a cache. Compilation can be a heavy process.
- If you need to pass variables into the script, you should pass them in as
- named `params` instead of hard-coding values into the script itself. For
- example, if you want to be able to multiply a field value by different
- multipliers, don't hard-code the multiplier into the script:
- [source,js]
- ----------------------
- "source": "doc['my_field'] * 2"
- ----------------------
- // NOTCONSOLE
- Instead, pass it in as a named parameter:
- [source,js]
- ----------------------
- "source": "doc['my_field'] * multiplier",
- "params": {
- "multiplier": 2
- }
- ----------------------
- // NOTCONSOLE
- The first version has to be recompiled every time the multiplier changes. The
- second version is only compiled once.
- If you compile too many unique scripts within a small amount of time,
- Elasticsearch will reject the new dynamic scripts with a
- `circuit_breaking_exception` error. By default, up to 15 inline scripts per
- minute will be compiled. You can change this setting dynamically by setting
- `script.max_compilations_rate`.
- ========================================
- [float]
- [[modules-scripting-short-script-form]]
- === Short script form
- A short script form can be used for brevity. In the short form, `script` is represented
- by a string instead of an object. This string contains the source of the script.
- Short form:
- [source,js]
- ----------------------
- "script": "ctx._source.likes++"
- ----------------------
- // NOTCONSOLE
- The same script in the normal form:
- [source,js]
- ----------------------
- "script": {
- "source": "ctx._source.likes++"
- }
- ----------------------
- // NOTCONSOLE
- [float]
- [[modules-scripting-stored-scripts]]
- === Stored scripts
- Scripts may be stored in and retrieved from the cluster state using the
- `_scripts` end-point.
- [float]
- ==== Request examples
- The following are examples of using a stored script that lives at
- `/_scripts/{id}`.
- First, create the script called `calculate-score` in the cluster state:
- [source,console]
- -----------------------------------
- POST _scripts/calculate-score
- {
- "script": {
- "lang": "painless",
- "source": "Math.log(_score * 2) + params.my_modifier"
- }
- }
- -----------------------------------
- // TEST[setup:twitter]
- You may also specify a context as part of the url path to compile a
- stored script against that specific context in the form of
- `/_scripts/{id}/{context}`:
- [source,console]
- -----------------------------------
- POST _scripts/calculate-score/score
- {
- "script": {
- "lang": "painless",
- "source": "Math.log(_score * 2) + params.my_modifier"
- }
- }
- -----------------------------------
- // TEST[setup:twitter]
- This same script can be retrieved with:
- [source,console]
- -----------------------------------
- GET _scripts/calculate-score
- -----------------------------------
- // TEST[continued]
- Stored scripts can be used by specifying the `id` parameters as follows:
- [source,console]
- --------------------------------------------------
- GET twitter/_search
- {
- "query": {
- "script_score": {
- "query": {
- "match": {
- "message": "some message"
- }
- },
- "script": {
- "id": "calculate-score",
- "params": {
- "my_modifier": 2
- }
- }
- }
- }
- }
- --------------------------------------------------
- // TEST[continued]
- And deleted with:
- [source,console]
- -----------------------------------
- DELETE _scripts/calculate-score
- -----------------------------------
- // TEST[continued]
- [float]
- [[modules-scripting-search-templates]]
- === Search templates
- You can also use the `_scripts` API to store **search templates**. Search
- templates save specific <<search-search,search requests>> with placeholder
- values, called template parameters.
- You can use stored search templates to run searches without writing out the
- entire query. Just provide the stored template's ID and the template parameters.
- This is useful when you want to run a commonly used query quickly and without
- mistakes.
- Search templates use the http://mustache.github.io/mustache.5.html[mustache
- templating language]. See <<search-template>> for more information and examples.
- [float]
- [[modules-scripting-using-caching]]
- === Script caching
- All scripts are cached by default so that they only need to be recompiled
- when updates occur. By default, scripts do not have a time-based expiration, but
- you can change this behavior by using the `script.cache.expire` setting.
- You can configure the size of this cache by using the `script.cache.max_size` setting.
- By default, the cache size is `100`.
- NOTE: The size of scripts is limited to 65,535 bytes. This can be
- changed by setting `script.max_size_in_bytes` setting to increase that soft
- limit, but if scripts are really large then a
- <<modules-scripting-engine,native script engine>> should be considered.
- [float]
- [[modules-scripting-errors]]
- === Script errors
- Elasticsearch returns error details when there is a compliation or runtime
- exception. The contents of this response are useful for tracking down the
- problem.
- experimental[]
- The contents of `position` are experimental and subject to change.
|