我想运行示例更新
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\"
答案 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: on
和script.indexed: on
中的语言和所有操作 elasticsearch.yml
如错误所示,您需要在elasticsearch.yml
中设置:
script.inline: on
script.indexed: on
答案 3 :(得分:0)
我遇到了同样的问题并通过将以下代码添加到config文件夹中的elasticsearch.yml文件来解决它:
script.disable_dynamic: false