0

我正在使用弹性搜索批量更新 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]]

注意:只有少数记录未更新。如果我再次更新,其他一些记录会出现相同的错误并且没有更新。第一次出错的记录第二次更新了。

4

0 回答 0