如何删除索引中的所有文档

mik*_*eyb 9 azure-cognitive-search

有没有简单的方法从Azure搜索索引中删除所有文档(或筛选的列表或文档)?

我知道明显的答案是删除并重新创建索引,但我想知道是否还有其他选项.

Pab*_*tro 5

不,目前无法从索引中删除所有文档.因为您怀疑删除并重新创建索引是要走的路.对于非常小的索引,您可以考虑单独删除文档,但考虑到应用程序通常具有用于创建索引的代码,删除/重新创建是最快的路径.


Kev*_*vin 5

有一个办法:查询所有文档,用IndexBatch删除这些家伙。

    public void DeleteAllDocuments()
    {
        // Get index
        SearchIndexClient indexClient = new SearchIndexClient(SearchServiceName, SearchServiceIndex, new SearchCredentials(SearchServiceQueryApiKey));

        // Query all
        DocumentSearchResult<Document> searchResult;
        try
        {
            searchResult = indexClient.Documents.Search<Document>(string.Empty);
        }
        catch (Exception ex)
        {
            throw new Exception("Error during AzureSearch");
        }

        List<string> azureDocsToDelete =
            searchResult
                .Results
                .Select(r => r.Document["id"].ToString())
                .ToList();

        // Delete all
        try
        {
            IndexBatch batch = IndexBatch.Delete("id", azureDocsToDelete);
            var result = indexClient.Documents.Index(batch);
        }
        catch (IndexBatchException ex)
        {
            throw new Exception($"Failed to delete documents: {string.Join(", ", ex.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key))}");
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这有两个主要问题: 1. 在一般情况下,不可能以一致的方式枚举大索引中的所有文档。2. 由于删除实际上是在 Lucene 级别进行的,因此效率非常低。“删除”文档只是将其标记为已删除,以便在合并片段时它最终会消失。大量执行此操作会为段合并创建大量工作,并在短期内消耗“更多”存储而不是释放它。巴勃罗的答案是最好的——删除整个索引并重新创建它。 (2认同)