2012-06-18 35 views
0

我有一些存儲在Solr集羣中的文檔,並希望通過特定的查詢獲取大量文檔(大約2000萬)。我使用標準方法讀取批次的行(比如10000),並使用start參數移動到下一批次。然而,在大約1 400 000個文檔後,我開始獲得OutOfMemoryError。我相信這是因爲Solr在將文檔發送給客戶之前對其進行排序的方式。據我所知,它使用優先級隊列來獲得最前N個結果,因此不需要將所有文件的標題加載到內存中。但是,當我要求它返回結果時,比如從1,000,000到1,010,000,它必須爲所有先前的1,000,000個文檔加載標題。如何關閉Solr中的排序?

我正在尋找一種方法來避免這種情況,只是得到的所有結果滿足查詢不排序。有沒有辦法做到這一點?如果不是,從Solr獲得大量結果的適當方法是什麼?

回答

3

你的假設是正確的。當您搜索從1,000,000到1,010,000的結果時,Solr會實例化一個大小爲1,010,000的優先隊列。

對於Solr而言,這並不是一個自然的用例,它被設計用來返回top-k列表的結果,而不是詳盡的結果列表。

你可以通過過濾你的主鍵範圍(q=yourquery&fq=ID:[1 TO 1000]&rows=1000,q=yourquery&fq=ID:[1001 TO 2000]&rows=1000,...),但這是一個醜陋的黑客。 :-)

爲什麼你需要獲得所有結果?例如,如果您需要計算方面或統計信息,Solr有兩個組件可以高效地完成此任務。

+0

謝謝,這是我錯過的一個選項。實際上,我使用Solr主要不是作爲搜索引擎(通過相關性和所有這些功能進行排序),而是作爲具有容易標記和干擾文本的功能的存儲。後來我決定在前端使用Lucene的MongoDB更適合這種用途。所以現在我只是試圖將所有數據從Solr移動到MongoDB,因此確實需要逐批獲取所有文檔。 – ffriend