在我的应用程序中,我需要不时地重新索引所有数据。我注意到第一次索引数据所需的时间(通过批量索引)明显慢于后续的重新索引。在一种情况下,第一次执行索引需要大约2个小时,并且随后的索引需要大约15分钟(索引相同的数据)。
虽然第一次索引的2小时是合理的,但我很好奇为什么后续重新索引的迭代要快得多。更重要的是,我想知道我是否可以采取任何措施来改善第一次索引时的性能,例如:也许通过指出索引的大小等等。
谢谢, 埃里克
答案 0 :(得分:3)
您是否为类型定义了映射?如果没有,每次ES找到一个新字段时,必须更新映射(这会影响整个索引)。
在后续索引编制中,映射已完成。所以你可以做的是明确地映射你的类型。
此外,您可以通过将refresh_interval
设置为更高的值look at this benchmark来提高重新编制索引的速度。
答案 1 :(得分:2)
已修改以删除对merge_factor
的引用,因为它已在ES 2.0中删除:https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_20_setting_changes.html#_merge_and_merge_throttling_settings
正如 Damien 所示,您确实可以影响(批量)索引设置 - refresh_interval
可以暂时设置为-1
并重新设置为默认值{{1完成批量索引后。 要修改的另一个设置是 1s
;将其设置为较高的值,例如merge.policy.merge_factor
,然后在完成后返回默认值30
。
有很多关于优化批量索引的教程和邮件列表讨论,但是这里有一些正式的文档链接:
<击> 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时序。