2015-11-22 29 views
3

重新索引数据我已经加入新的映射(主要是现有油田的not_analyzed版本),我现在必须弄清楚如何重新索引的现有数据。我试图按照弹性搜索网站上的指南,但这太混乱了。我也试过使用插件(elasticsearch-reindex,allegro/elasticsearch-reindex-tool)。 我看过ElasticSearch - Reindexing your data with zero downtime这是一个类似的问题。我希望不必依靠外部工具(如果可能),并尝试使用批量API(如原始插入)如何真正在elasticsearch

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

+0

您使用的是哪种版本的ElasticSearch?如果您使用的是2.3,则可以使用本机_reindex API。它可以做你正在寻找的东西。我不确定你指的是哪个指南(“弹性搜索网站上的指南”),但是这是reindex api上的文档:https://www.elastic.co/guide/en/elasticsearch/reference/current /docs-reindex.html 如果我没有弄错,可以重新索引到相同的索引中,从而有效地保留数据。有文档版本问题,但您必须注意。 –

+0

是的,几个月前我有这个问题,但我也注意到reindex API可用...无法验证是否可以重新索引到相同的索引 – metase

+0

看来你不能重新索引到同一索引 – metase

回答

0

重新标定装置来读取数据,在elasticsearch删除数据,并再次摄取数据。没有像“改变现有数据映射到位”这样的事情。您提到的所有重新索引工具都只是read-> delete->摄取的包装器。
您可以随时调整新索引的映射并稍后添加字段。所有的新字段都将根据这个映射进行索引。或者如果您不控制新字段,则使用动态映射。
查看Change default mapping of string to "not analyzed" in Elasticsearch,了解如何使用动态映射获取字符串的not_analyze字段。

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

  • 创建索引“的数据VERSION1”,并给它命名为“数据”
  • 只使用别名“数据”,在所有的客户端应用程序
  • 更新您的映射一个别名:创建一个名为“数据版本2”,并把所有的数据在
  • 新指数(用新的映射)切换从VERSION1到版本2:滴上VERSION1别名“数据”和创建版本2的别名“数据”(或先创建,然后放下)。在这两个步骤之间的时间您的客户将没有(或双重)数据。但是在删除和创建别名之间的时间应该很短,您的客户不应该认出它。

这是很好的做法,始终使用别名。

+0

感谢您的回复。我想更倾向于“零宕机”的方法。我可以再次推入另一个数据集,这需要15-20分钟的时间,并且新版本的映射既有分析域也有未分析域(这是备份计划)。真的,我想探索另一种在生产时不必这样做的选择 – metase

+0

只有在创建新索引时才能添加新的映射 - 抱歉,在我的文章中不清楚。我在上面添加了这个。大多数用户在每个时间段都有单独的指数(可以说每天)。然后,新的字段和/或新的映射应用于所有新创建的索引。我还在帖子中增加了一些关于零宕机的想法。 – dtrv

0

我面临同样的问题。但我找不到任何资源来更新当前的索引映射和分析器。我的建议是使用scroll and scan api并用新映射和新字段将数据重新索引到新索引。

0

随着版本2.3.4新的API _reindex是否可用它将做什么它说。基本用法是

{ 
    "source": { 
     "index": "currentIndex" 
    }, 
    "dest": { 
     "index": "newIndex" 
    } 
} 
+0

您可以从“currentIndex”重新索引到临时索引,然后返回到“currentIndex”。您可以使用op_type和version_type参数来控制处理重复/覆盖数据的方式。 –

+0

这就是我最终做的 – metase