Azure 搜索在索引器 运行 后不删除数据
Azure Search Does Not Remove Data After Indexer RUN
我在 blob 存储中有一个文件 folder/new/data1.json
。
data1
包含 json 数组。
[
{
"name": "na",
"data": {
"1":"something1",
"2":"something2"
}
},
{
"name": "ha",
"data": {
"1":"something1",
"2":"something2"
}
}
]
我的数据源正文:
{
"name" : "datasource",
"type" : "azureblob",
"credentials" : { "connectionString" : "MyStorageConnStrning" },
"container" : { "name" : "mycontaner", "query" : "folder/new" }
}
我的索引正文:
{
"name" : "index",
"fields": [
{ "name": "id", "type": "Edm.String", "key": true, "searchable": false },
{ "name": "name", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": true},
{ "name": "data", "type": "Edm.String", "searchable": false}
]
}
索引器正文:
{
"name" : "indexer",
"dataSourceName" : "datasource",
"targetIndexName" : "index",
"parameters" : { "configuration" : { "parsingMode" : "jsonArray" } }
}
创建后我可以搜索 na
和 ha
并获得结果。
但是如果我从 blob 存储中删除 folder/new/data1.json
并从索引器中删除 运行 并尝试搜索 na
和 ha
我仍然会得到结果。
我发现,如果我删除索引器并重新创建它,na
和 ha
将从搜索中消失。
有没有办法在不删除索引器的情况下删除以前的数据?
恐怕您需要自行从索引中删除条目。
看看Add, Update or Delete Documents (Azure Search Service REST API) on how it can be done using HTTP requests using a tool like Postman.
希望对您有所帮助!
使用索引器删除文档有点棘手,尤其是当您的 blob 包含多个文档时;如果您直接删除 blob,那么索引器将看不到 blob,也不会尝试从索引中删除任何内容。
要使索引器删除文档,您需要使用 soft delete deletion detection policy,例如:
{
"@odata.type": "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
"softDeleteColumnName": "IsDeleted",
"softDeleteMarkerValue": "true"
}
如果要删除文档,请将 "IsDeleted": true
添加到 JSON 对象。在 blob 中的所有文档都被软删除后 并且删除内容已被索引器提取,然后您才能执行硬删除并删除 blob。
这里的一个微妙之处是您 不能 add/remove/rearrange 数组的元素,因为您使用的是默认文档 ID,这取决于 blob 路径和数组指数。如果您使用 name
字段作为键,那么您将可以灵活地在 blob 中执行部分硬删除。
我在 blob 存储中有一个文件 folder/new/data1.json
。
data1
包含 json 数组。
[
{
"name": "na",
"data": {
"1":"something1",
"2":"something2"
}
},
{
"name": "ha",
"data": {
"1":"something1",
"2":"something2"
}
}
]
我的数据源正文:
{
"name" : "datasource",
"type" : "azureblob",
"credentials" : { "connectionString" : "MyStorageConnStrning" },
"container" : { "name" : "mycontaner", "query" : "folder/new" }
}
我的索引正文:
{
"name" : "index",
"fields": [
{ "name": "id", "type": "Edm.String", "key": true, "searchable": false },
{ "name": "name", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": true},
{ "name": "data", "type": "Edm.String", "searchable": false}
]
}
索引器正文:
{
"name" : "indexer",
"dataSourceName" : "datasource",
"targetIndexName" : "index",
"parameters" : { "configuration" : { "parsingMode" : "jsonArray" } }
}
创建后我可以搜索 na
和 ha
并获得结果。
但是如果我从 blob 存储中删除 folder/new/data1.json
并从索引器中删除 运行 并尝试搜索 na
和 ha
我仍然会得到结果。
我发现,如果我删除索引器并重新创建它,na
和 ha
将从搜索中消失。
有没有办法在不删除索引器的情况下删除以前的数据?
恐怕您需要自行从索引中删除条目。 看看Add, Update or Delete Documents (Azure Search Service REST API) on how it can be done using HTTP requests using a tool like Postman.
希望对您有所帮助!
使用索引器删除文档有点棘手,尤其是当您的 blob 包含多个文档时;如果您直接删除 blob,那么索引器将看不到 blob,也不会尝试从索引中删除任何内容。
要使索引器删除文档,您需要使用 soft delete deletion detection policy,例如:
{
"@odata.type": "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
"softDeleteColumnName": "IsDeleted",
"softDeleteMarkerValue": "true"
}
如果要删除文档,请将 "IsDeleted": true
添加到 JSON 对象。在 blob 中的所有文档都被软删除后 并且删除内容已被索引器提取,然后您才能执行硬删除并删除 blob。
这里的一个微妙之处是您 不能 add/remove/rearrange 数组的元素,因为您使用的是默认文档 ID,这取决于 blob 路径和数组指数。如果您使用 name
字段作为键,那么您将可以灵活地在 blob 中执行部分硬删除。