2012-07-13 28 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)。