如何在AWS ES中启用动态脚本?

时间:2016-11-23 14:15:50

标签: amazon-web-services elasticsearch groovy

我正在使用aws弹性服务并索引65万个数据。 我需要为已编入索引的文档添加两个新字段。 当我试图调用updateByQuery函数时出现错误,[inline]类型的脚本,操作[update]和lang [groovy]被禁用'。 我通过添加
来修复它 script.engine.groovy.inline.aggs:on script.engine.groovy.inline.update:on on elasticsearch.yml,它在本地完美运行。 如何在aws es上添加此配置? 我在aws弹性服务中更新文档时遇到同样的错误。

这是我的代码。我想通过添加新字段“站点和时间”来更新所有记录(其中"设备" = deviceVal)。

var site = 'some value';
var deviceVal = '123'; 

var theScript = {
    "inline": "ctx._source.Site = '"+ site + "';ctx._source.Time = '"+ new Date().getTime() + "'"
}   
var match = {
    "match": { "device": deviceVal }
}

client.updateByQuery({
    index: 'my_index',
    type:'txt',

    "body": {
        "query": match, 
        "script":theScript
    }

}, function (error, response) {
    // console.log("success")
    console.log('error--',error)
    console.log('response--',response)
});

1 个答案:

答案 0 :(得分:2)

在我们使用logstash重新索引到AWS ES群集的the other answer上构建时,您只需添加一个转换,其中提到# add other transformations here

在您的情况下,输入部分需要包含设备的查询:

input {
  elasticsearch {
   hosts => ["my-elasticsearch-domain.us-west-2.es.amazonaws.com:80"]
   index => "my_index"
   query => '{"query": {"match":{"device": "123"}}}'
   docinfo => true
  }
}

过滤器部分将归结为此,即我们重命名@timestamp字段并添加Site字段:

filter {
 mutate {
  remove_field => [ "@version" ]
  rename => { "@timestamp" => "Time" }
  add_field => { "Site" => "some value" }
 }
}