Solr/SolrJ:如何迭代结果而不创建巨大的ArrayList

Solr/SolrJ:如何迭代结果而不创建巨大的ArrayList,solr,solrj,Solr,Solrj,有没有一种方法可以迭代Solrj响应,从而在迭代过程中以增量方式获取结果,而不是在内存中返回一个巨大的ArrayList 还是我们必须求助于: SolrQuery query = new SolrQuery(); query.setQuery("*:*"); int fetchSize = 1000; query.setRows(fetchSize); QueryResponse rsp = server.query(query); long o

有没有一种方法可以迭代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 query=new SolrQuery();
query.setQuery(“*:*”);
int fetchSize=1000;
setRows(fetchSize);
QueryResponse rsp=server.query(查询);
长偏移=0;
long totalResults=rsp.getResults().getNumFound();
while(偏移量<总结果)
{
query.setStart((int)offset);//需要int?wtf?
setRows(fetchSize);
for(SolrDocument文档:server.query(query.getResults())
{
log.info((字符串)doc.getFieldValue(“title”);
}
偏移量+=取数大小;
}

当我谈到这个话题时,为什么
SolrQuery.setStart()
需要一个
integer
,而
SolrDocumentList.getStart()/getNumFound()
返回
long

这个代码看起来是正确的。您还可以将其包装在迭代器中,这样您的客户机代码就不必知道任何有关底层分页的信息


关于
SolrQuery.setStart()
需要一个整数,它看起来确实很奇怪,我认为你是对的,它也应该是一个长的。试着在搜索列表或邮件列表上提问。

咖啡因的原因是Solr旨在为您提供前X个搜索结果。我们的期望是,您将有一个“合理”的数字返回。如果Solr必须深入查看搜索结果(数千个),那么你就是在摸索Solr的设计初衷。这会起作用,但查询响应将以指数级的速度变慢,并且随着搜索结果的深入,速度会越来越慢。

但是,是否有可能?是否有可能以有效的方式进行深度分页?是的,一旦我链接的问题得到解决。