针对JSON数组索引器,删除Blob时自动移除Azure索引文档
实现Azure Blob删除时自动移除关联搜索索引文档的方案
针对你遇到的单个Blob生成多索引文档、删除Blob无法自动删除对应索引的问题,可通过以下步骤实现需求:
1. 给索引文档添加源Blob标识字段
首先在搜索索引中新增一个sourceBlobId字段(类型设为Edm.String,需开启可过滤属性),用来记录每个索引文档对应的源Blob名称。
修改索引器的fieldMappings配置,将Blob系统元数据映射到这个字段:
"fieldMappings": [ { "sourceFieldName": "metadata_storage_name", "targetFieldName": "sourceBlobId" } ]
metadata_storage_name是Blob存储自带的系统元数据,对应Blob的唯一名称。
2. 启用Blob软删除检测策略
更新索引器的参数配置,添加软删除检测规则,让索引器能够识别已删除的Blob:
"parameters": { "batchSize": null, "maxFailedItems": null, "maxFailedItemsPerBatch": null, "base64EncodeKeys": null, "configuration": { "parsingMode": "jsonArray", "deleteDetectionPolicy": { "@odata.type": "#Microsoft.Azure.Search.BlobSoftDeleteDetectionPolicy" } } },
3. 批量删除关联索引文档
因为单个Blob对应多个索引文档,需要基于sourceBlobId批量删除,推荐两种实现方式:
方式一:Azure函数触发(简单高效)
配置Azure Blob存储的删除事件触发器,当Blob被删除时自动触发Azure函数:
- 函数获取被删除Blob的名称
- 调用Azure搜索批量删除API,删除所有
sourceBlobId匹配该名称的文档,请求示例:
{ "value": [ { "@search.action": "delete", "sourceBlobId": "被删除的Blob文件名" } ] }
注意给Azure函数配置访问搜索服务的权限(使用托管身份即可)。
方式二:自定义技能集(适合复杂场景)
如果索引器已配置技能集,可添加自定义技能,在索引器检测到Blob删除时,自动生成批量删除请求。这种方式适合需要额外处理逻辑的场景。
4. 验证流程
- 上传包含JSON数组的Blob,确认所有生成的索引文档都带有正确的
sourceBlobId值 - 删除该Blob,触发删除逻辑后,检查搜索索引中对应文档是否全部被移除
内容的提问来源于stack exchange,提问作者K D
相关产品推荐
相关产品推荐

