[[lang-javascript]] === JavaScript Language Plugin The JavaScript language plugin enables the use of JavaScript in Elasticsearch scripts, via Mozilla's https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino[Rhino JavaScript] engine. [[lang-javascript-install]] [float] ==== Installation This plugin can be installed using the plugin manager: [source,sh] ---------------------------------------------------------------- sudo bin/elasticsearch-plugin install lang-javascript ---------------------------------------------------------------- The plugin must be installed on every node in the cluster, and each node must be restarted after installation. [[lang-javascript-remove]] [float] ==== Removal The plugin can be removed with the following command: [source,sh] ---------------------------------------------------------------- sudo bin/elasticsearch-plugin remove lang-javascript ---------------------------------------------------------------- The node must be stopped before removing the plugin. [[lang-javascript-usage]] ==== Using JavaScript in Elasticsearch Once the plugin has been installed, JavaScript can be used at a scripting language by setting the `lang` parameter to `javascript`. Scripting is available in many APIs, but we will use an example with the `function_score` for demonstration purposes: [[lang-javascript-inline]] [float] === Inline scripts WARNING: Enabling inline scripting on an unprotected Elasticsearch cluster is dangerous. See <> for a safer option. If you have enabled {ref}/modules-scripting-security.html#enable-dynamic-scripting[inline scripts], you can use JavaScript as follows: [source,js] ---- PUT test/doc/1 { "num": 1.0 } PUT test/doc/2 { "num": 2.0 } GET test/_search { "query": { "function_score": { "script_score": { "script": { "inline": "doc[\"num\"].value * factor", "lang": "javascript", "params": { "factor": 2 } } } } } } ---- // CONSOLE [[lang-javascript-stored]] [float] === Stored scripts WARNING: Enabling stored scripts on an unprotected Elasticsearch cluster is dangerous. See <> for a safer option. If you have enabled {ref}/modules-scripting-security.html#enable-dynamic-scripting[stored scripts], you can use JavaScript as follows: [source,js] ---- PUT test/doc/1 { "num": 1.0 } PUT test/doc/2 { "num": 2.0 } POST _scripts/javascript/my_script <1> { "script": "doc[\"num\"].value * factor" } GET test/_search { "query": { "function_score": { "script_score": { "script": { "id": "my_script", <2> "lang": "javascript", "params": { "factor": 2 } } } } } } ---- // CONSOLE <1> We store the script under the id `my_script`. <2> The function score query retrieves the script with id `my_script`. [[lang-javascript-file]] [float] === File scripts You can save your scripts to a file in the `config/scripts/` directory on every node. The `.javascript` file suffix identifies the script as containing JavaScript: First, save this file as `config/scripts/my_script.js` on every node in the cluster: [source,js] ---- doc["num"].value * factor ---- then use the script as follows: [source,js] ---- PUT test/doc/1 { "num": 1.0 } PUT test/doc/2 { "num": 2.0 } GET test/_search { "query": { "function_score": { "script_score": { "script": { "file": "my_script", <1> "lang": "javascript", "params": { "factor": 2 } } } } } } ---- // CONSOLE <1> The function score query retrieves the script with filename `my_script.javascript`.