gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:58 25 4
gpt4 key购买 nike

我正在使用 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 的要求重新创建 索引:

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

但是,我是 Elasticsearch 的新手,很想知道是否有更好的方法。

最佳答案

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

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

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

  1. 创建新索引my_index_v2
  2. 向别名 API 发送请求以删除 my_index来自 my_index_v1 的别名并添加到 my_index_v2
  3. 删除my_index_v1

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

关于c# - 如何使用 .NET 客户端 Elasticsearch 安全地重新创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57484500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com