0

在我的应用程序中,我需要不时重新索引所有数据。我注意到第一次(通过批量索引)索引数据所需的时间比随后的重新索引要慢得多。在一种情况下,第一次执行索引大约需要 2 小时,随后的索引大约需要 15 分钟(索引相同的数据)。

虽然第一次索引 2 小时是合理的,但我很好奇为什么后续迭代重新索引的速度明显更快。更重要的是,我想知道是否有什么办法可以提高第一次索引时的性能,例如,也许通过指示索引的大小等。

谢谢,埃里克

4

2 回答 2

3

您是否为您的类型定义了映射?如果没有,每次 ES 找到一个新字段时,必须更新映射(这会影响整个索引)。

在随后的索引中,映射已经完成。所以你可以做的是显式地映射你的类型。

refresh_interval此外,您可以通过将 设置为更高的值来提高重新索引的速度,请查看此基准

于 2013-08-20T07:53:39.817 回答
2

编辑删除引用,merge_factor因为它已在 ES 2.0 中删除https ://www.elastic.co/guide/en/elasticsearch/reference/current/break_20_setting_changes.html#_merge_and_merge_throttling_settings


正如Damien所指出的,您确实可以影响(批量)索引设置 -refresh_interval可以设置为临时设置并在完成批量索引后 -1设置回默认值。另一个要修改的设置是; 将其设置为更高的值,例如然后返回默认值一旦完成。1smerge.policy.merge_factor3010

有许多关于优化批量索引的教程和邮件列表讨论,但这里有一些官方文档链接可以开始:

http://www.elasticsearch.org/guide/reference/index-modules/merge/ http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings/

如果您尚未调整 JVM 的内存设置,则应该这样做。虽然特定于运行 Ubuntu 10.04 服务器的 512mb VPS,但这些设置 ( http://pastebin.com/mNUGQCLY ) 应该为您指明正确的方向。基本上,在启动时为 Elasticsearch 分配所需数量的 RAM 可以改善 JVM 内存分配/GC 时间。

于 2013-08-20T15:58:05.887 回答