原生(Java)脚本

原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-native.html

译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=9405376

贡献者 : 阿叩ApacheCNApache中文网

MarkDown文件:Native (Java) Scripts.md

原生(Java)脚本

有时候groovy表达式是不够的。这种时候可以实现原生脚本。

实现原生脚本,最好的方法是编写一个插件并安装它。如何编写一个插件并让Elasticsearch正确的加载它,在插件文档章节有更多的介绍。

要注册一个新的脚本,你需要通过实现NativeScriptFactory来构建它。可以通过继承AbstractExecutableScriptAbstractSearchScript。 另外一种可能是最有用的方式,通过扩展AbstractLongSearchScriptAbstractDoubleSearchScript。最后,你还需要通过实现ScriptPlugin接口来注册原生脚本插件。

下面展示的是如何在一个类中来完成所有事情,它会是这样的:

  1. public class MyNativeScriptPlugin extends Plugin implements ScriptPlugin {
  2. @Override
  3. public List<NativeScriptFactory> getNativeScripts() {
  4. return Collections.singletonList(new MyNativeScriptFactory());
  5. }
  6. public static class MyNativeScriptFactory implements NativeScriptFactory {
  7. @Override
  8. public ExecutableScript newScript(@Nullable Map<String, Object> params) {
  9. return new MyNativeScript();
  10. }
  11. @Override
  12. public boolean needsScores() {
  13. return false;
  14. }
  15. @Override
  16. public String getName() {
  17. return "my_script";
  18. }
  19. }
  20. public static class MyNativeScript extends AbstractDoubleSearchScript {
  21. @Override
  22. public double runAsDouble() {
  23. double a = (double) source().get("a");
  24. double b = (double) source().get("b");
  25. return a * b;
  26. }
  27. }
  28. }

您可以通过指定脚本的lang字段值为native,以及inline字段的值为脚本的名称来执行它:

  1. POST /_search
  2. {
  3. "query": {
  4. "function_score": {
  5. "query": {
  6. "match": {
  7. "body": "foo"
  8. }
  9. },
  10. "functions": [
  11. {
  12. "script_score": {
  13. "script": {
  14. "inline": "my_script",
  15. "lang" : "native"
  16. }
  17. }
  18. }
  19. ]
  20. }
  21. }
  22. }