使用solrj库更新(不替换)Solr数据

时间:2016-11-14 17:45:21

标签: solr solrj

假设我有一个当前结构的Solr索引:

<field name="id" type="string" indexed="true" stored="true" required="true"/>
<field name="field_1" type="string" indexed="true" stored="true"/>
<field name="field_2" type="string" indexed="true" stored="true"/>

已有一些数据。我想替换字段“field_1”中的数据,但字段“field_2”中的数据必须保持不变。 有一段时间我一直在使用curl whith json文件来完成这项任务。 json文件的例子是

[
"{"id":1,"field_1":{"set":"some value"}}"
 ]

此文件中的数据仅替换字段“field_1”中的值。

现在我必须和solrj库一样。 有一些代码片段可以解释我的尝试。

SolrInputDocument doc = new SolrInputDocument();
doc.addField("field_1", "some value");
documents.add(doc);

server = new ConcurrentUpdateSolrClient(solrServerUrl, solrQueueSize, solrThreadCount);
UpdateResponse resp = server.add(documents, solrCommitTimeOut);

当我运行此代码时,“field_1”的值变为“某个值”,但“field_2”的值变为null。 如何避免替换字段“field_2”中的值?

1 个答案:

答案 0 :(得分:1)

因为您正在进行全面更新,所以您正在使用新的文档覆盖整个以前的文档,该文档没有field2。

您需要按照此处的说明进行部分更新(向下滚动至SOLRJ评论): https://cwiki.apache.org/confluence/display/solr/Updating+Parts+of+Documents

  SolrJ code for Atomic Update
  String solrBaseurl = "http://hostname:port/solr";
  String collection = "mydocs";

  SolrClient client = new HttpSolrClient(solrBaseurl);
  SolrInputDocument doc = new SolrInputDocument();

  doc.addField("id", "test");
  Map<String, String> cmd1 = new HashMap<>();
  Map<String, String> cmd2 = new HashMap<>();
  cmd1.put("set", "newvalue");
  cmd2.put("add", "additionalvalue");
  doc.addField("field1", cmd1);
  doc.addField("field2", cmd2);
  client.add(collection, doc);