这是我使用的代码。 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();
答案 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)。