使用 solrj 库更新(而不是替换)Solr 数据
Update (not replace) Solr data with solrj library
假设,我有一个当前结构的 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
和 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"的值变成了"some value",但是"field_2"的值变成了null。
如何避免替换字段 "field_2"?
中的值
因为您正在进行完全更新,所以您所做的是用一个没有 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);
假设,我有一个当前结构的 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
和 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"的值变成了"some value",但是"field_2"的值变成了null。 如何避免替换字段 "field_2"?
中的值因为您正在进行完全更新,所以您所做的是用一个没有 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);