Azure 搜索架构迁移

Azure search schema migrations

在发布管道中迁移 Azure 搜索架构的最佳方式是什么?

在 SQL 世界中,我会使用 DbUp 之类的东西。 Azure 搜索是否有类似的东西? 或者当架构需要更改时是否有不同的方法?

这取决于您是通过 SDK 推送内容,还是使用预建索引器之一从受支持的内容源中提取内容。使用 SDK,您可以按照 post 中的说明向您的模型添加新属性:

注意:数据模型的更改可能需要对索引进行 更新重建。例如,添加新属性只需要和更新。但是,如果您更改可搜索、可过滤或可排序等设置,您将需要重建。详情见How to rebuild an index in Azure Cognitive Search

通过推送进行兼容性探测

我的首选解决方案是对所有内容都使用推送索引。为了测试索引中的数据模型是否兼容,我创建了一个样本项并提交给索引。如果索引中使用的模型不兼容,Azure 搜索 SDK 将引发错误。然后我删除索引并使用我的新模型从头开始创建它。

以下是测试任何项目是否与命名索引兼容的简化方法:

public async Task<bool> TestItemAsync<T>(T item, string indexName)
{
    var isCompatible = false;
    var indexClient = _searchServiceClient.Indexes.GetClient(indexName);
    var indexActions = new List<IndexAction<T>> { IndexAction.MergeOrUpload((item)) };

    var batch = IndexBatch.New(indexActions);
    try
    {
        var unused = await indexClient.Documents.IndexAsync(batch);
        isCompatible = true;
    }
    catch
    {
        // ignored
    }

    return isCompatible;
}

下面是一个示例,说明您可以如何使用它来探测索引的兼容性。

var item = new Product();
item.ID = 123;
item.Title = "Sample";
item.MyNewProperty = "Some value"
// ... 

var isCompatible = await TestItemAsync(item, indexName);
if (isCompatible)
{
    await DeleteItemAsync(item, indexName);
}
else 
{
    await DeleteIndexAsync<T>(indexName);
    await CreateIndexAsync<T>(indexName);
}

要实际验证兼容性,请确保使用一些值填充您的项目。在这个例子中,为了例子的缘故,我硬编码了一些值。在实际使用中,我使用了一个 Mock 框架,它用一些随机样本值填充我的项目的每个 属性,但我不想给人留下这个用例需要第三方组件的印象。