如何在Solr中关闭排序?

时间:2012-06-18 15:06:03

标签: sorting solr priority-queue

我有许多文档存储在Solr集群中,并希望通过特定查询获得大量文档(大约2千万)。我使用标准方法读取批次的行(例如,10000)并使用start参数移动到下一批次。然而,在大约1 400 000个文档之后,我开始得到OutOfMemoryError。我相信这是因为Solr在将文档发送给客户之前对其进行排序。据我所知,它使用优先级队列来获得前N个结果,因此无需将所有文档的头部加载到内存中。但是,当我要求它返回结果时,例如,从1,000,000到1,010,000,它还必须加载以前所有1,000,000个文档的标题。

我正在寻找一种方法来避免这种情况,只需获取所有结果即可满足查询而无需排序。有办法吗?如果没有,从Solr获得大量结果的适当方法是什么?

1 个答案:

答案 0 :(得分:3)

您的假设是正确的。当您搜索1,000,000到1,010,000的结果时,Solr会实例化一个大小为1,010,000的优先级队列。

对于Solr来说,这实际上不是一个自然的用例,它被设计为返回前k个结果列表,而不是详尽的结果列表。

您可以通过按主键范围(q=yourquery&fq=ID:[1 TO 1000]&rows=1000q=yourquery&fq=ID:[1001 TO 2000]&rows=1000,...)进行过滤来解决此问题,但这是一个丑陋的黑客攻击。 : - )

为什么需要获得所有结果?例如,如果您需要计算构面或统计数据,Solr有两个可以有效地执行此操作的组件。