索引器运行后,Azure搜索不会删除数据

时间:2018-12-06 14:15:05

标签: azure azure-search

我在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" } }
}

创建后,我可以搜索naha并获得结果。

但是如果我从Blob存储中删除folder/new/data1.json并运行索引器并尝试搜索naha,我仍然会得到结果。

我发现,如果我删除索引器并重新创建它,naha就会远离搜索。

有什么方法可以删除以前的数据而不删除索引器?

2 个答案:

答案 0 :(得分:3)

使用索引器删除文档有些棘手,尤其是当您的Blob包含多个文档时;如果直接删除Blob,则索引器将看不到Blob,也不会尝试从索引中删除任何内容。

要使索引器删除文档,您需要使用soft delete deletion detection policy,例如:

{
  "@odata.type": "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
  "softDeleteColumnName": "IsDeleted",
  "softDeleteMarkerValue": "true"
}

要删除文档时,将"IsDeleted": true添加到JSON对象。在将Blob中的所有文档都进行软删除,并且索引器已将删除的内容提取后,您才可以进行硬删除并删除Blob。

这里的一个微妙之处是,您一定不要添加/删除/重新排列数组中的元素,因为您使用的是默认文档ID,这取决于Blob路径和数组索引。如果您将name字段用作键,则可以灵活地在Blob中进行部分硬删除。

答案 1 :(得分:1)

恐怕您需要自行删除索引中的条目。 看一下Add, Update or Delete Documents (Azure Search Service REST API),了解如何使用诸如Postman之类的工具使用 HTTP 请求完成此操作。

希望有帮助!