public async Task <IUpdateResponse <SystemEventElasticsearchDocument> > UpdateWithRetryOnPreviousIndexAsync(
            string documentId, SystemEventElasticsearchPartialDocument partialDocument,
            CancellationToken cancellationToken, int retryOnConflict)
        {
            try
            {
                var indexName = _indexFactory.GetIndexName();
                return(await _esClient.UpdateAsync <SystemEventElasticsearchDocument, SystemEventElasticsearchPartialDocument>(
                           documentId, u => u
                           .Index(indexName)
                           .Doc(partialDocument)
                           .RetryOnConflict(retryOnConflict), cancellationToken : cancellationToken));
            }
            catch
            {
                // Ignore
            }

            var previousIndexName = _indexFactory.GetPreviousIndexName();

            return(await _esClient.UpdateAsync <SystemEventElasticsearchDocument, SystemEventElasticsearchPartialDocument>(
                       documentId, u => u
                       .Index(previousIndexName)
                       .Doc(partialDocument)
                       .RetryOnConflict(retryOnConflict), cancellationToken : cancellationToken));
        }
        public async Task <IUpdateResponse <SystemEventElasticsearchDocument> > UpdateAsync(
            string documentId, SystemEventElasticsearchPartialDocument partialDocument,
            CancellationToken cancellationToken, int retryOnConflict = 3,
            bool retryWithPreviousIndex = false)
        {
            string indexName = null;
            var    latency   = PreInvoke(_clientName, _updateMethodName, documentId, partialDocument);

            try
            {
                indexName = _indexFactory.GetIndexName();
                Task <IUpdateResponse <SystemEventElasticsearchDocument> > updateResult = null;
                if (retryWithPreviousIndex)
                {
                    updateResult = UpdateWithRetryOnPreviousIndexAsync(
                        documentId, partialDocument, cancellationToken, retryOnConflict);
                }
                else
                {
                    updateResult = _esClient.UpdateAsync <SystemEventElasticsearchDocument, SystemEventElasticsearchPartialDocument>(
                        documentId, u => u
                        .Index(indexName)
                        .Doc(partialDocument)
                        .RetryOnConflict(retryOnConflict), cancellationToken: cancellationToken);
                }

                var result = await updateResult;

                PostInvokeSuccess(latency, _clientName, _updateMethodName, documentId, partialDocument, indexName);
                return(result);
            }
            catch (Exception ex)
            {
                PostInvokeFailure(_clientName, _updateMethodName, ex, documentId, partialDocument, indexName);
                throw;
            }
        }