3

我们目前有一个 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 的堆来进行排序。

我想知道是否可以以某种方式减少这种内存使用要求。

增加字段precisionSteprow值会减小索引大小,从而减少排序所需的内存量吗?这样做对分拣速度有权衡吗?并且使用更高精度的步长排序是否仍然完全正确(行值必须严格按顺序排列)?

1GB 的堆现在是可以接受的,但我有点担心如果我们添加更多具有更多row值的文档,那么内存要求会变得太高。


(在 jpountz 的回答之后添加)

虽然目前这适合内存,但它不会随着我们预计在未来几个月内添加的文档数量而扩展。我们可能会从 Solr 获得未排序的结果,并使用基于磁盘的java-merge-sort在客户端对它们进行排序。

4

1 回答 1

2

precisionStep参数仅与范围查询相关。要执行排序,Lucene 需要在field cache. 长为 8 个字节,您的字段的字段缓存应该需要大约 8B * 50M ~ 400 MB。如果你真的需要一个 long 这个字段,没有办法减少内存使用(另一方面,使用 int 只需要 ~200MB)。

于 2012-07-14T17:15:37.563 回答