【问题标题】:How to setup an Azure Search soft-delete policy attached to Azure Storage如何设置附加到 Azure 存储的 Azure 搜索软删除策略
【发布时间】:2019-10-02 08:11:58
【问题描述】:

我有一个使用Azure Storage 作为数据源的Azure Search。我试图让SearchStorage 中删除文件时从其结果中删除文件,但不知何故我似乎无法实现它。

到目前为止,我已尝试在 Storage 上设置软删除策略以将文件再保留 7 天,并在 Search 上设置软删除策略以检查元数据列 IsDeleted 和如果true 从其结果中删除该项目。然后使用代码更改元数据,然后按如下方式删除文件:

blob.Metadata["IsDeleted"] = "true";
blob.SetMetadataAsync().Wait();
blob.DeleteAsync().Wait();

如果不删除它似乎可以正常工作,但我猜Search 即使文件仍然保留,也无法再访问元数据。我假设一些事情就像已经考虑过的一样简单,但我似乎找不到它。

【问题讨论】:

    标签: c# azure azure-storage azure-cognitive-search indexer


    【解决方案1】:

    简短的回答是不能在 Azure 搜索中使用软删除 blob。

    从存储中软删除 blob 时,出于所有意图和目的,该 blob 将被删除。在首先取消删除之前,您不能对 blob 执行任何操作。它也不会作为常规 blob 列表过程的一部分返回。

    由于这个事实,当索引器运行以获取 blob 列表时,它没有找到软删除的 blob。从搜索服务索引器的角度标记已删除的 blob 的唯一方法是将 blob 保留在存储中并将元数据属性“IsDeleted”设置为“true”,您正在执行此操作。

    【讨论】:

    • 有没有其他方法可以从索引中删除一个项目,而不重建整个索引?
    • 这是您需要自己做的事情。一种可能的方法是连接事件网格以在删除 blob 时触发事件。在此事件处理程序中,您可以在删除 Blob 时以编程方式从搜索服务索引中删除文档。您可以在此处找到有关事件网格和 Blob 存储集成的更多信息:docs.microsoft.com/en-us/azure/storage/blobs/…。 HTH。
    • 我尝试使用 IndexBatch 手动删除它,这似乎仅适用于键值。键值是metadata_storage_path,并且作为通过门户创建索引器时的默认值,我使用new FieldMapping("metadata_storage_path", "metadata_storage_path", new FieldMappingFunction("Base64Encode")) 对其进行base64 编码。手动编码 URI 会产生不同的结果,因为存储的值似乎都与末尾的额外字符相等,因此我似乎无法生成要删除的密钥。
    • 你能分享一个例子吗?请分享 Blob 的实际 URL、存储在搜索服务中的值以及您手动计算的值。
    • 显然HttpServerUtility.UrlTokenEncode用于编码,其中最后一个字符是012,具体取决于base64编码字符串末尾=的数量.由于 = 可能是 Azure 搜索的键值中的无效字符,因此这是一个不错的选择。 HttpServerUtility.NET Framework 虽然我的项目是 .NET CORE。我还没有找到一个可以做同样事情的替代品。如果不是,现在我知道会发生什么很容易解决自己,尽管为了可读性我宁愿有一个合适的方法。
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多