在我的应用程序中,我需要不时重新索引所有数据。我注意到第一次(通过批量索引)索引数据所需的时间比随后的重新索引要慢得多。在一种情况下,第一次执行索引大约需要 2 小时,随后的索引大约需要 15 分钟(索引相同的数据)。
虽然第一次索引 2 小时是合理的,但我很好奇为什么后续迭代重新索引的速度明显更快。更重要的是,我想知道是否有什么办法可以提高第一次索引时的性能,例如,也许通过指示索引的大小等。
谢谢,埃里克
在我的应用程序中,我需要不时重新索引所有数据。我注意到第一次(通过批量索引)索引数据所需的时间比随后的重新索引要慢得多。在一种情况下,第一次执行索引大约需要 2 小时,随后的索引大约需要 15 分钟(索引相同的数据)。
虽然第一次索引 2 小时是合理的,但我很好奇为什么后续迭代重新索引的速度明显更快。更重要的是,我想知道是否有什么办法可以提高第一次索引时的性能,例如,也许通过指示索引的大小等。
谢谢,埃里克
您是否为您的类型定义了映射?如果没有,每次 ES 找到一个新字段时,必须更新映射(这会影响整个索引)。
在随后的索引中,映射已经完成。所以你可以做的是显式地映射你的类型。
refresh_interval
此外,您可以通过将 设置为更高的值来提高重新索引的速度,请查看此基准。
编辑删除引用,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
设置回默认值。另一个要修改的设置是; 将其设置为更高的值,例如然后返回默认值一旦完成。1s
merge.policy.merge_factor
30
10
有许多关于优化批量索引的教程和邮件列表讨论,但这里有一些官方文档链接可以开始:
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 时间。