2009-11-30 144 views
2

我們已經建立了包含3600萬個文檔(每個〜1K-2K)的Solr索引,我們嘗試查詢最多100個匹配單個簡單關鍵字的文檔。這項工作非常快,正如我們所希望的那樣。但是,如果我們現在向查詢添加「& sort = createDate + desc」(因此要求匹配查詢的前100個'新'文檔),它會運行很長很長的時間,並最終導致出現OutOfMemoryException。 從我從手冊中瞭解到,這是由Lucene需要在執行查詢之前將此字段的所有不同值(createDate)加載到內存(FieldCache afaik)中引起的。由於createDate字段包含日期和時間,所以不同值的數量非常大。 同樣重要的是,我們經常更新索引。在Solr/Lucene性能問題中按日期排序

也許有人可以提供一些關於如何調整Lucene/Solr或改變我們的方法的見解和方向,使查詢時間變得可以接受? 您的輸入將會非常感謝!謝謝。

回答

2

問題是Lucene將數字存儲爲字符串。有一些實用程序將日期分爲YYYY,MM,DD並將它們放在不同的字段中。這給了更好的結果。

較新版本的Lucene(2.9以上版本)支持數字字段並且性能改進很顯着(幾個數量級,IIRC)。檢查this有關數字查詢的文章。

+0

感謝您的意見,Sashikant!事實上,升級到Solr 1.4(實現Lucene 2.9)有很大的不同。對於我們來說,它的主要優勢在於,它維護每個段的FieldCache,並且在提交未更改的段之後不需要重新加載它。 – schuilr 2009-11-30 14:32:48

0

你可以用來代替索引順序。 通過證件號碼降序排序規範是:

new SortField(null, SortField.DOC, true) 

也應由日期字段分區索引目錄。 收集最前N個結果時,所有匹配的文檔都由Lucene進行檢查。 分區將拆分檢查集。如果在最新的分區中有N個結果,則不需要檢查較舊的分區。

0

嘗試將日期類型數據轉換爲字符串類型(例如毫秒)。