| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | [[modules-scripting-native]]=== Native (Java) ScriptsSometimes `painless` and <<modules-scripting-expression, expression>> aren't enough. For those times you canimplement a native script.The best way to implement a native script is to write a plugin and install it.The plugin {plugins}/plugin-authors.html[documentation] has more information onhow to write a plugin so that Elasticsearch will properly load it.To register the actual script you'll need to implement `NativeScriptFactory`to construct the script. The actual script will extend either`AbstractExecutableScript` or `AbstractSearchScript`. The second one is likelythe most useful and has several helpful subclasses you can extend like`AbstractLongSearchScript` and `AbstractDoubleSearchScript`.Finally, your plugin should register the native script by implementing the`ScriptPlugin` interface.If you squashed the whole thing into one class it'd look like:[source,java]--------------------------------------------------public class MyNativeScriptPlugin extends Plugin implements ScriptPlugin {    @Override    public List<NativeScriptFactory> getNativeScripts() {        return Collections.singletonList(new MyNativeScriptFactory());    }    public static class MyNativeScriptFactory implements NativeScriptFactory {        @Override        public ExecutableScript newScript(@Nullable Map<String, Object> params) {            return new MyNativeScript();        }        @Override        public boolean needsScores() {            return false;        }        @Override        public String getName() {            return "my_script";        }            }    public static class MyNativeScript extends AbstractDoubleSearchScript {        @Override        public double runAsDouble() {            double a = (double) source().get("a");            double b = (double) source().get("b");            return a * b;        }    }}--------------------------------------------------You can execute the script by specifying its `lang` as `native`, and the nameof the script as the `id`:[source,js]--------------------------------------------------POST /_search{  "query": {    "function_score": {      "query": {        "match": {          "body": "foo"        }      },      "functions": [        {          "script_score": {            "script": {                "inline": "my_script",                "lang" : "native"            }          }        }      ]    }  }}--------------------------------------------------// CONSOLE// TEST[skip:we don't have a native plugin installed to test this]
 |