通过 for 循环使用 SolrJ 更新 Solr 文档
Update Solr document using SolrJ via for loop
我有一个 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 contains multiple values for uniqueKey field: Id=[123, 345]"。
注意 - Id 是我的唯一键。
这里发生了什么问题?
您并没有为每次迭代创建一个新的 SolrDocument
,所以您只是向旧的添加值;循环的下一次迭代将导致为 id
字段设置两个值,这将不起作用。
为每个要添加的文档创建一个新的 InputDocument,并在添加两个文档后将提交移至(无需在循环中提交 each 文档) .
我还会考虑将我的 HashMap 重写为表示您要索引的内容的单个对象,或者至少使用 HashMap 来描述具有 "name"、"id" 和 [= 的对象23=] 条目,然后将这些哈希图存储在列表中。
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();
我有一个 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 contains multiple values for uniqueKey field: Id=[123, 345]"。 注意 - Id 是我的唯一键。 这里发生了什么问题?
您并没有为每次迭代创建一个新的 SolrDocument
,所以您只是向旧的添加值;循环的下一次迭代将导致为 id
字段设置两个值,这将不起作用。
为每个要添加的文档创建一个新的 InputDocument,并在添加两个文档后将提交移至(无需在循环中提交 each 文档) .
我还会考虑将我的 HashMap 重写为表示您要索引的内容的单个对象,或者至少使用 HashMap 来描述具有 "name"、"id" 和 [= 的对象23=] 条目,然后将这些哈希图存储在列表中。
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();