Получить все результаты в Solr с помощью Solrj

Я хочу получить весь результат с помощью solrj, я добавляю 10 документов в Solr, я не получаю никаких исключений, но если я добавляю более 10 документов в Solr, я получаю исключение. Я ищу это, я получаю это исключение для этого в http://localhost:8983/solr/browse 10-й документ на первой странице, 11-й документ переходит на вторую страницу. Как я могу получить весь результат?

String qry="*:*";
                CommonsHttpSolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr");
      QueryResponse rsp=server.query(new SolrQuery(qry));
      SolrDocumentList docs=rsp.getResults();  
                        for(int i=0;i<docs.getNumFound();i++){

                            System.out.println(docs.get(i));                    
    }

Исключение в потоке "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: индекс: 10, размер: 10


person user527    schedule 24.12.2012    source источник


Ответы (4)


numFound дает вам общее количество результатов, соответствующих запросу.

Однако по умолчанию Solr возвращает только первые 10 результатов, которые контролируются параметром rows.< br> Вы пытаетесь выполнить итерацию по numFound, однако, поскольку возвращено только 10 результатов, это не удается.
Вы должны использовать параметр rows для итерации.

Для получения следующего набора результатов вам потребуется повторно запросить Solr с другим параметром start. . Это сделано для поддержки нумерации страниц, чтобы вам не приходилось извлекать все результаты за один раз, что является очень сложной операцией.

person Jayendra    schedule 24.12.2012

Более простой способ:

CloudSolrServer server = new CloudSolrServer(solrZKServerUrl);
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setRows(Integer.MAX_VALUE);
QueryResponse rsp;
rsp = server.query(query, METHOD.POST);
SolrDocumentList docs = rsp.getResults();
for (SolrDocument doc : docs) {
    Collection<String> fieldNames = doc.getFieldNames();
    for (String s: fieldNames) {
        System.out.println(doc.getFieldValue(s));
    }
}
person Chen Sheng-Lun    schedule 12.05.2015
comment
Чен, попробуй добавить больше деталей - person ANjaNA; 12.05.2015
comment
CloudSolrServer устарел, используйте CloudSolrClient stackoverflow.com/questions/50350965 / - person mourad m; 16.04.2020

Если вы реорганизуете свой код таким образом, он будет работать

String qry="*:*";
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setRows(Integer.MAX_VALUE); //Add me to avoid IndexOutOfBoundExc
CommonsHttpSolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr");
QueryResponse rsp=server.query(query);
SolrDocumentList docs=rsp.getResults();  
for(int i=0;i<docs.getNumFound();i++){
    System.out.println(docs.get(i));
            }

Ответ, почему это довольно просто.

В ответе сообщается, что существуют соответствующие документы getNumFound(), но если вы не укажете в своем запросе, сколько из них должен содержать ответ, этот предел автоматически устанавливается равным 10,

в итоге извлекаются только первые 10 документов из найденных документов getNumFound()

По этой причине в списке документов будет всего 10 элементов, и попытка получить i-й элементh с i > 9 (например, 10) приведет вас к

java.lang.IndexOutOfBoundsException

так же, как вы экспериментируете.

PS Я предлагаю вам использовать итератор for так же, как это сделал @Chen Sheng-Lun.

P.P.S. Сначала меня это тоже сводило с ума.

person FrancescoM    schedule 23.09.2015

person    schedule
comment
Привет - Добро пожаловать в StackOverflow! Было бы полезно иметь некоторые комментарии вместе с ответом, чтобы его было легче понять. - person Nilesh; 25.09.2014