使用commitWithin的Solr性能没有意义

时间:2014-02-12 13:48:36

标签: performance solr commit solrj

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

我正在测试3个用例:

  1. 根本没有索引 - 发布2000个文档约45秒
  2. 包含索引 - 每次添加后提交。 ~8分钟(!)发布和索引2000个文件
  3. 包含索引 - commitWithin 1ms~55秒(!)发布和索引2000个文档
  4. 第三个结果没有任何意义,我希望这个行为与第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
    

1 个答案:

答案 0 :(得分:4)

根据这个维基:

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

commitWithin默认是软提交。软件提交在使添加的文档立即可搜索方面非常有效。但!他们还没有在磁盘上。这意味着文档被提交到RAM中。在此设置中,您将使用updateLog作为solr实例容错。

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