Solr:获取所有记录

时间:2015-08-17 09:18:19

标签: solr solrj solrnet solrcloud

我正在尝试将我的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)陈述而失败了。人们建议我使用分页。 但是,由于UI方面会有太多变化,我无法承担分页的费用。

还有一种方法可以先用一些小数字来查询。使用response.getResults().getNumFound()方法&amp;获取文档总数尝试将该值设置为setRows方法。但这种方法会增加对服务器的一次调用。

还有其他方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您始终可以将行设置为包含结果的较大值。由于Java Arrays的大小限制(请参阅here)和Lucene Priority Queue(请参阅lines 42 - 58)

,Integer.MAX_VALUE将无法工作。

Solr-534要求基本上满足您的要求;关于为什么以及为什么会有一些很好的对话 - 这样的功能不会很好。

更好的问题可能是UI可以保留多少文档而不会变得无法使用?但是,许多文档对于您的查询返回来说都是一个很好的价值。