原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-native.html
译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=9405376
MarkDown文件:Native (Java) Scripts.md
原生(Java)脚本
有时候groovy和表达式是不够的。这种时候可以实现原生脚本。
实现原生脚本,最好的方法是编写一个插件并安装它。如何编写一个插件并让Elasticsearch正确的加载它,在插件文档章节有更多的介绍。
要注册一个新的脚本,你需要通过实现NativeScriptFactory来构建它。可以通过继承AbstractExecutableScript或AbstractSearchScript。 另外一种可能是最有用的方式,通过扩展AbstractLongSearchScript和AbstractDoubleSearchScript。最后,你还需要通过实现ScriptPlugin接口来注册原生脚本插件。
下面展示的是如何在一个类中来完成所有事情,它会是这样的:
public class MyNativeScriptPlugin extends Plugin implements ScriptPlugin {@Overridepublic List<NativeScriptFactory> getNativeScripts() {return Collections.singletonList(new MyNativeScriptFactory());}public static class MyNativeScriptFactory implements NativeScriptFactory {@Overridepublic ExecutableScript newScript(@Nullable Map<String, Object> params) {return new MyNativeScript();}@Overridepublic boolean needsScores() {return false;}@Overridepublic String getName() {return "my_script";}}public static class MyNativeScript extends AbstractDoubleSearchScript {@Overridepublic double runAsDouble() {double a = (double) source().get("a");double b = (double) source().get("b");return a * b;}}}
您可以通过指定脚本的lang字段值为native,以及inline字段的值为脚本的名称来执行它:
POST /_search
{
"query": {
"function_score": {
"query": {
"match": {
"body": "foo"
}
},
"functions": [
{
"script_score": {
"script": {
"inline": "my_script",
"lang" : "native"
}
}
}
]
}
}
}
