Solr-在大索引上分页-游标功能需要一种包含uniqueKey字段断开器的排序

时间:2019-06-18 17:15:46

标签: solr solrj

我正在处理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" />

,其操作需要大量内存,而我的计算机没有足够的内存来处理该内存。它会产生“内存不足”错误。

我想知道是否有任何解决方法?预先非常感谢。

1 个答案:

答案 0 :(得分:1)

仅是更新,非常感谢MatsLindh的投入。

如果您遇到类似这样的问题,即(1)您出于某种原因希望将整个索引导出到某个地方; (2)您的索引非常大,例如有数千万条记录; (3)您没有在任何字段上使用'docValues'对其进行索引,这意味着您无法使用更高效的光标标记或导出处理程序; (4)并且您没有足够的内存来在solr中使用'start'和'rows'参数。

解决方案是直接使用Lucene IndexReader绕过solr。而且我可以报告数量级的速度改进。使用这种方法仅用了3个小时就导出了9000万条记录。在我之前使用带有“开始”和“行”的Solr时,花了超过24小时才出口了1600万。