我正在使用弹性搜索批量更新 JAVA API。下面是脚本,我用于批量更新。在映射嵌套对象“名称”被指定为字符串字段。
String updateScript = "if(ctx._source.containsKey(\"nestedObjects\") && ctx._source.nestedObjects.size()>0)
{
int nestedSize = ctx._source.nestedObjects.size();
boolean isUpdated = false;
for (int i = 0; i < nestedSize; i++)
{
if(ctx._source.nestedObjects[i].containsKey(\"name\"))
{
if(ctx._source.nestedObjects[i].name == \"ram\")
{
ctx._source.nestedObjects[i].name = \"ricky\";
isUpdated = true;
}
}
}
if(!isUpdated)
{
ctx._source.nestedObjects.add(\"name\":\"ricky\");
}
}";
下面是我用于批量更新的代码。
BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
for (int i=0; i<5; i++)
{
String documentId = String.value(i);
bulkRequestBuilder.add(indexName, type, documentId).setScript(updateScript).setRouting(routingName).request());
}
BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();
批量失败消息:
message [VerifyError[(class: ASMAccessorImpl_2153668671377692494610, method: getValue signature: (Ljava/lang/Object;Ljava/lang/Object;Lorg/elasticsearch/common/mvel2/integration/VariableResolverFactory;)Ljava/lang/Object;) Expecting to find integer on stack]]
注意:只有少数记录未更新。如果我再次更新,其他一些记录会出现相同的错误并且没有更新。第一次出错的记录第二次更新了。