使用concurrentUpdateSolrServer和原子更新丢失SOLR更新

时间:2013-11-27 17:40:04

标签: solr solrj

我有一个单独的SOLR服务器(不是云),每15秒自动提交一次。 在将许多文档编入索引之后,我现在想要对某些字段进行更改。 由于这个变化非常大,我需要用~40个线程来完成。

我为所有线程使用单个concurrentUpdateSolrServer。我将此服务器设置为刷新每1000个文档并在内部使用48个线程。 (不是我的主题)。

因为我想在多值字段中添加值,所以我使用了原子添加。

我在更新~5000个文档后停止了这个过程。我在退出之前调用commit + blockUntilFinshed + shutdown。

当我查询SOLR服务器时 - 只有~200个文件似乎得到了更新。

我也只用了一个线程(我的线程 - 在更新服务器上仍然是48个)并且仍然存在同样的问题。

当我从concurrentUpdateSolrServer更改为HttpSolrServer(1个线程)时,它可以正常工作。

1 个答案:

答案 0 :(得分:3)

好的解决了它:

错误是我有一个我想更新的SolrDocument - 所以我将它转换为SolrInputDocumnt:

SolrInputDocument inputDoc =   
org.apache.solr.client.solrj.util.ClientUtils.toSolrInputDocument(solrDoc);
Map<String, String> partialUpdate = new HashMap<String, String>();
partialUpdateOut.put("add", "newAddedValue");
inputDoc.addField("fieldName", partialUpdate);
concurrentServer.add(inputDoc);

但我想,因为SolrDocument里面有一个版本数据 - 它搞砸了更新。

正确的方法是只按照以下文档ID进行更新:

SolrInputDocument inputDoc = new SolrInputDocument();
inputDoc.addField("id", solrDoc.getFieldValue("id"));
Map<String, String> partialUpdate = new HashMap<String, String>();
partialUpdateOut.put("add", "newAddedValue");
inputDoc.addField("fieldName", partialUpdate);
concurrentServer.add(inputDoc);

谢谢!