Solr/SolrJ:如何在不创建巨型ArrayList的情况下迭代结果

Geo*_*old 5 solr solrj

有没有办法迭代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;
    }
Run Code Online (Sandbox Code Playgroud)

虽然我是关于这个主题的,但为什么在返回时SolrQuery.setStart()需要一个?integerSolrDocumentList.getStart()/getNumFound()long

Mau*_*fer 5

该代码看起来正确.您还可以将其包装在Iterator中,以便您的客户端代码不必知道有关底层分页的任何信息.

关于SolrQuery.setStart()要求整数,它肯定看起来很奇怪,我认为你是对的,它应该是一个很长的.尝试询问solr-userlucene-dev邮件列表.