using.asciidoc 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. [[modules-scripting-using]]
  2. === How to use scripts
  3. Wherever scripting is supported in the Elasticsearch API, the syntax follows
  4. the same pattern:
  5. [source,js]
  6. -------------------------------------
  7. "script": {
  8. "lang": "...", <1>
  9. "inline" | "stored" | "file": "...", <2>
  10. "params": { ... } <3>
  11. }
  12. -------------------------------------
  13. <1> The language the script is written in, which defaults to `painless`.
  14. <2> The script itself which may be specified as `inline`, `stored`, or `file`.
  15. <3> Any named parameters that should be passed into the script.
  16. For example, the following script is used in a search request to return a
  17. <<search-request-script-fields, scripted field>>:
  18. [source,js]
  19. -------------------------------------
  20. PUT my_index/my_type/1
  21. {
  22. "my_field": 5
  23. }
  24. GET my_index/_search
  25. {
  26. "script_fields": {
  27. "my_doubled_field": {
  28. "script": {
  29. "lang": "expression",
  30. "inline": "doc['my_field'] * multiplier",
  31. "params": {
  32. "multiplier": 2
  33. }
  34. }
  35. }
  36. }
  37. }
  38. -------------------------------------
  39. // CONSOLE
  40. [float]
  41. === Script Parameters
  42. `lang`::
  43. Specifies the language the script is written in. Defaults to `groovy` but
  44. may be set to any of languages listed in <<modules-scripting>>. The
  45. default language may be changed in the `elasticsearch.yml` config file by
  46. setting `script.default_lang` to the appropriate language.
  47. `inline`, `id`, `file`::
  48. Specifies the source of the script. An `inline` script is specified
  49. `inline` as in the example above, a stored script with the specified `id`
  50. is retrieved from the cluster state (see <<modules-scripting-stored-scripts,Stored Scripts>>),
  51. and a `file` script is retrieved from a file in the `config/scripts`
  52. directory (see <<modules-scripting-file-scripts, File Scripts>>).
  53. +
  54. While languages like `expression` and `painless` can be used out of the box as
  55. inline or stored scripts, other languages like `groovy` can only be
  56. specified as `file` unless you first adjust the default
  57. <<modules-scripting-security,scripting security settings>>.
  58. `params`::
  59. Specifies any named parameters that are passed into the script as
  60. variables.
  61. [IMPORTANT]
  62. [[prefer-params]]
  63. .Prefer parameters
  64. ========================================
  65. The first time Elasticsearch sees a new script, it compiles it and stores the
  66. compiled version in a cache. Compilation can be a heavy process.
  67. If you need to pass variables into the script, you should pass them in as
  68. named `params` instead of hard-coding values into the script itself. For
  69. example, if you want to be able to multiply a field value by different
  70. multipliers, don't hard-code the multiplier into the script:
  71. [source,js]
  72. ----------------------
  73. "inline": "doc['my_field'] * 2"
  74. ----------------------
  75. Instead, pass it in as a named parameter:
  76. [source,js]
  77. ----------------------
  78. "inline": "doc['my_field'] * multiplier",
  79. "params": {
  80. "multiplier": 2
  81. }
  82. ----------------------
  83. The first version has to be recompiled every time the multiplier changes. The
  84. second version is only compiled once.
  85. If you compile too many unique scripts within a small amount of time,
  86. Elasticsearch will reject the new dynamic scripts with a
  87. `circuit_breaking_exception` error. By default, up to 15 inline scripts per
  88. minute will be compiled. You can change this setting dynamically by setting
  89. `script.max_compilations_per_minute`.
  90. ========================================
  91. [float]
  92. [[modules-scripting-file-scripts]]
  93. === File-based Scripts
  94. To increase security, non-sandboxed languages can only be specified in script
  95. files stored on every node in the cluster. File scripts must be saved in the
  96. `scripts` directory whose default location depends on whether you use the
  97. <<zip-targz-layout,`zip`/`tar.gz`>> (`$ES_HOME/config/scripts/`),
  98. <<rpm-layout,RPM>>, or <<deb-layout,Debian>> package. The default may be
  99. changed with the `path.scripts` setting.
  100. The languages which are assumed to be safe by default are: `painless`,
  101. `expression`, and `mustache` (used for search and query templates).
  102. Any files placed in the `scripts` directory will be compiled automatically
  103. when the node starts up and then <<reload-scripts,every 60 seconds thereafter>>.
  104. The file should be named as follows: `{script-name}.{lang}`. For instance,
  105. the following example creates a Groovy script called `calculate-score`:
  106. [source,sh]
  107. --------------------------------------------------
  108. cat "log(_score * 2) + my_modifier" > config/scripts/calculate-score.groovy
  109. --------------------------------------------------
  110. This script can be used as follows:
  111. [source,js]
  112. --------------------------------------------------
  113. GET my_index/_search
  114. {
  115. "query": {
  116. "script": {
  117. "script": {
  118. "lang": "groovy", <1>
  119. "file": "calculate-score", <2>
  120. "params": {
  121. "my_modifier": 2
  122. }
  123. }
  124. }
  125. }
  126. }
  127. --------------------------------------------------
  128. <1> The language of the script, which should correspond with the script file suffix.
  129. <2> The name of the script, which should be the name of the file.
  130. The `script` directory may contain sub-directories, in which case the
  131. hierarchy of directories is flattened and concatenated with underscores. A
  132. script in `group1/group2/my_script.groovy` should use `group1_group2_myscript`
  133. as the `file` name.
  134. [[reload-scripts]]
  135. [float]
  136. ==== Automatic script reloading
  137. The `scripts` directory will be rescanned every `60s` (configurable with the
  138. `resource.reload.interval` setting) and new, changed, or removed scripts will
  139. be compiled, updated, or deleted from the script cache.
  140. Script reloading can be completely disabled by setting
  141. `script.auto_reload_enabled` to `false`.
  142. [float]
  143. [[modules-scripting-stored-scripts]]
  144. === Stored Scripts
  145. Scripts may be stored in and retrieved from the cluster state using the
  146. `_scripts` end-point:
  147. [source,js]
  148. -----------------------------------
  149. /_scripts/{lang}/{id} <1> <2>
  150. -----------------------------------
  151. <1> The `lang` represents the script language.
  152. <2> The `id` is a unique identifier or script name.
  153. This example stores a Groovy script called `calculate-score` in the cluster
  154. state:
  155. [source,js]
  156. -----------------------------------
  157. POST _scripts/groovy/calculate-score
  158. {
  159. "script": "log(_score * 2) + my_modifier"
  160. }
  161. -----------------------------------
  162. // CONSOLE
  163. This same script can be retrieved with:
  164. [source,js]
  165. -----------------------------------
  166. GET _scripts/groovy/calculate-score
  167. -----------------------------------
  168. // CONSOLE
  169. // TEST[continued]
  170. Stored scripts can be used by specifying the `lang` and `stored` parameters as follows:
  171. [source,js]
  172. --------------------------------------------------
  173. GET _search
  174. {
  175. "query": {
  176. "script": {
  177. "script": {
  178. "lang": "groovy",
  179. "stored": "calculate-score",
  180. "params": {
  181. "my_modifier": 2
  182. }
  183. }
  184. }
  185. }
  186. }
  187. --------------------------------------------------
  188. // CONSOLE
  189. // TEST[continued]
  190. And deleted with:
  191. [source,js]
  192. -----------------------------------
  193. DELETE _scripts/groovy/calculate-score
  194. -----------------------------------
  195. // CONSOLE
  196. // TEST[continued]
  197. [float]
  198. [[modules-scripting-using-caching]]
  199. === Script Caching
  200. All scripts are cached by default so that they only need to be recompiled
  201. when updates occur. File scripts keep a static cache and will always reside
  202. in memory. Both inline and stored scripts are stored in a cache that can evict
  203. residing scripts. By default, scripts do not have a time-based expiration, but
  204. you can change this behavior by using the `script.cache.expire` setting.
  205. You can configure the size of this cache by using the `script.cache.max_size` setting.
  206. By default, the cache size is `100`.
  207. NOTE: The size of stored scripts is limited to 65,535 bytes. This can be
  208. changed by setting `script.max_size_in_bytes` setting to increase that soft
  209. limit, but if scripts are really large then alternatives like
  210. <<modules-scripting-native,native>> scripts should be considered instead.