[[lang-javascript]]
=== JavaScript Language Plugin

deprecated[5.0.0,JavaScript will be replaced by the new scripting language {ref}/modules-scripting-painless.html[`Painless`]]

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.

This plugin can be downloaded for <<plugin-management-custom-url,offline install>> from
{plugin_url}/lang-javascript/{version}/lang-javascript-{version}.zip.

[[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 <<lang-javascript-file>> 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 <<lang-javascript-file>> 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,painless]
----
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`.