我正在处理8000万份文档的全部Solr索引,并且通过分页进行。
我从here获悉,使用参数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" />
,其操作需要大量内存,而我的计算机没有足够的内存来处理该内存。它会产生“内存不足”错误。
我想知道是否有任何解决方法?预先非常感谢。
答案 0 :(得分:1)
仅是更新,非常感谢MatsLindh的投入。
如果您遇到类似这样的问题,即(1)您出于某种原因希望将整个索引导出到某个地方; (2)您的索引非常大,例如有数千万条记录; (3)您没有在任何字段上使用'docValues'对其进行索引,这意味着您无法使用更高效的光标标记或导出处理程序; (4)并且您没有足够的内存来在solr中使用'start'和'rows'参数。
解决方案是直接使用Lucene IndexReader绕过solr。而且我可以报告数量级的速度改进。使用这种方法仅用了3个小时就导出了9000万条记录。在我之前使用带有“开始”和“行”的Solr时,花了超过24小时才出口了1600万。