有什么区别:ConcurrentUpdateSolrServer vs HttpSolrServer vs CommonsHttpSolrServer?

时间:2014-05-13 18:40:31

标签: java solr lucene solrj information-retrieval

SolrServer的以下实现之间有什么区别:

  1. ConcurrentUpdateSolrServer
  2. HttpSolrServer
  3. CommonsHttpSolrServer(注意:现在是否已弃用?)
  4. documentation中所述:

      

    仅建议将ConcurrentUpdateSolrServer与/ update请求一起使用。 HttpSolrServer类更适合查询接口。

    ConcurrentUpdateSolrServer的文档建议将其用于更新,将HttpSolrServer用于查询。为什么是这样?

    目前我正在使用HttpSolrServer进行更新,使用ConcurrentUpdateSolrServer进行更新会带来显着的性能提升吗?

1 个答案:

答案 0 :(得分:3)

我们目前在2017年,Solr社区已将SolrServer重命名为SolrClient,目前我们有4个实施:

  1. CloudSolrClient
  2. ConcurrentUpdateSolrClient
  3. HttpSolrClient
  4. LBHttpSolrClient
  5. 文档建议使用ConcurrentUpdateSolrClient,因为它会将所有更新请求缓冲到final BlockingQueue<Update> queue;,因此更新的操作时间将少于使用HttpSolrClient的操作时间,其行为与此类似 - 只要它得到更新请求它立即触发它。当然,我们信任文档,但是得到这个答案会很容易,这就是为什么我做了一些性能测试。

    但是,首先我将描述客户端的不同操作。如果您正在使用SolrClient的add操作,那么如果要创建HttpSolrClientConcurrentUpdateSolrClient则没有区别,因为两种方法都会这样做。 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
    

    要点:

    1. 如果您以类似的方式使用客户端,例如:client.add(doc);ConcurrentUpdateSolrClient执行速度至少快10-20倍,因为使用了ThreadPool和Queue(又称批量操作)

    2. 如果您正在使用HttpSolrClient,您仍然可以通过手动创建多个客户端,运行其他线程以及使用某些中间存储(如List)来模仿此行为。它肯定会提高性能,但需要额外的代码。

    3. 数字很可能没什么意义,但我希望它能给出一些原始比较。