来自Java API的Elasticsearch 2.0 script_score

时间:2015-10-12 18:31:37

标签: java elasticsearch

我刚刚升级到ES 2.0.0-rc1。 我使用本地节点进行JUnit测试。

    Settings settings = Settings.builder()
            .put("script.inline", "on")
            .put("script.indexed", "on")
            .put("path.home", "/").build();

    return NodeBuilder.nodeBuilder()
            .settings(settings)
            .local(true)
            .clusterName("c").node();

我的问题是升级版本没有看到我的原生脚本。

查询看起来像这样:

        Script script = new Script("myscript", ScriptType.INDEXED, "native", params);
        ScoreFunctionBuilder scoreBuilder = ScoreFunctionBuilders.scriptFunction(script);

输出如下:

...
"functions" : [ {
  "script_score" : {
    "script" : {
      "id" : "myscript",
      "lang" : "native",
      "params" : {
        "searchMode" : "A"
      }
    }
  }
...

此脚本插件位于Maven依赖列表中。

它与之前的版本配合得很好但是在这个新版本中我得到以下例外:

Caused by: org.elasticsearch.index.query.QueryParsingException: script_score the script could not be loaded

Caused by: org.elasticsearch.index.IndexNotFoundException: no such index

那么如何将插件安装到本地节点?

修改1:

https://www.elastic.co/guide/en/elasticsearch/plugins/2.0/plugin-authors.html /从类路径加载插件

可能是解决方案。不。

编辑2:

似乎ScoreFunctionBuilder已被更改。

1.7:

ScoreFunctionBuilder scoreBuilder = ScoreFunctionBuilders.scriptFunction("myscript", "native", params);

2.0:

Script script = new Script("myscript", ScriptType.INDEXED, "native", params);
ScoreFunctionBuilder scoreBuilder = ScoreFunctionBuilders.scriptFunction(script);

但这并不适合本机脚本。

1 个答案:

答案 0 :(得分:0)

我不知道为什么因为它没有遵循任何逻辑,但您需要做的就是使用ScriptType.INLINE

Script script = new Script("myscript", ScriptType.INLINE, "native", params);

我们无法使用INDEXED,因为elasticsearch会在其系统中查找索引脚本,因为我们的脚本没有按照索引进行索引......它不会起作用。