使用SolrJ via for循环更新Solr文档

时间:2017-11-07 06:05:13

标签: solr solrj

我有一个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是我的唯一键。 这里发生了什么问题?

1 个答案:

答案 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();