【问题标题】:Solr: To get all recordsSolr:获取所有记录
【发布时间】:2015-08-17 09:18:18
【问题描述】:

我正在尝试将我的 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() 方法获取文档总数,然后尝试将该值设置为setRows 方法。但是这种方法会增加对服务器的一次调用。

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

【问题讨论】:

标签: solr solrj solrnet solrcloud


【解决方案1】:

您始终可以将行设置为包含结果的较大值。由于 Java 数组(参见 here)和 Lucene 优先级队列(参见 lines 42 - 58))的大小限制,Integer.MAX_VALUE 将不起作用。

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

一个更好的问题可能是 UI 可以容纳多少文档而不会变得不可用?无论多少文档,对于您的查询返回都是一个很好的价值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多