有没有一种方法可以迭代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-userlucene-dev邮件列表。

关于Solr/SolrJ : how to iterate results without creating a giant ArrayList,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5051460/

10-13 04:53