5

Is there a way to iterate over a Solrj response such that the results are fetched incrementally during iteration, rather than returning a giant in-memory ArrayList?

Or do we have to resort to this:

    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;
    }

And while I'm on the topic, why does SolrQuery.setStart() require an integer, when SolrDocumentList.getStart()/getNumFound() return long?

4

2 回答 2

5

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

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

于 2011-02-20T16:25:08.160 回答
4

Caffeine 的原因是 Solr 旨在为您提供前 X 个搜索结果。期望是您将有一个“合理的”数字返回。如果 Solr 必须深入研究搜索结果(数以千计的结果),那么您就是在摸索 Solr 的设计目的。它会起作用,但查询响应将变得越来越慢,并且您必须深入搜索结果。 Solr 正在进行一些工作以提高此用例的效率,但我最近没有看到任何进展。

于 2011-02-20T17:19:21.390 回答