2013-02-14 453 views
10

我閱讀了同一個問題的所有答案,並且我沒有更清楚哪一個應該用於我的用例和原因。 兩者都返回相同的結果。 我知道「FilterQuery會被緩存,使整個查詢時間更快」,就像某人正確回答。solr主要查詢與fq

我也明白「過濾也允許標記facet,因此您可以標記facet以包含爲您的查詢返回的所有方面」,就像其他人也正確回答的那樣。

我不明白讀到這個,就是爲什麼任何人都會使用Q,因爲FQ似乎更好,基於我見過的所有答案和書籍。

除了,我敢肯定,這可能是存在的一個原因。

我想知道什麼是最適合我的用例 - 文檔缺乏有用的示例。

  • 我的文件有:日期,客戶,報告,以及其他一些領域
  • 1日起企業= 3.5萬份文件。
  • 文件的總數爲250萬,計數(60日* 8000個*客戶報告1000)
  • 我刻面的日期,客戶,報告和我使用方面的標記。
  • 用戶界面整體看起來像任何電子商務網站,例如:亞馬遜,左側有小平面。
  • 不使用評分。

業務規則1:日期必須始終存在於每個查詢中。

業務規則2:99%的查詢將使用最新的日期,但RANDOM客戶端和隨機報告。

事實:我們確定它的表面很慢,而不是搜索。

問題:

鑑於這種搜索條件,而這些方式來編寫一個查詢:

A)Q =日期:20130214和客戶端:喬& facet.field =日期& facet.field =客戶端...

B)q =日期:20130214 & FQ =客戶端:喬& facet.field =日期& facet.field =客戶端...

C)Q =客戶端:喬& FQ =日期:20130214 & facet.field =日期& facet.field =客戶端...

d)Q = *:* & FQ =日期:20130214 & FQ =客戶端:喬& facet.field =日期& facet.field =客戶端...

  • 你認爲哪以上的將是最好的,爲什麼?請記住,大多數查詢都將在首次執行FQ過濾之後運行,然後應用Q條件,或者以其他方式進行操作?大多數查詢都將與20130214
  • 運行。

今天,我有D)在所有情況下使用,但我懷疑這是錯誤的,並導致Solr(版本3.6)中的OOM。

謝謝你的幫助!

回答

3

回答您的問題:

  • 根據您的業務規則,我建議你把日期FQ的價值,因爲你總是限制由一個日期值(過濾)的結果和它的聲音就像日期值可以被Solr重複使用。 Q可以根據需要包含對隨機客戶端和報告值的搜索。

  • 當用戶第一次來到了UI,因爲你是隻顯示方面我會建議你使用q=<id field>:*其中<id field>爲您的文檔ID在索引中,也可以設置rows=0。再次使用fq值中的日期限制。指定rows=0會產生一個小隻查詢,參考Solr - Getting facet counts without returning results

+1

感謝您的回覆。如果我說fq = 20130214&q = client:Paige,這是否意味着Solr必須首先掃描2.5億個客戶端文檔:Paige,然後過濾它們以僅保留日期爲20130214的文檔?如果是這樣,首先找到日期的所有內容(350萬文檔),然後根據客戶端進行過濾,效率會不會更高?甚至更大的問題:我怎麼知道,因爲似乎沒有工具可以嘗試這兩種情況。 – 2013-02-14 05:26:10

+1

是的,過濾器查詢將在主搜索執行後執行。但根據您的文檔編號,您可能需要切換它們並使用'q = 20130214&fq = client:Paige',因爲您知道只需要搜索包含日期的350萬個文檔,然後過濾這些文檔以僅返回正確的客戶端。如何確定正確的做法並不難,也取決於需求和情景。至於測試查詢的工具,我會強烈推薦SolrMeter - http://code.google.com/p/solrmeter/ – 2013-02-15 12:54:45

+0

感謝Paige。 你在兩個不同的回覆(基於業務規則和基於數字)的回答不同,所以我澄清了我原來的問題。 請你再看一遍。 此外,SolrMeter並未顯示Solr如何處理查詢 - 它按照什麼順序查找,按什麼順序查找,查找什麼等。 如果您熟悉Sybase(或任何RDBMS),我正在尋找相當於'set showplan on' 謝謝, -Dmitry。 – 2013-02-22 17:03:27

17

q查詢請求的主查詢。
這是一個可以讓你真正搜索多個領域的人。
q查詢將決定每個文檔有多少分數,因此會參與相關性計算。

q=*:*將只返回所有具有相同分數的文檔。

fq是用於過濾文檔並與搜索無關的過濾器查詢。
所以,如果你有任何你想過濾的修復值,你應該使用過濾器來限制你的結果。
fq不影響對結果的評分。
過濾時,Solr使用過濾器緩存,以便增強後續過濾器查詢的性能。

因此,理想情況下,您應該檢查需求要求,如果要搜索,應始終使用q,如果要過濾/限制結果,則應使用fq

方面只是結果的插件,並不影響結果。

+0

感謝您發佈所有這些有用的答案! – 2013-10-04 06:05:39

+0

爲什麼downvote?請添加評論,以便我可以改進我的答案,如果它不再有效! – Jayendra 2015-11-27 11:23:44

+1

@Jayendra一個基本的查詢:它總是說fq用於過濾文檔並幫助通過緩存進行後續搜索。假設我有100M文檔在100個類別中統一傳播。如果我使用查詢(q)和fq = cat:5,那麼將在第一個搜索文檔中搜索該cat:5或搜索全部100M,然後過濾掉cat:5?如果前者有效,那麼搜索速度也會更快(不僅僅是後續的搜索命中filterCache)。 – Ethan 2016-05-30 15:43:17