如何使用外部脚本运行_update elasticsearch

时间:2014-08-13 16:54:18

标签: elasticsearch

我想运行示例更新

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "ctx._source.text = \"some text\""
}'

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-update.html),但收到错误{"error":"ElasticsearchIllegalArgumentException[failed to execute script]; nested: ScriptException[dynamic scripting for [mvel] disabled]; ","status":400}

从这个页面http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html,我发现我需要放置我的脚本(我称之为demorun.groovy)并按名称运行它。 我做到了,现在尝试引用为

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "demorun.groovy"
}'

但仍然得到同样的错误。 我想这是错误的。如何使用外部脚本传递_update?

我的demorun.groovy:

ctx._source.text = \"some text\"

4 个答案:

答案 0 :(得分:11)

您收到的错误消息表示禁用了动态脚本,这是默认设置。您需要启用脚本才能工作:

  

启用动态脚本

     

我们建议在应用程序或代理后面运行Elasticsearch,   它保护Elasticsearch免受外界影响。如果用户是   允许运行动态脚本(即使在搜索请求中),然后是它们   与Elasticsearch所用的用户具有相同的访问权限   跑来跑去。因此,仅允许动态脚本   默认情况下为沙盒语言。

     

首先,您不应该以root用户身份运行Elasticsearch   允许脚本在您的服务器上访问或执行任何操作,而不允许   限制。其次,你不应该直接暴露Elasticsearch   用户,但在中间有一个代理应用程序。如果你这样做   打算直接向用户公开Elasticsearch,然后就可以了   决定你是否信任他们足以在你的盒子上运行脚本或   不。如果这样做,您可以通过添加动态脚本来启用动态脚本   在每个节点上设置config / elasticsearch.yml文件之后:

     

script.disable_dynamic:false

     

虽然这仍然允许执行提供的命名脚本   配置,或通过插件注册的本机Java脚本,它也   允许用户通过API运行任意脚本。而不是发送   作为脚本的文件名,可以发送脚本的主体   代替。

     

有三种可能的配置值   script.disable_dynamic设置,默认值为sandbox:

     

true:禁用所有动态脚本,脚本必须放在   config / scripts目录。

     

false:启用所有动态脚本,脚本可以作为   请求中的字符串。

     

sandbox:脚本可以作为语言的字符串发送   沙盒。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html

答案 1 :(得分:4)

上面的ES请求的问题在于它使用了错误的格式。

动态脚本(即内联脚本):

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  "script" : "ctx._source.text = \"some text\""
}'

静态脚本(即离线脚本):

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  "script" : {
    "lang": "groovy",
    "script_file": "some-name",
    "params": {
      "foo": "some text"
    }
  }
}'

你应该放

ctx._source.text = foo

进入.../elasticsearch/config/scripts/some-name.groovy以重现几乎相同的功能。实际上,更好的是因为你不需要将ES打开到动态脚本中,并且你会传递参数。

答案 2 :(得分:2)

在elasticsearch 2.0中,script.disable_dynamic: false不起作用,因为:

  

线程中的异常" main" java.lang.IllegalArgumentException异常:   script.disable_dynamic不是受支持的设置,替换为   细粒度的脚本设置。可以为所有人启用动态脚本   将script.disable_dynamic: false替换为s cript.inline: onscript.indexed: on中的语言和所有操作   elasticsearch.yml

如错误所示,您需要在elasticsearch.yml中设置:

script.inline: on
script.indexed: on

答案 3 :(得分:0)

我遇到了同样的问题并通过将以下代码添加到config文件夹中的elasticsearch.yml文件来解决它:

script.disable_dynamic: false