2012-07-13 29 views
3

我们目前有一个Solr实例,它拥有约5000万个文档。有一个long领域,我们经常排序,使用标准long字段类型零的precisionStepSolr排序,precisionStep和内存使用

<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> 
<field name="row" type="long" indexed="true" stored="true" /> 

当谈到做一个排序,索引需要在内存中加载。在我们的例子中,我们需要大量的row值,我们需要500万到1克的堆才能完成。

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

增加row字段的precisionStep是否会减小索引大小,从而减少排序所需的内存量?在对分类速度做这件事情时是否有一个权衡?并且在更高精度的步骤下排序仍然完全正确(行值必须严格按顺序)?

1GB的堆现在是相当可以接受的,但是如果我们添加更多的文档以及更多的row值,内存要求将变得太高,我有点谨慎。


(jpountz的回答后加入)

虽然这符合当前内存中,它不会与规模,我们期待在未来几个月增加文档的数量。我们可能会从Solr中得到未排序的结果,并在基于磁盘的java-merge-sort的客户端上对它们进行排序。

回答

2

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