elasticsearch - 如何在 elasticsearch 中真正重新索引数据

标签 elasticsearch reindex

我添加了新的映射(主要是现有字段的 not_analyzed 版本)我现在必须弄清楚如何重新索引现有数据。我尝试按照 Elasticsearch 网站上的指南进行操作,但这太令人困惑了。我也尝试过使用插件(elasticsearch-reindex、allegro/elasticsearch-reindex-tool)。 我看过ElasticSearch - Reindexing your data with zero downtime这是一个类似的问题。我希望不必依赖外部工具(如果可能的话)并尝试使用批量 API(与原始插入一样)

我可以轻松地重建整个索引,因为它实际上是一个只读数据,但如果我在生产中使用它时想要添加更多字段等,那么从长远来看,这不会真正起作用。 我想知道是否有人知道适合 ES 新手的易于理解/遵循的解决方案或步骤。我使用的是版本 2 并使用 Windows。

最佳答案

Re-indexing就是读取数据,删除elasticsearch中的数据,重新摄取数据。没有像“就地更改现有数据的映射”这样的事情。您提到的所有重新索引工具都只是读取->删除->摄取的包装器。
您始终可以调整新索引的映射并稍后添加字段。所有新字段都将根据此映射编制索引。如果您无法控制新字段,也可以使用动态映射。
看看Change default mapping of string to "not analyzed" in Elasticsearch查看如何使用动态映射获取字符串的 not_analyzed 字段。

重新编制索引非常昂贵。更好的方法是创建一个新索引并删除旧索引。要实现零停机时间,请为所有客户使用索引别名。想想一个名为“data-version1”的索引。步骤:

  • 创建你的索引“data-version1”并给它一个名为“data”的别名
  • 仅在所有客户端应用程序中使用别名“data”
  • 更新您的映射:创建一个名为“data-version2”的新索引(使用新映射)并将所有数据放入(您可以为此使用_reindex API)
  • 从版本 1 切换到版本 2:在版本 1 上删除别名“数据”并在版本 2 上创建别名“数据”(或先创建,然后删除)。在这两个步骤之间的时间,您的客户将没有(或双重)数据。但是删除和创建别名之间的时间应该很短,您的客户应该不会认出它。

最好始终使用别名。

关于elasticsearch - 如何在 elasticsearch 中真正重新索引数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33858542/

相关文章:

python - 在 python pandas 中,如何重新采样和插入 DataFrame?

python - 如何交换 pandas 数据框上的索引和值

elasticsearch - Kibana可以在图表中显示原始记录信息吗?

Elasticsearch : Curator does not work

java - IntelliJ IDEA 不断重新索引

Elasticsearch 重新索引现有类型映射中的项目

elasticsearch - 在Elasticsearch中找到 friend 的 friend

ruby-on-rails - elasticsearch-rails gem - 完成建议器

c# - 如何将单个 .NET 类型映射到 ElasticSearch/NEST 中的多个嵌套对象类型?

postgresql - 安排 REINDEX 表 CONCURRENTLY 作业