为什么天蓝色搜索抛出IndexBatchException而在IndexingResults中没有失败

时间:2019-07-31 06:01:55

标签: c# azure azure-cognitive-search azure-search-.net-sdk

在我的微服务中(负责根据事件消息将数据馈送到Azure搜索实例中),我试图合并或上传IndexBatch。批处理大小始终为1,因为一个事件消息仅包含我需要在搜索中合并或上传的一个实体。

我一直在获取IndexBatchException,其中不包含IndexingResults,其中Succeeded为false。

Azure搜索服务详细信息

  • :标准
  • 分区和副本:3和3

微服务详细信息

  • Asp .Net Core版本:2.2
  • Microsoft.Azure.Search SDK版本:9.0.1

当前,我的代码已设置为通过在以后约5秒钟内按排定的时间重新安排服务总线上的消息来处理IndexBatchException。收到此重新排队的消息后,我的代码拒绝处理此事件消息,因为它发现消息日期时间不晚于搜索实例中的数据。

我意识到我可以将异常处理更改为仅在存在IndexingResults失败的情况下重试,但是我想了解 IndexBatchException背后的真正原因,其中不包含Succeeded为false的IndexingResults以及社区提出的建议。请注意,此操作本身是成功的,因为每次第一次尝试时都会上传数据。

我还可以确认azure搜索实例未处于负载状态并且没有超出其任何限制。

代码示例

/// <inheritdoc />
public async Task ProcessDocument(DomainEvent<TMessage> domainEvent)
{
    Guard.IsNotNull(domainEvent, nameof(domainEvent));

    var searchIndexClient = await searchIndexClientFactory.CreateAsync(
        domainEvent.TenantId,
        IndexName);

    var storedDocument = await GetDocument(
            searchIndexClient,
            domainEvent);

    if (storedDocument != null && ValidateEventDate(domainEvent, storedDocument))
    {
        logger.LogWarning($"Received event but detected that more recent updates have already been applied. Incoming Event Details: {JsonConvert.SerializeObject(domainEvent)}");
        return;
    }

    var newDocument = mapper.Map<TDocumentIndex>(domainEvent.Resource);

    SetSomeProperties(domainEvent, newDocument); // Changed method name. It basically is adding some contextual prop's to doc

    try
    {
        var documents = new TDocumentIndex[] { newDocument };

        var batch = IndexBatch.MergeOrUpload(documents);

        var result = await searchIndexClient
            .Documents
            .IndexAsync(batch);

        var operationResult = result
            .Results
            .FirstOrDefault();

        if (operationResult == null || operationResult.Succeeded == false)
        {
            logger.LogError($"There was an error when merging or uploading a document for tenant {domainEvent.TenantId}. Error message {operationResult?.ErrorMessage}, Message body {JsonConvert.SerializeObject(domainEvent)}");
        }
    }
    catch (IndexBatchException indexBatchException)
    {
        logger.LogError($"Failed to index some of the documents: {0}", string.Join(", ", indexBatchException.IndexingResults.Where(r => !r.Succeeded).Select(r => $"{r.Key}:{r.ErrorMessage}")));
        throw;
    }
}

示例错误日志

  • 无法索引某些文档:0 以上是通过以下代码行
  • 生成的
catch (IndexBatchException indexBatchException)
    {
        logger.LogError($"Failed to index some of the documents: {0}", string.Join(", ", indexBatchException.IndexingResults.Where(r => !r.Succeeded).Select(r => $"{r.Key}:{r.ErrorMessage}")));
        throw;
    }

我希望仅在搜索处于负载状态时才命中索引批处理异常,即使这样,我也希望它会抛出此异常并导致某些失败的结果。

1 个答案:

答案 0 :(得分:0)

该服务将按预期返回IndexingResults,但是您的代码中存在一个小错误。该错误的提示是在“无法为某些文档建立索引:0”中返回的“ 0”中。如果代码按预期运行,它将是一个空字符串。您需要删除将{0}作为c#表达式而不是字符串格式标记的字符串上的$。

它应显示为:

logger.LogError("Failed to index some of the documents: {0}", string.Join(", ", indexBatchException.IndexingResults.Where(r => !r.Succeeded).Select(r => $"{r.Key}:{r.ErrorMessage}")));