2014-02-12 22 views
2

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

我测试3用例:

  1. 没有索引的话 - 〜45秒后2000个文件包括
  2. 索引 - 每次提交后添加。约8分钟后和指数2000文档
  3. 索引包括(!) - commitWithin 1毫秒〜55秒后和指数2000文档

第三结果并没有任何意义,我希望(!)行为类似于第二点。起初我认为这些文档并没有真正提交,但实际上我可以通过在实验过程中执行一些查询(通过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 

回答

2

根据这个wiki:

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

的commitWithin是默认情况下的软提交。软提交非常有效,可以立即搜索添加的文档。但!他们还没有在磁盘上。这意味着这些文件正在投入到RAM中。在这个设置中,你可以使用updateLog来实现Solr实例的崩溃容限。

你在第2点做的是硬性提交,即将添加的文档刷新到磁盘。在每次添加文档后执行此操作都非常昂贵。所以,相反,发布一堆文件并发布一个硬提交,甚至让你自动提交设置为一些合理的价值,如10分钟或1小时(取决于你的用户期望)。

+1

我认为这是Solr Wiki中唯一没有访问过的页面:-) 谢谢! – Vitaliy

+0

你的意思是什么,立即可搜索?我用commitWithin = 10000向我的索引添加了一个doc,期望它立即可用并在10秒内提交到磁盘。然而,文件并不是立即可用的,并且只有在10多年过去之后才出现。我在这里错过了什么吗? – preslavrachev

+0

@ user1107412我相信,你混合了两件事:soft-commit和commitWithin。 CommitWithin使用软提交并按照您的情况行事。您可以直接使用soft-commmit,而无需commitWithin。然后,solr会立即尝试提交,并立即让搜索者看到文档。 –