我们目前有一个 Solr 实例,其中包含大约 5000 万个文档。有一个long
字段是我们经常排序的,使用标准long
字段类型,aprecisionStep
为零:
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
<field name="row" type="long" indexed="true" stored="true" />
在进行排序时,需要将索引加载到内存中。在我们的例子中,值范围很大row
,我们需要 500m 到 1g 的堆来进行排序。
我想知道是否可以以某种方式减少这种内存使用要求。
增加字段precisionStep
的row
值会减小索引大小,从而减少排序所需的内存量吗?这样做对分拣速度有权衡吗?并且使用更高精度的步长排序是否仍然完全正确(行值必须严格按顺序排列)?
1GB 的堆现在是可以接受的,但我有点担心如果我们添加更多具有更多row
值的文档,那么内存要求会变得太高。
(在 jpountz 的回答之后添加)
虽然目前这适合内存,但它不会随着我们预计在未来几个月内添加的文档数量而扩展。我们可能会从 Solr 获得未排序的结果,并使用基于磁盘的java-merge-sort在客户端对它们进行排序。