gpt4 book ai didi

elasticsearch - 有没有更聪明的方法来重新索引 elasticsearch?

转载 作者:行者123 更新时间:2023-11-29 02:42:59 25 4
gpt4 key购买 nike

我问是因为我们的搜索在解决问题时处于不断变化的状态,但是每次我们对索引进行更改(更改分词器或过滤器,或分片/副本的数量)时,我们都必须消除整个索引并将我们所有的 Rails 模型重新索引回 Elasticsearch ...这意味着我们必须考虑停机时间来重新索引我们所有的记录。

有没有我不知道的更聪明的方法?

最佳答案

我认为@karmi 是对的。但是,让我解释得更简单一些。我需要偶尔使用一些新属性或分析设置来升级生产模式。我最近开始使用下面描述的场景来进行实时、恒定负载、零停机索引迁移。您可以远程执行此操作。

步骤如下:

假设:

  • 您有索引 real1 和别名 real_writereal_read 指向它,
  • 客户端只写入real_write,只从real_read读取,
  • _source 文档属性可用。

1。新索引

使用您选择的新映射和设置创建 real2 索引。

2。编写器别名开关

使用以下批量查询开关写入别名。

curl -XPOST 'http://esserver:9200/_aliases' -d '
{
"actions" : [
{ "remove" : { "index" : "real1", "alias" : "real_write" } },
{ "add" : { "index" : "real2", "alias" : "real_write" } }
]
}'

这是原子操作。从此时起,real2 在所有节点上填充了新客户端的数据。读者仍然通过 real_read 使用旧的 real1。这就是最终一致性。

3。旧数据迁移

数据必须从 real1 迁移到 real2,但是 real2 中的新文档不能被旧条目覆盖。迁移脚本应该使用 bulk API 和 create 操作(不是 indexupdate)。我使用简单的 Ruby 脚本 es-reindex它有很好的 E.T.A.状态:

$ ruby es-reindex.rb http://esserver:9200/real1 http://esserver:9200/real2

更新 2017 您可以考虑新的 Reindex API而不是使用脚本。它有很多有趣的功能,如冲突报告等。

4。读者别名开关

现在 real2 是最新的并且客户正在写入它,但是他们仍然从 real1 读取。让我们更新阅读器别名:

curl -XPOST 'http://esserver:9200/_aliases' -d '
{
"actions" : [
{ "remove" : { "index" : "real1", "alias" : "real_read" } },
{ "add" : { "index" : "real2", "alias" : "real_read" } }
]
}'

5。备份和删除旧索引

写入和读取到 real2。您可以从 ES 集群备份和删除 real1 索引。

完成!

关于elasticsearch - 有没有更聪明的方法来重新索引 elasticsearch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13851044/

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