我正在使用弹性搜索批量更新JAVA API。下面是我用于批量更新的脚本。在映射嵌套对象'name'时指定为字符串字段。
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]]
注意:只有少数记录没有更新。如果我再次更新,其他一些记录会得到相同的错误而不会更新。第一次出错的记录第二次更新。