2013-10-31 92 views
1

所以我這樣說的:http://wiki.apache.org/solr/SolrCaching#filterCache的過濾器高速緩存的Solr變暖查詢

特別

過濾器緩存存儲的任何過濾查詢(「FQ」 參數)Solr的明確要求的結果執行。 (每個過濾器是執行,分別緩存 。當它的時候用它們來限制 查詢返回結果的數量,這是使用設置 交叉進行。)

所以我的問題是這樣的。讓我們的應用程序過濾一組不同的格式ID。如果格式ID是數字,例如1,2,3,4,5。那些在查詢中被髮送的參數有很多排列組合。

,如果我寫了一個變暖這樣的查詢...

... 
<str name="fq">format:(1)+OR+format:(2)+OR+format:(3)+OR+format:(4)+OR+format:(5)</str> 
... 

請問這溫暖的東西了,並幫助我所有的查詢試圖通過這些格式或各種排列組合過濾...只有人們尋找那個排列?

我是否應該創建5個單獨的加熱查詢(每種格式爲1)以利用「設置交叉點」?

或者該查詢是否會爲每種格式創建集?

例子查詢

...fq=format:(1)+OR+format:(2)... 
...fq=format:(1)+OR+format:(3)... 
...fq=format:(2)+OR+format:(3)... 
...fq=format:(2)+OR+format:(5)... 
etc... 

所以這些都不相信會使用由上面列出的變暖查詢創建過濾器緩存。

+0

它看起來像這是說,它被FQ字段緩存...因此,使用這個「OR」邏輯,我將不得不創建排列並對每個排列進行查詢以進行加熱,否則結果集將會不被緩存或能夠被利用。 –

回答

2

請參閱https://wiki.apache.org/solr/CommonQueryParameters#fq。它說:

從每個過濾器查詢文檔集獨立緩存。 因此,關於前面的例子:如果這些子句經常出現在一起,使用包含兩個強制性子句的單個fq,並且如果它們相對獨立,則使用兩個獨立的fq params。

它是您的查詢中指定的每個參數fq的一個緩存條目。

你沒有與OR設置交集;你正在設定聯合。但是,如果你在做集合交集,如:

fq=format:(1 AND 2 AND 3 AND 4 AND 5) 

(假設format這裏是一個多值字段),並有像

fq=format:(1 AND 2) 
fq=format:(3 AND 4 AND 5) 

然後發出單獨的過濾器的查詢像5個值的不同子集:

fq=format:1&fq=format:2&fq=format:3&fq=format:4&fq=format:5 

將幫助所有的子集查詢。這裏你將在過濾器緩存中有5個條目,並且它們與所有子集相交。

關於排列即數值出現在過濾器查詢中的順序,我相信它會爲fq param使用散列,因此您最好先排序值,然後再組成過濾器查詢。

+0

非常好的實現,但是如果我想爲原始問題中的設置聯合查詢加熱Solr呢? –

+0

如果它是用於過濾器查詢的相同值集合,那麼只需對您的值進行排序並使用如'fq = format:(1 OR 2 OR 3)'。這將在您的過濾器緩存中爲這三個值的聯合創建一個條目。每個後續查詢也應該以相同的排序順序發佈值。 – arun