Azure 搜索返回已删除 Blob 资源的结果

Fis*_*ake 6 azure azure-storage-blobs azure-cognitive-search azure-blob-storage

我有一个 Azure 搜索服务,用于根据 BLOB 元数据搜索 BLOBS(即图像)。

搜索所基于的索引设置为每小时刷新一次。

但是,我仍然得到搜索结果中不再存在的 BLOB 的结果。

使用获取索引器状态 API(下面的输出)显示在删除 BLOBS 后索引已成功刷新。

"status": "running",
"lastResult": {
    "status": "success",
    "errorMessage": null,
    "startTime": "2018-02-05T16:00:03.29Z",
    "endTime": "2018-02-05T16:00:03.416Z",
    "errors": [],
    "warnings": [],
    "itemsProcessed": 0,
    "itemsFailed": 0,
    "initialTrackingState": "{\r\n  \"lastFullEnumerationStartTime\": \"2018-02-05T14:59:31.966Z\",\r\n  \"lastAttemptedEnumerationStartTime\": \"2018-02-05T14:59:31.966Z\",\r\n  \"nameHighWaterMark\": null\r\n}",
    "finalTrackingState": "{\"LastFullEnumerationStartTime\":\"2018-02-05T15:59:33.2900956+00:00\",\"LastAttemptedEnumerationStartTime\":\"2018-02-05T15:59:33.2900956+00:00\",\"NameHighWaterMark\":null}"
},
"
Run Code Online (Sandbox Code Playgroud)

如果相关,则使用Azure 存储资源管理器删除了 BLOB

这导致的问题是这些图像被输出到网页并且当前显示为丢失的图像以及使索引大于它需要的大小。

小智 5

虽然“软删除”是一个选项,但如果您愿意,也可以直接修改索引器所针对的索引。

您可以使用本页详细介绍的 POST 索引 API来直接删除文档,并使用其“key”字段。下面是一个例子:

POST https://[service name].search.windows.net/indexes/[index name]/docs/index?api-version=[api-version]   
Content-Type: application/json   
api-key: [admin key]  
{  
  "value": [  
    {  
      "@search.action": "delete",  
      "key_field_name": "value"
    }
  ]  
} 
Run Code Online (Sandbox Code Playgroud)

假设您没有使用字段映射来修改 blob 索引器的默认“键”行为,则根据本页的文档,键字段将是metadata_storage_path属性的base64 编码值(同样,请参阅前面的链接以了解详细信息) 。因此,在删除 blob 时,您可以编写一个触发器,将适当的有效负载发布到要从中删除文档的搜索索引。


Fis*_*ake 4

经过一番阅读后,我发现 Azure 搜索当前支持的唯一删除策略是Soft Delete

要为 BLOB 存储启用此功能,您必须在每个 BLOB 上创建一个元数据值(例如 IsDeleted)并更新该值以使其能够被删除策略捕获。

PUT https://[service name].search.windows.net/datasources/blob-datasource?api-version=2016-09-01
Content-Type: application/json
api-key: [admin key]

{
"name" : "blob-datasource",
"type" : "azureblob",
"credentials" : { "connectionString" : "<your storage connection string>" },
"container" : { "name" : "my-container", "query" : "my-folder" },
"dataDeletionDetectionPolicy" : {
    "@odata.type" :"#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",     
    "softDeleteColumnName" : "IsDeleted",
    "softDeleteMarkerValue" : "true"
    }
} 
Run Code Online (Sandbox Code Playgroud)

完整详细信息请参见此处

我需要进行一些测试,以确保更新元数据然后立即删除 BLOB 是安全的。