【问题标题】:Ways to improve first time indexing in ElasticSearch在 ElasticSearch 中改进首次索引的方法
【发布时间】:2013-08-19 21:50:38
【问题描述】:

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

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

谢谢, 埃里克

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢达米安。是的,我为类型定义了映射,甚至使用了 refresh_interval。事实上,我最初被“欺骗”认为将 refresh_interval 设置为 -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,并在您完成后设置回默认值 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 时间。

    【讨论】:

    • 谢谢詹姆斯。此信息很有帮助,我将查看 merge.policy.merge_factor 和参考资料。非常感谢。
    • @James 可以提供当前es的官方链接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多