using.asciidoc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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" | "id" | "file": "...", <2>
  10. "params": { ... } <3>
  11. }
  12. -------------------------------------
  13. <1> The language the script is written in, which defaults to `groovy`.
  14. <2> The script itself which may be specfied as `inline`, `id`, 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. // AUTOSENSE
  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 parameters
  63. ========================================
  64. The first time Elasticsearch sees a new script, it compiles it and stores the
  65. compiled version in a cache. Compilation can be a heavy process.
  66. If you need to pass variables into the script, you should pass them in as
  67. named `params` instead of hard-coding values into the script itself. For
  68. example, if you want to be able to multiply a field value by different
  69. multipliers, don't hard-code the multiplier into the script:
  70. [source,js]
  71. ----------------------
  72. "inline": "doc['my_field'] * 2"
  73. ----------------------
  74. Instead, pass it in as a named parameter:
  75. [source,js]
  76. ----------------------
  77. "inline": "doc['my_field'] * multiplier",
  78. "params": {
  79. "multiplier": 2
  80. }
  81. ----------------------
  82. The first version has to be recompiled every time the multiplier changes. The
  83. second version is only compiled once.
  84. ========================================
  85. [float]
  86. [[modules-scripting-file-scripts]]
  87. === File-based Scripts
  88. To increase security, non-sandboxed languages can only be specified in script
  89. files stored on every node in the cluster. File scripts must be saved in the
  90. `scripts` directory whose default location depends on whether you use the
  91. <<zip-targz-layout,`zip`/`tar.gz`>> (`$ES_HOME/config/scripts/`),
  92. <<rpm-layout,RPM>>, or <<deb-layout,Debian>> package. The default may be
  93. changed with the `path.script` setting.
  94. Any files placed in the `scripts` directory will be compiled automatically
  95. when the node starts up and then <<reload-scripts,every 60 seconds thereafter>>.
  96. The file should be named as follows: `{script-name}.{lang}`. For instance,
  97. the following example creates a Groovy script called `calculate-score`:
  98. [source,sh]
  99. --------------------------------------------------
  100. cat "log(_score * 2) + my_modifier" > config/scripts/calculate-score.groovy
  101. --------------------------------------------------
  102. This script can be used as follows:
  103. [source,js]
  104. --------------------------------------------------
  105. GET my_index/_search
  106. {
  107. "query": {
  108. "script": {
  109. "script": {
  110. "lang": "groovy", <1>
  111. "file": "calculate-score", <2>
  112. "params": {
  113. "my_modifier": 2
  114. }
  115. }
  116. }
  117. }
  118. }
  119. --------------------------------------------------
  120. <1> The language of the script, which should correspond with the script file suffix.
  121. <2> The name of the script, which should be the name of the file.
  122. The `script` directory may contain sub-directories, in which case the
  123. hierarchy of directories is flattened and concatenated with underscores. A
  124. script in `group1/group2/my_script.groovy` should use `group1_group2_myscript`
  125. as the `file` name.
  126. [[reload-scripts]]
  127. [float]
  128. ==== Automatic script reloading
  129. The `scripts` directory will be rescanned every `60s` (configurable with the
  130. `resource.reload.interval` setting) and new, changed, or removed scripts will
  131. be compiled, updated, or deleted from the script cache.
  132. Script reloading can be completely disabled by setting
  133. `script.auto_reload_enabled` to `false`.
  134. [float]
  135. [[modules-scripting-stored-scripts]]
  136. === Stored Scripts
  137. Scripts may be stored in and retrieved from the cluster state using the
  138. `_scripts` end-point:
  139. [source,js]
  140. -----------------------------------
  141. /_scripts/{lang}/{id} <1> <2>
  142. -----------------------------------
  143. <1> The `lang` represents the script language.
  144. <2> The `id` is a unique identifier or script name.
  145. This example stores a Groovy script called `calculate-score` in the cluster
  146. state:
  147. [source,js]
  148. -----------------------------------
  149. POST _scripts/groovy/calculate-score
  150. {
  151. "script": "log(_score * 2) + my_modifier"
  152. }
  153. -----------------------------------
  154. // AUTOSENSE
  155. This same script can be retrieved with:
  156. [source,js]
  157. -----------------------------------
  158. GET _scripts/groovy/calculate-score
  159. -----------------------------------
  160. // AUTOSENSE
  161. // TEST[continued]
  162. Stored scripts can be used by specifying the `lang` and `id` parameters as follows:
  163. [source,js]
  164. --------------------------------------------------
  165. GET _search
  166. {
  167. "query": {
  168. "script": {
  169. "script": {
  170. "lang": "groovy",
  171. "id": "calculate-score",
  172. "params": {
  173. "my_modifier": 2
  174. }
  175. }
  176. }
  177. }
  178. }
  179. --------------------------------------------------
  180. // AUTOSENSE
  181. // TEST[continued]
  182. And deleted with:
  183. [source,js]
  184. -----------------------------------
  185. DELETE _scripts/groovy/calculate-score
  186. -----------------------------------
  187. // AUTOSENSE
  188. // TEST[continued]
  189. NOTE: The size of stored scripts is limited to 65,535 bytes. This can be
  190. changed by setting `script.max_size_in_bytes` setting to increase that soft
  191. limit, but if scripts are really large then alternatives like
  192. <<modules-scripting-native,native>> scripts should be considered instead.