【问题标题】:How to safely recreate an index with .NET client Elasticsearch如何使用 .NET 客户端 Elasticsearch 安全地重新创建索引
【发布时间】:2019-08-20 22:13:24
【问题描述】:

我正在使用 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 所问的那样:

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

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

【问题讨论】:

  • 您在创作过程中期待什么样的问题?您想通知调用站点发生的问题还是继续尝试直到成功?
  • @Prolog 我有一个每 20 分钟运行一次的后台任务,并尝试重新创建索引。不过,我不太明白您的问题的答案如何在这里产生影响。 CreateIndex 可能由于多种原因而失败。但是,即使在成功的最佳情况下,在重新创建索引的同时,对该索引的所有搜索都将失败,因为它不存在。
  • 为什么要删除并重新创建索引而不是更新它?
  • @leandrojmp 我的数据不是附加的,即随着时间的推移,一些索引实体可能会被删除(或更新/添加)。另一方面,我拥有的数据量足够小,这种方法听起来是可行的。但是,我是弹性搜索的新手,很想知道是否有更好的方法。
  • 你能分享一个你的数据样本以及你是如何查询它的吗?在创建索引时,您无法阻止搜索失败,也许在索引名称中使用时间戳,并且仅在创建新索引后删除索引。

标签: c# elasticsearch nest


【解决方案1】:

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

  1. 创建版本化索引,例如my_index_v1
  2. 创建一个指向单个索引的别名,例如my_index 指向 my_index_v1 的别名
  3. 使用 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 不可写,并处理应用程序中批量索引的失败,可能会将那些未能被索引的文档排队并重试;您可能会检查批量索引的特定失败响应,并检查索引元数据以查看索引是否可写。

【讨论】:

猜你喜欢
  • 2015-11-10
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2016-10-25
  • 2011-01-20
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
相关资源
最近更新 更多