Solr / SolrJ: как повторять результаты без создания гигантского ArrayList - PullRequest
5 голосов
/ 19 февраля 2011

Есть ли способ перебрать ответ 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?

Ответы [ 2 ]

5 голосов
/ 20 февраля 2011

Этот код выглядит правильно.Вы также можете обернуть его в итератор, чтобы ваш клиентский код не должен был ничего знать о лежащем в основе подкачке.и это должно быть долго.Попробуйте задать вопрос по спискам рассылки solr-user или lucene-dev .

4 голосов
/ 20 февраля 2011

Причина, кофеин, в том, что Solr создан для того, чтобы дать вам лучшие результаты поиска X. Ожидается, что у вас будет «разумное» число для возвращения. Если Solr нужно вникнуть в результаты поиска (в тысячи), вы потираете зерно для того, для чего Solr был разработан. Это будет работать, но ответ на запрос будет экспоненциально медленнее и медленнее, чем глубже в результатах поиска вы должны идти. В Solr уже ведется определенная работа по повышению эффективности этого варианта использования, но в последнее время я не вижу прогресса в этом.

...