有没有办法迭代 Solrj 响应,以便在迭代期间增量获取结果,而不是返回一个巨大的内存 ArrayList
?
或者我们必须诉诸于这个:
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
int fetchSize = 1000;
query.setRows(fetchSize);
QueryResponse rsp = server.query(query);
long offset = 0;
long totalResults = rsp.getResults().getNumFound();
while (offset < totalResults)
{
query.setStart((int) offset); // requires an int? wtf?
query.setRows(fetchSize);
for (SolrDocument doc : server.query(query).getResults())
{
log.info((String) doc.getFieldValue("title"));
}
offset += fetchSize;
}
当我谈到这个话题时,为什么
SolrQuery.setStart()
需要 integer
, 当 SolrDocumentList.getStart()/getNumFound()
返回 long
?
最佳答案
该代码看起来是正确的。您还可以将其包装在 Iterator 中,这样您的客户端代码就不必了解有关底层分页的任何信息。
关于 SolrQuery.setStart()
需要一个整数,它肯定看起来很奇怪,我认为你是对的,它也应该很长。尝试在 solr-user 上询问或 lucene-dev邮件列表。
关于Solr/SolrJ : how to iterate results without creating a giant ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051460/