首页 > 解决方案 > Azure 搜索架构迁移

问题描述

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

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

标签: azureasp.net-coreazure-cognitive-search

解决方案


这取决于您是通过 SDK 推送内容,还是使用预建索引器之一从受支持的内容源中提取内容。使用 SDK,您可以向模型添加新属性,如本文所述:更新 Azure 搜索文档架构

注意:数据模型的更改可能需要更新重建索引。例如,添加新属性只需要和更新。但是,如果您更改可搜索、可过滤或可排序等设置,您将需要重新构建。有关详细信息,请参阅如何在 Azure 认知搜索中重建索引

通过推送进行兼容性探测

我首选的解决方案是对所有内容使用推送索引。为了测试索引中的数据模型是否兼容,我创建了一个示例项并提交给索引。如果索引中使用的模型不兼容,并且 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 框架,该框架使用一些随机样本值填充我的项目的每个属性,但我不想给人这种用例需要第三方组件的印象。


推荐阅读