我有一个单独的SOLR服务器(不是云),每15秒自动提交一次。 在将许多文档编入索引之后,我现在想要对某些字段进行更改。 由于这个变化非常大,我需要用~40个线程来完成。
我为所有线程使用单个concurrentUpdateSolrServer。我将此服务器设置为刷新每1000个文档并在内部使用48个线程。 (不是我的主题)。
因为我想在多值字段中添加值,所以我使用了原子添加。
我在更新~5000个文档后停止了这个过程。我在退出之前调用commit + blockUntilFinshed + shutdown。
当我查询SOLR服务器时 - 只有~200个文件似乎得到了更新。
我也只用了一个线程(我的线程 - 在更新服务器上仍然是48个)并且仍然存在同样的问题。
当我从concurrentUpdateSolrServer更改为HttpSolrServer(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);
谢谢!