mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-17 18:35:25 +00:00
Refactored ScriptType to clean up some of the variable and method names. Added more documentation. Deprecated the 'in' ParseField in favor of 'stored' to match the indexed scripts being replaced by stored scripts.
190 lines
3.9 KiB
Plaintext
190 lines
3.9 KiB
Plaintext
[[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/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": {
|
|
"stored": "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`.
|