0

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

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

4

1 回答 1

3

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

这确实不是 Solr 的自然用例,它旨在返回结果的前 k 个列表,而不是详尽的结果列表。

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

为什么你需要得到所有的结果?例如,如果您需要计算方面或统计数据,Solr 有两个组件可以有效地完成这项工作。

于 2012-06-18T15:43:06.607 回答