performance - 使用 commitWithin 的 Solr 性能没有意义

标签 performance solr commit solrj

我正在运行一个非常简单的性能实验,我将 2000 个文档发布到我的应用程序中。
谁将它们持久化到关系数据库并将它们发送到 Solr 进行索引(同步,在同一请求中)。

我正在测试 3 个用例:

  • 根本没有索引 - 大约 45 秒发布 2000 个文档
  • 包括索引 - 每次添加后提交。约 8 分钟 (!) 发布和索引 2000 个文档
  • 包括索引 - 在 1ms ~55 秒 (!) 内提交和索引 2000 个文档

  • 第三个结果没有任何意义,我希望行为类似于第 2 点中的行为。起初我认为文档没有真正提交,但我实际上可以通过在实验期间执行一些查询来看到它们被添加(通过 solr Web UI)。

    我担心我错过了一些非常重要的东西。每次添加后提交是否有可能将性能降低 400 倍?!

    我用于第 2 点的代码:
    SolrInputDocument = // get doc
    SolrServer solrConnection = // get connection 
    solrConnection.add(doc);
    solrConnection.commit(); 
    

    作为第 3 点的代码:
    SolrInputDocument = // get doc
    SolrServer solrConnection = // get connection
    solrConnection.add(doc, 1); // According to API documentation I understand there is no need to call an explicit commit after this
    

    最佳答案

    根据这个维基:

    https://wiki.apache.org/solr/NearRealtimeSearch

    默认情况下,commitWithin 是软提交。软提交在使添加的文档可立即搜索方面非常有效。但!它们还没有在磁盘上。这意味着文档正在提交到 RAM 中。在此设置中,您将使用 updateLog 来容忍 solr 实例崩溃。

    您在第 2 点中所做的是硬提交,即将添加的文档刷新到磁盘。在每个文档添加之后执行此操作非常昂贵。因此,相反,发布一堆文档并发出硬提交,甚至将 autoCommit 设置为某个合理的值,例如 10 分钟或 1 小时(取决于您的用户期望)。

    关于performance - 使用 commitWithin 的 Solr 性能没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21729785/

    相关文章:

    git - 将补丁应用为提交而不更改提交的消息?

    git - 如何创建反射(reflect)另一个(发散)分支状态的提交?

    mysql - 在 Solr 中创建两个使用相同模式的实例的最佳方法是什么?

    python - Scrapy 与 Nutch

    使用 TeamCity 提交 svn

    MySQL 查询在复合键表上运行速度非常慢

    java - guava Table vs 多个 HashMap 的效率

    Python 代码优化(比 C 慢 20 倍)

    Jquery fadeIn 和 fadeOut 页面在加载之间生成白色页面闪烁

    search - Mysql 搜索与非文本搜索的搜索工具(CloudSearch、Sphinx、Solr..)