Azure Search SDK для хранилища BLOB-объектов - удаление файлов

Я создал приложение, которое перечисляет все документы в контейнере хранилища Azure и позволяет пользователю отмечать определенные файлы для удаления.

Это приложение поиска Azure, поэтому процесс заключается в добавлении свойства "удаленных" метаданных к выбранным файлам, запуске индексатора для удаления этой информации из индекса и последующем физическом удалении файлов.

Вот код для этого процесса:

serviceClient.Indexers.Run(documentIndexer);

var status = serviceClient.Indexers.GetStatus(documentIndexer).LastResult.Status;

// Loop until the indexer is done
while (status == IndexerExecutionStatus.InProgress)
{
    status = serviceClient.Indexers.GetStatus(documentIndexer).LastResult.Status;
}

// If successful, delete the flagged files
if (status == IndexerExecutionStatus.Success)
{
    DeleteFlagged();
}

Все работает нормально, но только если я ставлю точку останова на вызов DeleteFlagged(), эффективно форсируя задержку между запуском индексатора и удалением файлов.

Без паузы индексатор возвращается как успешный, и я удаляю файлы, но содержимое файла не было удалено из индекса - они по-прежнему отображаются в результатах поиска (файлы были физически удалены).

Есть ли что-то еще, что мне нужно проверить перед удалением?

1 ответ

Решение

Когда вы запускаете индексатор, он не сразу переходит в состояние InProgress - фактически, в зависимости от того, сколько индексаторов запущено в вашей службе, может пройти значительная задержка, прежде чем индексатор будет запланирован для запуска. Таким образом, когда вы вызываете GetStatus перед циклом, индексатор может еще не быть InProgress, и вы в конечном итоге удаляете BLOB-объекты слишком рано. Более надежный подход состоит в том, чтобы подождать, пока индексатор завершит этот конкретный прогон (например, просмотрев StartTime/EndTime в LastResult).

Другие вопросы по тегам