2017-08-16 13 views
3

ここに私が使用したコードがあります。 DocumentModelクラスはelasticsearchドキュメントとして使用されます。現在、私はelasticsearch '_id'としてurlを使用しており、javaを使用して他のフィールドdocumentIdのUUIDを生成しています。このコードを使用してドキュメントのインデックスを作成しようとすると、存在する場合はドキュメントが更新されていない場合はインデックスが更新されます。問題はドキュメントを更新し、documentIdも更新することです。しかし、私はdocumentIdを更新して既存のdocumentIdを使用する必要はありません。 これを行うには、このコードでどのような変更を行う必要がありますか?elasticsearch文書をアップする

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

これを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を使用します)。

+0

ありがとうございました。 IndexRequestとUpdateRequestを使用してUpdateQueryを使用して(prepareGetを使用せずに)行う方法はありますか? –

関連する問題