如何使用 .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 所问:
我的数据不是加法的,即随着时间的推移,一些索引实体需要添加,一些需要更新,一些需要删除。另一方面,我拥有的数据量足够小,这种方法听起来可行。
但是,我是弹性搜索的新手,很想知道是否有更好的方法。
您可能要考虑使用索引别名和
- 创建版本索引,例如
my_index_v1
- 创建一个指向单个索引的别名,例如
my_index
指向 my_index_v1
的别名
- 使用
my_index
别名进行批量索引和搜索
然后当希望删除并创建索引时,
- 创建新索引
my_index_v2
- 向别名 API 发送请求,从
my_index_v1
中删除 my_index
别名并添加到 my_index_v2
- 删除
my_index_v1
这样一来,任何应用程序和操作都可以使用索引别名。使用这种方法,您打算索引到 my_index_v2
中的数据实际上可能索引到 my_index_v1
中,因为批量索引请求是在创建 my_index_v2
之前处理的,索引别名是换了。如果这是一个问题,那么您可以在创建 my_index_v2
并交换别名时使 my_index_v1
不可写,并处理应用程序中的批量索引失败,可能会使那些未能被索引的文档排队再试一次;您可能会检查来自批量索引的特定失败响应,并检查索引元数据以查看索引是否可写。
我正在使用 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 所问:
我的数据不是加法的,即随着时间的推移,一些索引实体需要添加,一些需要更新,一些需要删除。另一方面,我拥有的数据量足够小,这种方法听起来可行。
但是,我是弹性搜索的新手,很想知道是否有更好的方法。
您可能要考虑使用索引别名和
- 创建版本索引,例如
my_index_v1
- 创建一个指向单个索引的别名,例如
my_index
指向my_index_v1
的别名
- 使用
my_index
别名进行批量索引和搜索
然后当希望删除并创建索引时,
- 创建新索引
my_index_v2
- 向别名 API 发送请求,从
my_index_v1
中删除my_index
别名并添加到my_index_v2
- 删除
my_index_v1
这样一来,任何应用程序和操作都可以使用索引别名。使用这种方法,您打算索引到 my_index_v2
中的数据实际上可能索引到 my_index_v1
中,因为批量索引请求是在创建 my_index_v2
之前处理的,索引别名是换了。如果这是一个问题,那么您可以在创建 my_index_v2
并交换别名时使 my_index_v1
不可写,并处理应用程序中的批量索引失败,可能会使那些未能被索引的文档排队再试一次;您可能会检查来自批量索引的特定失败响应,并检查索引元数据以查看索引是否可写。