2013-08-19 26 views
0

在我的应用程序中,我需要不时重新编制所有数据的索引。我已经注意到,第一次索引数据所需的时间(通过批量索引)比后续的重新索引要慢得多。在一种情况下,首次执行索引需要大约2个小时,而后续索引需要大约15分钟(对相同数据编制索引)。改进ElasticSearch首次索引的方法

虽然第一次索引2小时是合理的,但我很好奇为什么后续迭代重新索引要快得多。更重要的是,我想知道是否有任何事情可以改善第一次索引时的性能,例如,也许表明该指数将有多大等

感谢, 埃里克

回答

2

编辑来引用重拳出击,以merge_factor因为已经去除ES 2.0https://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时序。

+0

谢谢詹姆斯。这些信息很有帮助,我将查看merge.policy.merge_factor和引用。非常感激。 – Eric

+0

@詹姆斯你可以提供最新的官方链接? – eyal

+1

@eyal,我已根据要求更新了答案。 –

3

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

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

另外,您可以通过将refresh_interval设置为更高的值来提高重新索引的速度,look at this benchmark

+0

谢谢达米安。是的,我有一个定义的类型映射,甚至使用refresh_interval。实际上,我最初被“欺骗”,认为将refresh_interval设置为-1会显着提高性能,但实际上是因为重新索引比第一次索引更快。 – Eric