Solr语言 - 大索引上的分页 - 游标功能需要包含唯一键字段连接符的排序



我正在处理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 小时。

最新更新