SolrServer的以下实现之间有什么区别:
ConcurrentUpdateSolrServer
HttpSolrServer
CommonsHttpSolrServer
(注意:现在是否已弃用?)如documentation中所述:
仅建议将ConcurrentUpdateSolrServer与/ update请求一起使用。 HttpSolrServer类更适合查询接口。
ConcurrentUpdateSolrServer的文档建议将其用于更新,将HttpSolrServer用于查询。为什么是这样?
目前我正在使用HttpSolrServer
进行更新,使用ConcurrentUpdateSolrServer
进行更新会带来显着的性能提升吗?
答案 0 :(得分:3)
我们目前在2017年,Solr社区已将SolrServer
重命名为SolrClient,目前我们有4个实施:
CloudSolrClient
ConcurrentUpdateSolrClient
HttpSolrClient
LBHttpSolrClient
文档建议使用ConcurrentUpdateSolrClient
,因为它会将所有更新请求缓冲到final BlockingQueue<Update> queue;
,因此更新的操作时间将少于使用HttpSolrClient
的操作时间,其行为与此类似 - 只要它得到更新请求它立即触发它。当然,我们信任文档,但是得到这个答案会很容易,这就是为什么我做了一些性能测试。
但是,首先我将描述客户端的不同操作。如果您正在使用SolrClient的add
操作,那么如果要创建HttpSolrClient
或ConcurrentUpdateSolrClient
则没有区别,因为两种方法都会这样做。 ConcurrentUpdateSolrClient
只有在您明确地执行UpdateRequest
索引维基百科标题(code)的测试结果: 我的机器是:Intel i5-4670S 3.1 Ghz 16 Gb RAM
ConcurrentUpdateSolrClient (5 threads, 1000 queue size) - 200 seconds
ConcurrentUpdateSolrClient (5 threads, 10000 queue size) - 150 seconds
ConcurrentUpdateSolrClient (10 threads, 1000 queue size) - 100 seconds
ConcurrentUpdateSolrClient (10 threads, 10000 queue size) - 30 seconds
HttpSolrClient (no bulk) - 7000 seconds
HttpSolrClient (bulk 1000 docs) - 150 seconds
HttpSolrClient (bulk 10000 docs) - 80 seconds
要点:
如果您以类似的方式使用客户端,例如:client.add(doc);
比ConcurrentUpdateSolrClient
执行速度至少快10-20倍,因为使用了ThreadPool和Queue(又称批量操作)
如果您正在使用HttpSolrClient
,您仍然可以通过手动创建多个客户端,运行其他线程以及使用某些中间存储(如List)来模仿此行为。它肯定会提高性能,但需要额外的代码。
数字很可能没什么意义,但我希望它能给出一些原始比较。