Solr: получить все записи

Я пытаюсь обновить версию Solr 4.x до версии 5.2.1 Solrcloud. Я написал следующий код, чтобы получить все результаты запроса Sorl, который хорошо работает в режиме единственного экземпляра Solr.

SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.addSort("agent_status", ORDER.desc);
query.addFilterQuery("account_id:\"" + accountId + "\"");
query.set("rows", Integer.MAX_VALUE);

Но код не будет работать в реализации SolrCloud. Выдает следующее исключение.

2015-08-14 16:44:45,648 ERROR [solr.core.SolrCore] - [http-8080-8] : java.lang.NegativeArraySizeException
at org.apache.lucene.util.PriorityQueue.<init>(PriorityQueue.java:58)
at org.apache.lucene.util.PriorityQueue.<init>(PriorityQueue.java:39)
at org.apache.solr.handler.component.ShardFieldSortedHitQueue.<init>(ShardDoc.java:113)
at org.apache.solr.handler.component.QueryComponent.mergeIds(QueryComponent.java:972)
at org.apache.solr.handler.component.QueryComponent.handleRegularResponses(QueryComponent.java:750)
at org.apache.solr.handler.component.QueryComponent.handleResponses(QueryComponent.java:729)
at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:388)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:143)

Я обнаружил, что это не удается из-за оператора query.set("rows", Integer.MAX_VALUE). Люди предложили мне использовать разбиение на страницы. Но я не могу позволить себе разбиение на страницы, так как на стороне пользовательского интерфейса будет слишком много изменений.

Есть еще один способ, с помощью которого я могу сначала запросить небольшое количество документов и получить общее количество документов, используя метод response.getResults().getNumFound(), и попытаться установить это значение на метод setRows, но этот подход увеличит еще один вызов сервера.

Есть ли другой способ решить эту проблему?


person Javadroider    schedule 17.08.2015    source источник


Ответы (1)


Вы всегда можете установить для ваших строк большое значение, которое будет охватывать ваши результаты. Integer.MAX_VALUE не будет работать из-за ограничений размера массивов Java (см. здесь) и очереди приоритетов Lucene (см. строки 42–58).

Solr-534 запросил, по сути, то, что вы просите; есть хороший разговор о том, почему и почему такая функция не была бы хорошей.

Может быть, лучше спросить, сколько документов может содержать пользовательский интерфейс, не становясь непригодным для использования? Как бы много документов ни было, для вашего запроса будет полезно вернуться.

person cahilltr    schedule 24.08.2015