5

巨大なメモリ内を返すのではなく、反復中に結果が増分的にフェッチされるように、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()必要なのですか?integerSolrDocumentList.getStart()/getNumFound()long

4

2 に答える 2

5

そのコードは正しいように見えます。また、イテレータでラップして、クライアントコードが基になるページングについて何も知る必要がないようにすることもできます。

整数を要求することについてSolrQuery.setStart()、それは確かに奇妙に見えます、私はあなたが正しいと思います、そしてそれは同様に長いはずです。solr-userまたはlucene-devメーリングリストで質問してみてください。

于 2011-02-20T16:25:08.160 に答える
4

その理由は、Caffeineは、Solrが上位Xの検索結果を提供するように設計されているためです。あなたが返すために「合理的な」数を持っていることが期待されます。Solrが検索結果を(数千に)深く調べる必要がある場合は、Solrが設計された目的のために穀物をこすり合わせていることになります。それは機能しますが、クエリ応答は指数関数的に遅くなり、検索結果の奥深くまで遅くなります。 このユースケースをより効率的にするためにSolrで進行中の作業がいくつかありますが、最近は進展が見られません。

于 2011-02-20T17:19:21.390 に答える