我想运行示例更新
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\"
John Petrone.. 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
您收到的错误消息表示禁用了动态脚本,这是默认设置.您需要启用脚本才能工作:
启用动态脚本
我们建议在应用程序或代理后面运行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