我正在运行一个非常简单的性能实验,我将 2000 个文档发布到我的应用程序中。
谁将它们持久化到关系数据库并将它们发送到 Solr 进行索引(同步,在同一请求中)。
我正在测试 3 个用例:
第三个结果没有任何意义,我希望行为类似于第 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/