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

Gol*_*Jam 6 java lucene solr information-retrieval solrj

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

  1. ConcurrentUpdateSolrServer
  2. HttpSolrServer
  3. CommonsHttpSolrServer (注意:这现在已经弃用了吗?)

文档中所述:

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

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

目前我正在使用HttpSolrServer所有内容,使用ConcurrentUpdateSolrServer更新会导致显着的性能提升吗?

Mys*_*ion 4

我们目前在 2017 年,Solr 社区更名SolrServerSolrClient,目前我们有 4 个实现:

  1. CloudSolrClient
  2. ConcurrentUpdateSolrClient
  3. HttpSolrClient
  4. LBHttpSolrClient

文档建议使用ConcurrentUpdateSolrClient,因为它将所有更新请求缓冲到final BlockingQueue<Update> queue;,因此更新的操作时间将少于使用HttpSolrClient,其行为如下 - 一旦收到更新请求,它就会立即触发它。当然,我们信任文档,但得到这个答案很容易,这就是我做了一些性能测试的原因。

不过,首先我将描述客户端的不同操作。如果您使用addSolrClient 的操作,则创建HttpSolrClient或没有什么区别ConcurrentUpdateSolrClient,因为两种方法都会执行相同的操作。ConcurrentUpdateSolrClient只有当你明确地做时才会发光UpdateRequest

索引维基百科标题的测试结果(代码):我的机器是: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
Run Code Online (Sandbox Code Playgroud)

概括:

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

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

  3. 数字很​​可能没有什么意义,但我希望它能提供一些原始的比较。