我正在处理8000万个文档的整个solr索引,并且我是通过分页来做到这一点的。
我从这里了解到,像这样在非常大的索引上使用参数start
进行分页是一个坏主意,相反,我应该使用如下所示的代码使用光标标记:
query.setSort("id", SolrQuery.ORDER.asc);
while (! done) {
q.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark);
QueryResponse rsp = solrServer.query(q);
String nextCursorMark = rsp.getNextCursorMark();
boolean hadEnough = doCustomProcessingOfResults(rsp);
if (hadEnough || cursorMark.equals(nextCursorMark)) {
done = true;
}
cursorMark = nextCursorMark;
}
但是,这要求查询首先对 uniqueKey 字段上的整个索引进行排序,该字段定义为:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
,其操作需要大量内存,而我的计算机没有足够的内存来处理这个问题。它会生成"内存不足"错误。
我想知道是否有任何解决方法?提前非常感谢。
只是一个更新,非常感谢 MatsLindh 的输入。
如果您遇到这样的相同问题,即 (1( 出于某种原因您想将整个索引导出到某个地方;(2(您的索引非常大,例如,有数千万条记录;(3(您没有在任何字段上使用"docValues"对它们进行索引,这意味着您无法使用更有效的光标标记或导出处理程序;(4(并且您没有足够的内存将"开始"和"行"参数与Solr一起使用。
解决方案是直接使用Lucene IndexReader来绕过solr。我可以报告速度提高的数量级。使用这种方法导出 9000 万条记录仅用了 3 个小时。以前当我使用带有"开始"和"行"的 Solr 时,仅导出 1600 万>24 小时。