2012-07-24 52 views
25

我有一個〜1密耳的產品文檔Solr索引。我還有一大堆UI過濾器,例如類別,選項卡,價格範圍,大小,顏色和其他一些過濾器。Solr查詢(q)或過濾器查詢(fq)

是否有正確的方式讓q選擇所有的東西(q=\*:\*)而fq中的所有其他過濾器?例如:

fq=(catid:90 OR catid:81) AND priceEng:[38 TO 40] AND (size:39 OR size:40 OR size:41 OR size:50 OR size:72) AND (colorGroup:Yellow OR colorGroup:Violet OR colorGroup:Orange ... AND (companyId:81 OR companyId:691 OR companyId:671 OR companyId:628 OR companyId:185 OR companyId:602 OR ... AND endShipDays:[* TO 7])

對我來說,一切從類別companyIds,從顏色和尺寸等僅僅是過濾器。這種方法在未來增長中的表現會出現什麼問題?我應該在q中加入一些查詢,哪些?

謝謝

回答

40

只要有可能,最好在普通查詢上使用過濾器查詢。

FilterQuery能夠利用FilterCache,與您的查詢相比,這將大大提升性能。

+0

好吧,它看起來幾乎任何東西都可以在fq xD。 q只是*和fq作爲一個長期的azz查詢真的可以嗎? – 2012-07-24 09:30:27

+0

y .....因爲這將能夠利用過濾器緩存並提供性能提升。 – Jayendra 2012-07-24 09:51:13

+0

此外,過濾器查詢不會影響Solr分數。 – javanna 2012-07-25 07:42:46

4

我使用的方式qfq。 我在qfq上應用全文搜索。 比方說你有場關鍵字,你要和領域的全文搜索爲架構中的定義與copyField

<copyField source="id" dest="keyword"/> 
<copyField source="category" dest="keyword"/> 
<copyField source="product_name" dest="keyword"/> 
<copyField source="color" dest="keyword"/> 
<copyField source="location" dest="keyword"/> 
<copyField source="price" dest="keyword"/> 
<copyField source="title" dest="keyword"/> 
<copyField source="description" dest="keyword"/> 

我的查詢看起來像

/select?q={keyword}&fq=category:fashion&fq=location:nyc 

/select?q=jeans&fq=category:fashion&fq=location:nyc 

由於digitaljoel建議,如果您必須查詢多個字段,那麼使用多個fq(參考上面的查詢)而不是使用AND和OR可能更好q

注:在我的情況q默認是指現場關鍵字在solrconfig.xml中定義

<requestHandler name="/select" class="solr.SearchHandler"> 
<!-- default values for query parameters can be specified, these 
    will be overridden by parameters in the request 
    --> 
<lst name="defaults"> 
    <str name="echoParams">explicit</str> 
    <int name="rows">10</int> 
    <str name="df">keyword</str> 
</lst> 
6

我想看看有關字段以下幾點,以便決定:

  1. 你的領域是否有固定的提升分數,或者你是否需要爲這個領域得分?如果是,則將其置於查詢中,因爲如上所述,過濾器查詢不使用分數。
  2. 經常使用該字段的條件嗎?如果是的話 - 同樣如前所述,過濾器緩存可能會帶來巨大的優勢,但如果沒有 - 它可能會更慢。
  3. 您的索引是否不變?這有點類似於#2。如果您的索引頻繁更新,過濾器查詢的使用可能會成爲瓶頸,而不是提高性能。

關於#3的一些注意事項:根據我的經驗,我有一個大的索引,每隔幾秒就會填充新的文檔,autoSoftCommit也設置爲幾秒鐘。在軟提交期間,新的搜索者被打開,導致緩存失效。那麼究竟發生了什麼,濾波器命中率幾乎總是爲0。 我可以告訴更多:我發現第一個過濾器查詢運行比查詢運行更加昂貴,所有這些過濾條件都移動到「q」而不是「fq」。例如,當我使用「AND」將所有「fq」條件移動到主查詢中時,我的查詢花費了1秒時間處理5個篩選查詢(無緩存命中)和147毫秒。但是當然,當我停止索引更新時,由於使用了緩存,相同的篩選查詢花費了0毫秒。所以這是要考慮的事情。

另外一些其他問題的提問:

  • 嘗試從來沒有在查詢中使用通配符。它顯着影響性能。因此,而不是「」我會建議使用一個條件是不太恆定的每個請求(最不變的每個請求,它不需要你想要放到「fq」的分數)
  • 範圍搜索也更好地避免(如果可能的話)。並且使用通配符進行範圍搜索。這是關於你的「endShipDays:[* TO 7]」。例如,使用「endShipDays:(1 2 3 4 5 6 7)」會更有效,但這只是一個例子,有很多方法。

希望它有幫助。