我有一个Solr索引文档,我想更新一些字段。但问题是,如果我正在更新单个文档,那么它将完美更新。但是相同的代码,如果我使用for循环来一起更新多个文档,那么它就会抛出错误。
以下是我更新单个文档的代码,它正在运行 -
SolrInputDocument doc = new SolrInputDocument();
HashMap<Integer, String> Id = new HashMap<>();
HashMap<Integer, String> Title = new HashMap<>();
HashMap<Integer, String> Name = new HashMap<>();
Id.put(0, 123);
Id.put(1, 345);
Title.put(0, "Title1");
Title.put(1, "Title2");
Name.put(0, "Tony");
Name.put(1, "Scarlet");
doc.addField("Id", Id.get(0));
doc.addField("Title", Title.get(0));
doc.addField("Name", Name.get(0));
solr.add(doc);
solr.commit();
现在,如果我使用for循环运行相同的代码 -
SolrInputDocument doc = new SolrInputDocument();
HashMap<Integer, String> Id = new HashMap<>();
HashMap<Integer, String> Title = new HashMap<>();
HashMap<Integer, String> Name = new HashMap<>();
Id.put(0, 123);
Id.put(1, 345);
Title.put(0, "Title1");
Title.put(1, "Title2");
Name.put(0, "Tony");
Name.put(1, "Scarlet");
for (int i =0; i<2; i++) {
doc.addField("Id", Id.get(i));
doc.addField("Title", Title.get(i));
doc.addField("Name", Name.get(i));
solr.add(doc);
solr.commit();
}
然后这会抛出错误 - “Document包含uniqueKey字段的多个值:Id = [123,345]”。 注意 - ID是我的唯一键。 这里发生了什么问题?
答案 0 :(得分:1)
您没有为每次迭代创建新的SolrDocument
,因此您只需向旧版本添加值;然后,循环的下一次迭代将导致为id
字段设置两个值,这将无效。
为要添加的每个文档创建一个新的InputDocument,并在添加两个文档后将提交移动到(无需在循环中提交每个文档)。
我还考虑将HashMap重写为表示您要索引的内容的单个对象,或者至少使用HashMap用“name”,“id”和“title”条目描述对象,然后存储列表中的那些哈希映射。
for (int i = 0; i < 2; i++) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("Id", Id.get(i));
doc.addField("Title", Title.get(i));
doc.addField("Name", Name.get(i));
solr.add(doc);
}
solr.commit();