作为我的 DSpace 实例的一部分,我有一个 SOLR 存储库,其中包含 1200 万条使用统计记录。一些记录已通过多次 SOLR 升级迁移,不符合当前架构。其中 500 万条记录缺少我的架构中指定的唯一 id 字段。
DSpace 系统提供了一种机制,可以使用以下代码将旧的使用统计记录分片到单独的 solr 分片中。
空间分片逻辑:
for (File tempCsv : filesToUpload) {
//Upload the data in the csv files to our new solr core
ContentStreamUpdateRequest contentStreamUpdateRequest = new ContentStreamUpdateRequest("/update/csv");
contentStreamUpdateRequest.setParam("stream.contentType", "text/plain;charset=utf-8");
contentStreamUpdateRequest.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
contentStreamUpdateRequest.addFile(tempCsv, "text/plain;charset=utf-8");
statisticsYearServer.request(contentStreamUpdateRequest);
}
statisticsYearServer.commit(true, true);
当我尝试运行此进程时,我收到一条错误消息,因为我的每条记录都缺少唯一 id 字段,并且该进程删除了 500 万条记录。
我试图替换这 500 万条记录,以强制在每条记录上创建一个唯一的 id 字段。这是我正在运行以触发该更新的代码。查询 myQuery 迭代数千条记录的批次。
我的记录修复过程:
ArrayList<SolrInputDocument> idocs = new ArrayList<SolrInputDocument>();
SolrQuery sq = new SolrQuery();
sq.setQuery(myQuery);
sq.setRows(MAX);
sq.setSort("time", ORDER.asc);
QueryResponse resp = server.query(sq);
SolrDocumentList list = resp.getResults();
if (list.size() > 0) {
for(int i=0; i<list.size(); i++) {
SolrDocument doc = list.get(i);
SolrInputDocument idoc = ClientUtils.toSolrInputDocument(doc);
idocs.add(idoc);
}
}
server.add(idocs);
server.commit(true, true);
server.deleteByQuery(myQuery);
server.commit(true, true);
运行此过程后,存储库中的所有记录都分配了一个唯一的 ID。我接触过的记录也有一个_version_字段。
当我尝试重新运行上面包含的分片进程时,我收到与_version_字段值相关的错误,并且进程终止。如果我尝试显式设置版本字段,我会收到相同的错误。
这是我在调用分片进程时遇到的错误消息:
Exception: version conflict for e8b7ba64-8c1e-4963-8bcb-f36b33216d69 expected=1484794833191043072 actual=-1
org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: version conflict for e8b7ba64-8c1e-4963-8bcb-f36b33216d69 expected=1484794833191043072 actual=-1
at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:424)
at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:180)
我的目标是修复我的记录,以便我可以运行 DSpace 提供的分片进程。您能否推荐我应该采取的任何其他措施来修复这些记录?