2012-01-04 92 views

回答

48

FilterQuery只存儲文檔IDS。這使得應用過濾器包含/排除文檔的速度非常快。這方面的好例子是根據國家,產品類型,可用性等搜索過濾產品。

正常查詢可以執行完全相同的功能,但它有一個非常複雜的評分系統來確定「相關性」。我相信該文檔指出評分只在主查詢上完成,而不是在過濾器查詢上完成。這也應該增加查詢速度。

所以,我可以查詢:

description:Kohler AND productType:Toilet 

或者,我可以查詢:

description:Kohler 
with a FQ of productType:Toilet 

結果將是相同的,但分數會有所不同。另外,如果在productType:Toilet的整個一天中收到許多不同的查詢,FilterQuery將被緩存,從而使整個查詢時間更快。

+1

因此,如果例如在索引處對「productType」有術語提升,則如果在FilterQuery而不是主Query中設置productType,則可以對結果進行不同的排序,例如如果它位於Query中,那些帶有較高的productType分數將位於頂部,而如果它位於FilterQuery中,則具有較高productType分數的那些文檔可能位於底部,因爲由於分數位於FilterQuery中,所以未應用分數。我理解你嗎? – mrd3650 2012-01-05 08:15:55

+0

正確。但是,如果您將productType作爲AND子句放在主Query中,則無論如何您都不會返回任何其他productType。所以這可能是有限的價值。但是,你所說的話意味着你明白它是如何工作的。 – rfeak 2012-01-05 15:49:29

+0

是的,你有一個觀點,因爲我錯誤地假設productType上有一個FTS(因此可能會返回多個productType,但通常在* Type上沒有FTS)。謝謝。 – mrd3650 2012-01-06 09:02:08

3

fq適用於固定的值列表。如果在q =天窗+立體聲上搜索,並且fq = Mustang solr將對q參數進行文本分析,因爲q =天窗+立體聲和q =立體聲+天窗將返回相同的結果集。但是,當通過fq過濾搜索時,沒有對fq參數應用分析,並且假設所有返回的文檔都將與fq匹配,因此不需要修改匹配的文檔的分數。