I thought about next solution for the my problem: Atomic Update + Replicas.

I can set my *UpdateProcessorsChain* in the next order:
<MergerUpdateProcessor/>
<CustomUpdateProcessor-1/>
      .            .              .
<CustomUpdateProcessor-n/>
<DistributedUpdateProcessor>
<RunUpdateProcessor/>

MergerUpdateProcessor will use getUpdatedDocument function of 
DistibutedUpdateProcessor
<https://github.com/apache/lucene-solr/blob/master/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java>
 
.

/  public void processAdd(AddUpdateCommand cmd) {
    if (!AtomicUpdateDocumentMerger.isAtomicUpdate(cmd)) {
                *super.processAdd(cmd);
                return;*
        }
        *AtomicUpdateDocumentMerger docMerger = new
AtomicUpdateDocumentMerger(cmd.getReq);*                
    Set<String> inPlaceUpdatedFields =
AtomicUpdateDocumentMerger.computeInPlaceUpdatableFields(cmd);
    if (inPlaceUpdatedFields.size() > 0) { // non-empty means this is
suitable for in-place updates
      if (docMerger.doInPlaceUpdateMerge(cmd, inPlaceUpdatedFields)) {
        *super.processAdd(cmd);
                return;*
      } else {
        // in-place update failed, so fall through and re-try the same with
a full atomic update
      }
    }   
    // full (non-inplace) atomic update
    SolrInputDocument sdoc = cmd.getSolrInputDocument();
    BytesRef id = cmd.getIndexedId();
    SolrInputDocument oldDoc =
RealTimeGetComponent.getInputDocument(cmd.getReq().getCore(), id);
    if (oldDoc == null) {
      // create a new doc by default if an old one wasn't found
      if (*cmd.getVersion()* <= 0) {
        oldDoc = new SolrInputDocument();
      } else {
        // could just let the optimistic locking throw the error
        throw new SolrException(ErrorCode.CONFLICT, "Document not found for
update.  id=" + cmd.getPrintableId());
      }
    } else {
      oldDoc.remove(CommonParams.VERSION_FIELD);
    }
    cmd.solrDoc = docMerger.merge(sdoc, oldDoc);    
        *super.processAdd(cmd);*
 }/

What do you think about my solution (all changes in source code are marked
in bold)? I checked it in my test environment, and it worked fine. Maybe do
I miss something? Edge cases?



--
Sent from: http://lucene.472066.n3.nabble.com/Solr-User-f472068.html

Reply via email to