删除索引的 Azure 搜索服务
Azure Search Service Deleting an Index
我对 Azure 搜索服务还很陌生,我正在按照我在网上找到的指南进行操作。在这些指南之一中,他们有这样的方法:
static void Main(string[] args)
{
IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
IConfigurationRoot configuration = builder.Build();
SearchServiceClient serviceClient = CreateSearchServiceClient(configuration);
var test = serviceClient.Indexes.GetClient("testindex");
Console.WriteLine("{0}", "Deleting index...\n");
DeleteHotelsIndexIfExists(serviceClient);
Console.WriteLine("{0}", "Creating index...\n");
CreateHotelsIndex(serviceClient);
ISearchIndexClient indexClient = serviceClient.Indexes.GetClient("hotels");
Console.WriteLine("{0}", "Uploading documents...\n");
UploadDocuments(indexClient);
ISearchIndexClient indexClientForQueries = CreateSearchIndexClient(configuration);
RunQueries(indexClientForQueries);
Console.WriteLine("{0}", "Complete. Press any key to end application...\n");
Console.ReadKey();
}
所以上面的思路是如果有一个索引就删除,然后创建一个新的索引。然后生成并上传文件,最后 运行 进行搜索。现在这一切对我来说是如何工作的,但让我烦恼的一件事是删除索引部分。从本质上讲,在我看来,他们建议始终删除索引,然后重新创建它。这让我很担心。
如果这是一个实时索引,那么我删除它哪怕是一秒钟,这是否意味着在该索引上调用搜索的服务将失败?我担心的另一件事是,在大多数情况下,我的数据将有 90% 相同,我会有一些更新和更新的记录,可能很少被删除。但是,如果我的数据库有一百万条记录,那么将其全部删除然后重新创建似乎是愚蠢的。
有没有更好的方法。有没有办法只更新索引中的文档而不是删除它?
所以我想这是一个由两部分组成的问题。 1.如果我删除了索引,在建新索引的时候是否会停止搜索功能? 2.有没有比只删除索引更好的方法。如果有更新的方法,你如何处理文档结构发生变化的场景,例如添加了新字段。
该示例旨在演示如何通过 .NET SDK 调用 Azure 搜索。它不应被视为最佳实践的示例。
回答您的具体问题:
- 删除索引将立即导致所有针对该索引的请求失败。您不应删除生产中的实时索引。此外,还没有索引的 backup/restore 功能,因此即使索引不存在,您也不应删除它,除非您可以从其他地方恢复数据。
- 如果您需要在不更新索引模式的情况下更新文档,您可以使用索引 API 的 "merge" 操作来实现。有一个教程涵盖了这个 here。如果您需要添加一个新字段,您可以在不删除和重新创建索引的情况下执行此操作——只需使用 .NET SDK 的
Indexes.CreateOrUpdate
方法之一。默认情况下,此操作不会导致任何索引停机。但是,如果您需要删除、重命名或更改现有字段的类型,或在字段上启用新行为(例如——使其可显示、可排序或成为建议者的一部分),您将需要创建一个新索引。出于这个原因,建议您的应用程序在索引名称上实现一个额外的间接层,以便您可以在需要时交换和重建索引。
我对 Azure 搜索服务还很陌生,我正在按照我在网上找到的指南进行操作。在这些指南之一中,他们有这样的方法:
static void Main(string[] args)
{
IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
IConfigurationRoot configuration = builder.Build();
SearchServiceClient serviceClient = CreateSearchServiceClient(configuration);
var test = serviceClient.Indexes.GetClient("testindex");
Console.WriteLine("{0}", "Deleting index...\n");
DeleteHotelsIndexIfExists(serviceClient);
Console.WriteLine("{0}", "Creating index...\n");
CreateHotelsIndex(serviceClient);
ISearchIndexClient indexClient = serviceClient.Indexes.GetClient("hotels");
Console.WriteLine("{0}", "Uploading documents...\n");
UploadDocuments(indexClient);
ISearchIndexClient indexClientForQueries = CreateSearchIndexClient(configuration);
RunQueries(indexClientForQueries);
Console.WriteLine("{0}", "Complete. Press any key to end application...\n");
Console.ReadKey();
}
所以上面的思路是如果有一个索引就删除,然后创建一个新的索引。然后生成并上传文件,最后 运行 进行搜索。现在这一切对我来说是如何工作的,但让我烦恼的一件事是删除索引部分。从本质上讲,在我看来,他们建议始终删除索引,然后重新创建它。这让我很担心。
如果这是一个实时索引,那么我删除它哪怕是一秒钟,这是否意味着在该索引上调用搜索的服务将失败?我担心的另一件事是,在大多数情况下,我的数据将有 90% 相同,我会有一些更新和更新的记录,可能很少被删除。但是,如果我的数据库有一百万条记录,那么将其全部删除然后重新创建似乎是愚蠢的。
有没有更好的方法。有没有办法只更新索引中的文档而不是删除它?
所以我想这是一个由两部分组成的问题。 1.如果我删除了索引,在建新索引的时候是否会停止搜索功能? 2.有没有比只删除索引更好的方法。如果有更新的方法,你如何处理文档结构发生变化的场景,例如添加了新字段。
该示例旨在演示如何通过 .NET SDK 调用 Azure 搜索。它不应被视为最佳实践的示例。
回答您的具体问题:
- 删除索引将立即导致所有针对该索引的请求失败。您不应删除生产中的实时索引。此外,还没有索引的 backup/restore 功能,因此即使索引不存在,您也不应删除它,除非您可以从其他地方恢复数据。
- 如果您需要在不更新索引模式的情况下更新文档,您可以使用索引 API 的 "merge" 操作来实现。有一个教程涵盖了这个 here。如果您需要添加一个新字段,您可以在不删除和重新创建索引的情况下执行此操作——只需使用 .NET SDK 的
Indexes.CreateOrUpdate
方法之一。默认情况下,此操作不会导致任何索引停机。但是,如果您需要删除、重命名或更改现有字段的类型,或在字段上启用新行为(例如——使其可显示、可排序或成为建议者的一部分),您将需要创建一个新索引。出于这个原因,建议您的应用程序在索引名称上实现一个额外的间接层,以便您可以在需要时交换和重建索引。