2012-03-26 85 views
5

我們有一個包含86,315,770個文檔的solr實例。它使用高達4GB的內存,我們需要它在一個稱爲內容的標記字段上進行刻面。磁盤上的索引大小爲23GB。Solr分面搜索性能建議

爲什麼我們要在一個標記化的領域進行構造?因爲我們想要查詢該字段中最常用的術語「n」。問題是執行這樣的查詢花費太長時間了。有這樣的方式來改善時間嗎?任何建議?

在此先感謝。

+0

您是否正在設置「facet.limit」?我注意到,如果沒有設置「facet.limit」(在你的情況下,不管是什麼'n'可能),這樣的查詢可能需要很長時間,即使有100,000個以上的記錄。 – 2012-03-26 15:03:10

回答

2

由於Solr計算內存中數據結構的方面,所以方面計算可能是CPU限制的。計算方面的代碼已經高度優化(對於多值字段,getCounts方法在UnInvertedField中)。

一個想法是並行計算。也許最簡單的方法是按照Do multiple Solr shards on a single machine improve performance?中的描述將你的集合分成幾個分片。否則,如果您的詞典足夠小,並且查詢可以採用有限數量的表單,則可以設置一個不同的系統來維護每個(術語,查詢)對的計數矩陣。例如,如果您只允許使用術語查詢,這意味着您應該維護每對術語的計數。請注意,這將需要大量的磁盤空間,具體取決於術語和查詢的總數。如果你不需要計數準確,最簡單的方法就是在批處理過程中計算這些計數。否則,它可能會(可能,但)與Solr保持同步計數有點棘手。

0

您可以使用LukeRequestHandlertopTerms功能。

+0

問題是我需要將術語計數應用於查詢。 topTerms可能嗎? – rreyes1979 2012-03-26 16:51:53

+0

您可以將Luke請求的numTerms參數設置爲任何您想要的參數,類似於使用'facet.limit',正如我在上面的註釋中所解釋的那樣。但是,盧克將返回不同於#的索引中的術語,因爲Luke會返回索引中不再可搜索的文檔(即那些已刪除但尚未合併的文檔)的topTerms。 – 2012-03-26 18:29:02

+0

另外,我測試了盧克的反面速度,它總是需要更長的時間。也就是說,如果你使用的是Solr 3.6或4.0,那麼LukeRequestHandler在這些版本中應該有一些速度的提升。 – 2012-03-26 18:36:11