upserting elasticsearch文档

时间:2017-08-16 08:35:10

标签: java elasticsearch

这是我使用的代码。 DocumentModel类用作elasticsearch docment。目前我正在使用url作为elasticsearch' _id' ,并使用java为其他字段documentId生成UUID。当我尝试使用此代码索引文档时,它会更新文档(如果存在)或索引(如果不存在)。问题是当它更新文档时,它还会更新documentId。但我要求不更新documentId并使用现有的documentId。 我应该在此代码中做出哪些更改?

    String uuid = UUID.randomUUID().toString();
                        documentModel.setDocumentID(uuid);
                        String jsonForIndex = gson.toJson(documentModel);
                        IndexRequest indexRequest = new IndexRequest(indexName, typeName, documentModel.getId());
                        indexRequest.source(jsonForIndex);
                        UpdateRequest updateRequest = new UpdateRequest(indexName, typeName, documentModel.getId());
                        updateRequest.doc(jsonForUpdate);
                        updateRequest.upsert(indexRequest);
                        UpdateQuery updateQuery = new UpdateQueryBuilder().withIndexName(indexName).withType(typeName)
                                .withId(documentModel.getId()).withDoUpsert(true).withUpdateRequest(updateRequest).withIndexRequest(indexRequest).build();
elasticsearchTemplate.update(updateQuery).getId();

1 个答案:

答案 0 :(得分:0)

如果要将其作为elasticsearch原子操作执行,可以使用ES脚本处理documentId字段并保留现有字段。

但是如果你想使用Java,你可以执行get,使用文档id创建新的,如果存在则只有在没有版本更改的情况下才能编译索引。

像(伪代码):

old = client.prepareGet(indexName, type, uuid).get();

client.prepareIndex(indexName, type, uuid).setSource(<or the way you build it>).setVersion(old.getVersion() <if old is not null>).setRefresh(true).get();

如果并发事务修改了您尝试更新的文档,则会抛出VersionConflictEngineException。您可以对此异常使用Spring Retry并再次执行get / index(如果是期望的行为,则为let if)。