如何使用 .NET 客户端 Elasticsearch 安全地重新创建索引

How to safely recreate an index with .NET client Elasticsearch

我正在使用 Elasticsearch NEST 6.x,在我的索引器中,我想删除现有索引并在我的数据更新时重新创建一个新索引。这是我目前拥有的:

this.elasticClient.DeleteIndex(indexName, x => x.RequestConfiguration(y => y.AllowedStatusCodes(404)));
this.elasticClient.CreateIndex(indexName, x => x.Settings(s => s.NumberOfShards(1)).Mappings(ms => ms.Map<T>(m => m.AutoMap())));
this.elasticClient.Bulk(b => b.Index(indexName).IndexMany(entities));

此方法的问题在于,如果 delete 成功但 create 失败,则该索引在重新创建之前将不可用。此外,即使在成功的最佳情况下,在重新创建索引的同时,对该索引的所有搜索也将失败,因为它不存在。有没有更好的办法?

编辑:

我认为值得一提的是为什么我 重新创建 索引,正如@leandrojmp 所问:

我的数据不是加法的,即随着时间的推移,一些索引实体需要添加,一些需要更新,一些需要删除。另一方面,我拥有的数据量足够小,这种方法听起来可行。

但是,我是弹性搜索的新手,很想知道是否有更好的方法。

您可能要考虑使用索引别名和

  1. 创建版本索引,例如my_index_v1
  2. 创建一个指向单个索引的别名,例如my_index 指向 my_index_v1
  3. 的别名
  4. 使用 my_index 别名进行批量索引和搜索

然后当希望删除并创建索引时,

  1. 创建新索引my_index_v2
  2. 向别名 API 发送请求,从 my_index_v1 中删除 my_index 别名并添加到 my_index_v2
  3. 删除my_index_v1

这样一来,任何应用程序和操作都可以使用索引别名。使用这种方法,您打算索引到 my_index_v2 中的数据实际上可能索引到 my_index_v1 中,因为批量索引请求是在创建 my_index_v2 之前处理的,索引别名是换了。如果这是一个问题,那么您可以在创建 my_index_v2 并交换别名时使 my_index_v1 不可写,并处理应用程序中的批量索引失败,可能会使那些未能被索引的文档排队再试一次;您可能会检查来自批量索引的特定失败响应,并检查索引元数据以查看索引是否可写。