在我的应用程序中,我需要不时重新编制所有数据的索引。我已经注意到,第一次索引数据所需的时间(通过批量索引)比后续的重新索引要慢得多。在一种情况下,首次执行索引需要大约2个小时,而后续索引需要大约15分钟(对相同数据编制索引)。改进ElasticSearch首次索引的方法
虽然第一次索引2小时是合理的,但我很好奇为什么后续迭代重新索引要快得多。更重要的是,我想知道是否有任何事情可以改善第一次索引时的性能,例如,也许表明该指数将有多大等
感谢, 埃里克
在我的应用程序中,我需要不时重新编制所有数据的索引。我已经注意到,第一次索引数据所需的时间(通过批量索引)比后续的重新索引要慢得多。在一种情况下,首次执行索引需要大约2个小时,而后续索引需要大约15分钟(对相同数据编制索引)。改进ElasticSearch首次索引的方法
虽然第一次索引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
由于达表明,你确实可以影响(散装)索引设置 - 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)应该指向正确的方向。基本上,启动时将所需数量的RAM分配给Elasticsearch可以改进JVM内存分配/ GC时序。
是否定义为你的类型的映射?如果不是,每次ES找到一个新的字段,映射必须更新(并且这影响了整个索引)。
在随后的索引编制中,映射已经完成。所以你可以做的是显式映射你的类型。
另外,您可以通过将refresh_interval
设置为更高的值来提高重新索引的速度,look at this benchmark。
谢谢达米安。是的,我有一个定义的类型映射,甚至使用refresh_interval。实际上,我最初被“欺骗”,认为将refresh_interval设置为-1会显着提高性能,但实际上是因为重新索引比第一次索引更快。 – Eric
谢谢詹姆斯。这些信息很有帮助,我将查看merge.policy.merge_factor和引用。非常感激。 – Eric
@詹姆斯你可以提供最新的官方链接? – eyal
@eyal,我已根据要求更新了答案。 –