我们目前有一个拥有大约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对它们进行排序。
答案 0 :(得分:2)
precisionStep
参数仅与范围查询相关。要执行排序,Lucene需要在field cache
中加载字段值。长8字节,您的字段的字段缓存应该需要大约8B * 50M~400 MB。如果你真的需要这个字段的长,没有办法减少内存使用(另一方面,使用int只需要~200MB)。