微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 不支持ElasticSearch script_lang [groovy]

我正在将ElasticSearch从1.2升级到2.2.我通过相当多的重大API修改成功挖掘.我发现script_score中的groovy脚本不起作用.我启用了动态脚本

script.inline=true
script.indexed=true

包括groovy-all 2.4.6.我还添加了jna和mustache,以便在嵌入式ElasticSearch启动时看不到任何异常.

我的嵌入式服务器的配置是:

        ESLoggerFactory.setDefaultFactory(new Slf4jESLoggerFactory());
        Settings settings = Settings.builder()
                .put("node.name" ,getName())
                .put("path.home", "/tmp/elastic-search/home")
                .put("path.shared_data", /tmp/elastic-search")
                .put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, "1")
                .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, "0")
                .put("action.auto_create_index", "0")
                .put("index.gateway.type", "none")
                .put("script.inline", true)
                .put("script.indexed", true)
                .put("action.destructive_requires_name", false)
                .build();

        node = nodeBuilder().clusterName(clusterName).settings(settings).node();

然后我执行一个查询,其中包含一个看起来像loke的function_score / functions下的代码片段:

        "filter" : {
          "exists" : {
            "field" : "transactionCount"
          }
        },
        "script_score" : {
          "script" : {
            "inline" : "doc['transactionCount'].value/10.0"
          }
        }

执行抛出:

Caused by: org.elasticsearch.index.query.QueryParsingException: script_score the script Could not be loaded
...
Caused by: java.lang.IllegalArgumentException: script_lang not supported [groovy]
    at  org.elasticsearch.script.ScriptService.getScriptEngineserviceForLang(ScriptService.java:211)

调试时我在ScriptModule中看到Groovy的脚本引擎丢失了.只有本地人和小胡子才有.

任何小费都非常欢迎:)

解决方法:

在ElasticSearch 2.2中,脚本引擎已外部化:它们现在是插件,您可以根据需要进行安装.通过扫描插件文件夹发现插件.

如果使用嵌入式节点,则有两种选择:

>使用此插件文件夹,并将lang-@R_523_404[email protected]复制到此文件夹中
>在创建节点时显式注册Groovy插件

在我的项目中,我使用第二种情况:ElasticSearch嵌入在osgi容器中,我想通过经典的类路径扫描发现插件.要执行此类操作,您必须覆盖节点:

class ConfigurableNode extends Node {
  public ConfigurableNode(Settings settings, Collection<Class<? extends Plugin>> classpathPlugins) {
    super(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), 
      Version.CURRENT, 
      classpathPlugins);
  }
}

并使用以下命令创建节点:

Node node = new ConfigurableNode(nodeBuilder()
  .clusterName(clusterName)
  .settings(settings)
  .getSettings(), 
    Arrays.asList(GroovyPlugin.class)); 

它并不漂亮,但我没有在v2.2中找到更优雅的方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐