我正在尝试使用ES版本2.3.4的搜索查询更新多个文档。我的用例是搜索两个字段匹配特定值的文档,然后添加一个具有特定值的新字段。因此,假设我要搜索名为“John”和姓氏“Smith”的所有员工,并在其配置文件中添加一个新的字段“job”,其中包含值“Engineer”。 所以我的第一个问题是,是否可以使用update_by_query API的“doc”选项(与更新API相同的方式)执行此操作。
如果没有,并且必须使用脚本(这是我现在正在做的方式)那么也许有人可以帮助我摆脱以下错误:
{"error":{"root_cause":[{"type":"class_cast_exception","reason":"java.lang.String cannot be cast to java.util.Map"}],"type":"class_cast_exception","reason":"java.lang.String cannot be cast to java.util.Map"},"status":500}
我正在使用的代码如下:
curl -XPOST -s 'http://localhost:9200/test_index/_update_by_query?conflicts=proceed' -d'
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"match": { "first_name" : "John" }
},
{
"match": { "last_name" : "Smith" }
}
]
}
}
}
},
"script" : "ctx._source.job = \"Engineer\""
}'
使用计数API发送相同的查询(没有“脚本”字段)时,不会报告错误并重新调整正确的文档数。
答案 0 :(得分:2)
正确的语法是:
"script": {
"inline": "ctx._source.job = \"Engineer\""
}