分組統計之facet

2021-08-04 13:46:48 字數 3056 閱讀 8739

背景:

在shop**的商品列表頁,我們都可以看到商品按分類,品牌,**的分類顯示,如圖(1),這些我們可以使用solr中的facet功能實現。

圖(1)

1. facet簡介

facet是solr的高階搜尋功能之一,可以給使用者提供更友好的搜尋體驗。在搜尋關鍵字的同時,能夠按照facet的字段進行分組並統計,類似資料庫的count(*) group by 功能。

2. facet欄位的要求

facet的字段必須被索引。一般來說該欄位無需分詞,無需儲存。

無需分詞是因為該字段的值代表了乙個整體概念,如電腦的品牌」聯想」代表了乙個整 體概念,如果拆成」聯」、」想」兩個字都不具有實際意義。另外該字段的值無需進行大小寫轉換等處理,保持其原貌即可。

無需儲存是因為一般而言使用者所關心的並不是該字段的具體值,而是作為對查詢結果進行分組的一種手段,使用者一般會沿著這個分組進一步深入搜尋。

3. 特殊情況

對於一般查詢而言,分詞和儲存都是必要的.比如cpu型別」intel 酷睿2雙核 p7570」, 拆分成」intel」、」酷睿」、」p7570」這樣一些關鍵字並分別索引,可能提供更好的搜尋體驗。但是如果將cpu作為facet欄位,最好不進行分詞。這樣就造成了矛盾,解決方法為:將cpu欄位設定為不分詞不儲存,然後建立另外乙個欄位為它的copy,對這個copy的字段進行分詞和儲存。

4.facet元件

solr的預設requesthandler已經包含了facet元件(solr.facetcomponent),所以不需要我們在配置。如果自定義requesthandler或者對預設的requesthandler自定義元件列表,那麼需要將facet加入到元件列表中去。

5.facet用法

facet.field 指定要分類的字段。

facet=on 或 facet=true 表示功能開啟。

facet.prefix  表示字段字首,比如facet.field=cpu&facet.prefix=intel,那麼對cpu欄位進行facet查詢,返回的cpu都是以intel開頭的,amd開頭的cpu型號將不會被統計在內。

facet.limit  表示返回的記錄數,預設值為100.如果此值為負數,表示不限制。

facet.offict  表示返回結果集的偏移量,預設為0,它與facet.limit配合使用可以達到分頁的效果。

facet.mincount  限制了facet字段值的最小count,預設為0。合理設定該引數可以將使用者的關注點集中在少數比較熱門的領域。

facet.missing   預設為」」,如果設定為true或者on,那麼將統計那些該facet字段值為null的記錄。

facet.method   取值為enum或fc,預設為fc。該欄位表示了兩種facet的演算法,與執行效率相關.

enum適用於字段值比較少的情況,比如字段型別為布林型,或者字段表示中國的所有省份。solr會遍歷該字段的所有取值,並從filtercache裡為每個值分配乙個filter(這裡要求solrconfig.xml裡對filtercache的設定足夠大)。然後計算每個filter與主查詢的交集。

fc(表示field cache)適用於字段取值比較多,但在每個文件裡出現次數比較少的情況。solr會遍歷所有的文件,在每個文件內搜尋cache內的值,如果找到就將cache內該值的count加1。

facet.enum.cache.mindf    當facet.method=enum時,此引數其作用:mindf表示minimum document frequency,也就是文件內出現某個關鍵字的最少次數,該引數預設值為0,設定該引數可以減少filtercache的記憶體消耗,但會增加總的查詢時間(計算交集的時間增加了)。如果設定該值的話,官方文件建議優先嘗試25-50內的值。

facet.query可以任意定義查詢。

6. facet查詢

facet欄位通過在請求中加入facet.field引數加以宣告,如果需要對多個字段進行facet查詢,那麼將該引數宣告多次.例如:

訪問以上鏈結會出現如圖(2)和圖(3)的效果:

category_id的統計結果:

圖(2)

圖(3)

7. tag操作符和ex操作符

當查詢使用filter query的時候,如果filter query的字段正好是facet欄位,那麼查詢結果往往被限制在某乙個值內。 例:

&fq=category_id:4348

&facet=on

&facet.field=category_id

鏈結為:

查詢結果如圖(4):

圖(4)

可以看到,分類id(category_id)為4348的產品共有2件,其它分類的產品的數目都是0,這是因為在filter裡已經限制了category_id:434。這樣,查詢結果中除了category_id:434的這一項之外,其它專案沒有實際的意義。有些時候使用者希望把結果限制在某一範圍內,又希望檢視該範圍外的概況。比如上述情況,既要把查詢結果限制在分類4348下,又想檢視一下其它分類下有多少產品。這個時候需要用到tag和ex操作符。tag就是把乙個filter標記起來,ex(exclude)是在facet的時候把標記過的filter排除在外。 例:

&fq=category_id:4348

&facet=on

&facet.field=category_id

鏈結為:

查詢結果如圖(5):

圖(5)

這樣就能看到其他分類下的商品數量。

8. facet在solrj中的使用如圖(6):

圖(6)

Solr分組聚合查詢之Facet

摘要 solr的分組聚合是乙個籠統的概念,目的就是把查詢結果做分類,有多種方式可以做到很類似的結果。也正是由於它們的不同表現,可以適合於多種場景。facet是一種手段,用來將搜尋結果分類,它並不會修改查詢結果資訊,只是給分類後的結果加上了每一項的數量值。我們可以用facet來做導航欄,引導使用者更精...

python之pandas分組統計

pandas分組統計佔比 資料例如 美贊臣標籤 2017 11 15 mob 女性 110548715660 美贊臣標籤 2017 11 15 mob 男性 104342715471 美贊臣標籤 2017 11 15 pc 女性 398273 887 美贊臣標籤 2017 11 15 pc 男性 4...

分組合計之withrollup統計

原資料 id pipeid pipename pree price down dgy dzy das ddy dtr 1 1 1 ad 1 22 1 1 3 1 3 1 2 2 2 ad 1 12 2 1 3 1 3 1 3 2 2 ad 2 21 3 1 3 1 3 1 4 4 4 ad 1 12...