2012-03-15 42 views
1

我發現只有一行的查詢會崩潰,如果我請求任意大量的行。當我查詢任意行時,Solr返回內存不足

服務器拋出的錯誤是500 - 帶有內存不足異常消息。

這種崩潰:

http://localhost:8983/solr/myIndex1/select?rows=100000&q=*%3A*&fq=group%3term1_JAYUNIT100&fq=grid%3A75&wt=json&indent=on 

這不會崩潰:

http://localhost:8983/solr/myIndex1/select?rows=1&q=*%3A*&fq=group%3term1_JAYUNIT100&fq=grid%3A75&wt=json&indent=on 

這很奇怪,我 - 我不明白爲什麼Solr中會使用更多內存的查詢只返回一行。在運行查詢之前,服務器端是否存在某種預先分配的資源,這是基於「rows」參數的值?

回答

1

SOLR緩存查詢結果。在這種情況下,即使您過濾了結果集並且只返回一行,結果集也非常大。

首先,SOLR需要RAM。畢竟這是一個內存索引。使SOLR快速運行的所有內容都會佔用RAM,因此請不要餓死SOLR服務器。

其次,您的實際查詢是無用的。有一個在說:「從數據庫中選擇的所有記錄,建立一個位圖索引,然後篩選該組只選擇特定的字段值的那些毫無意義的。如果你的查詢聽起來像這樣的自然語言:

Records where XField is like so, AND YField is like that, AND ZField meets this condition

然後做在SOLR正確的方法是:

q=XField:so&fq=Yfield:that%20AND%20ZField:this

事實上,如果你確信有X與XField記錄:某某3X記錄與YField:與和.07x記錄ZField:這個,然後開始重新排列你的AND表達式並把ZField i放入在q=部分。

q=部分定義了結果集。在獲取結果集中的所有記錄後,SOLR將應用位圖索引技術,以使用設置操作快速篩選(縮小)結果。因此,如果可以,請使q=部分返回的記錄數少於fq=以進行操作。