【问题标题】:Solr/SolrJ: how to iterate results without creating a giant ArrayListSolr/SolrJ:如何在不创建巨大 ArrayList 的情况下迭代结果
【发布时间】:2011-06-30 09:40:54
【问题描述】:

有没有办法迭代 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

【问题讨论】:

    标签: solr solrj


    【解决方案1】:

    Caffeine 的原因是 Solr 旨在为您提供前 X 个搜索结果。期望是您将有一个“合理的”数字返回。如果 Solr 必须深入研究搜索结果(数以千计的结果),那么您就是在摸索 Solr 的设计目的。它会起作用,但查询响应将变得越来越慢,您必须深入搜索结果。 There is some ongoing work in Solr to make this use-case more efficient but I've seen no progress on it lately.

    【讨论】:

    • 不过,不应该是可能吗?
    • 可以有效地进行深度分页吗?是的,一旦我链接到的问题得到解决。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 1970-01-01
      • 2016-09-02
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多