Solr排序,precisionStep和内存使用

时间:2012-07-13 02:19:44

标签: solr lucene

我们目前有一个拥有大约5000万份文档的Solr实例。我们经常按long字段排序,使用标准long字段类型,precisionStep为零:

<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对它们进行排序。

1 个答案:

答案 0 :(得分:2)

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