solr的facet性能

1.1   facet.method

取值爲enum或fc,默認爲fc.該字段表示了兩種Facet的算法,與執行效率相關.

enum適用於字段值比較少的情況,比如字段類型爲布爾型,或者字段表示中國的所有省份.Solr會遍歷該字段的所有取值,並從filterCache裏爲每個值分配一個filter(這裏要求solrconfig.xml裏對filterCache的設置足夠大).然後計算每個filter與主查詢的交集.



這裏我猜想的計算過程:

首先,對於每個值對應一個filter,類似一個map結構 map<enum,filter>,現在我們假如某一個enum的filter是一個bitset,查詢的結果也是一個bitset,那麼現在就是計算兩個bitset的交集。問題轉到求兩個bitset的交集的算法上。。。

比如int的最大億就是2的31次方,用long來存儲,要2的25次方長度,那兩個位圖交集就可以每次取一個long值進行位運算,每次計算的值 就是一個交集數,累加起來就可以得到一個總值 。。



fc(表示Field Cache)適用於字段取值比較多,但在每個文檔裏出現次數比較少的情況.Solr會遍歷所有的文檔,在每個文檔內搜索Cache內的值,如果找到就將Cache內該值的count加1.


類似視頻搜索,



因爲分類的值是定的,所以可以採用facet.method=enum.這樣,每個分類就對應一個filterCache.只要跟主查詢的id進行交集,立即可統計出相應的數量。

試過在幾千萬的文檔,採用facet時,總的費時也是幾十毫秒。所以相信用solr來做土豆這個功能也是足以。


這個應該類似sphinx的分層功能。。


可以看看solr的源代碼實現,相應也是一種很好的設計方案。。



其它的facet參數:



1.1   facet.prefix

表示Facet字段值的前綴.比如”facet.field=cpu&facet.prefix=Intel”,那麼對cpu字段進行Facet查詢,返回的cpu都是以”Intel”開頭的,”AMD”開頭的cpu型號將不會被統計在內.

1.2   facet.sort

表示Facet字段值以哪種順序返回.可接受的值爲true(count)|false(index,lex).true(count)表示按照count值從大到小排列. false(index,lex)表示按照字段值的自然順序(字母,數字的順序)排列.默認情況下爲true(count).當facet.limit值爲負數時,默認facet.sort= false(index,lex).

1.3   facet.limit

限制Facet字段返回的結果條數.默認值爲100.如果此值爲負數,表示不限制.

1.4   facet.offset

返回結果集的偏移量,默認爲0.它與facet.limit配合使用可以達到分頁的效果.

1.5   facet.mincount

限制了Facet字段值的最小count,默認爲0.合理設置該參數可以將用戶的關注點集中在少數比較熱門的領域.

1.6   facet.missing

默認爲””,如果設置爲true或者on,那麼將統計那些該Facet字段值爲null的記錄.

1.7   facet.method

取值爲enum或fc,默認爲fc.該字段表示了兩種Facet的算法,與執行效率相關.

enum適用於字段值比較少的情況,比如字段類型爲布爾型,或者字段表示中國的所有省份.Solr會遍歷該字段的所有取值,並從filterCache裏爲每個值分配一個filter(這裏要求solrconfig.xml裏對filterCache的設置足夠大).然後計算每個filter與主查詢的交集.

fc(表示Field Cache)適用於字段取值比較多,但在每個文檔裏出現次數比較少的情況.Solr會遍歷所有的文檔,在每個文檔內搜索Cache內的值,如果找到就將Cache內該值的count加1.

1.8   facet.enum.cache.minDf

當facet.method=enum時,此參數其作用,minDf表示minimum document frequency.也就是文檔內出現某個關鍵字的最少次數.該參數默認值爲0.設置該參數可以減少filterCache的內存消耗,但會增加總的查詢時間(計算交集的時間增加了).如果設置該值的話,官方文檔建議優先嚐試25-50內的值.

1.       Date Facet

日期類型的字段在文檔中很常見,如商品上市時間,貨物出倉時間,書籍上架時間等等.某些情況下需要針對這些字段進行Facet.不過時間字段的取值有無限性,用戶往往關心的不是某個時間點而是某個時間段內的查詢統計結果. Solr爲日期字段提供了更爲方便的查詢統計方式.當然,字段的類型必須是DateField(或其子類型).

需要注意的是,使用Date Facet時,字段名,起始時間,結束時間,時間間隔這4個參數都必須提供.

與Field Facet類似,Date Facet也可以對多個字段進行Facet.並且針對每個字段都可以單獨設置參數.

1.1   facet.date

該參數表示需要進行Date Facet的字段名,與facet.field一樣,該參數可以被設置多次,表示對多個字段進行Date Facet.

1.2   facet.date.start

起始時間,時間的一般格式爲” 1995-12-31T23:59:59Z”,另外可以使用”NOW”,”YEAR”,”MONTH”等等,具體格式可以參考org.apache.solr.schema. DateField的java doc.

1.3   facet.date.end

結束時間.

1.4   facet.date.gap

時間間隔.如果start爲2009-1-1,end爲2010-1-1.gap設置爲”+1MONTH”表示間隔1個月,那麼將會把這段時間劃分爲12個間隔段.注意”+”因爲是特殊字符所以應該用”%2B”代替.

1.5   facet.date.hardend

取值可以爲true|false,默認爲false.它表示gap迭代到end處採用何種處理.舉例說明start爲2009-1-1,end爲2009-12-25,gap爲”+1MONTH”,hardend爲false的話最後一個時間段爲2009-12-1至2010-1-1;hardend爲true的話最後一個時間段爲2009-12-1至2009-12-25.

1.6   facet.date.other

取值範圍爲before|after|between|none|all,默認爲none.

before會對start之前的值做統計.

after會對end之後的值做統計.

between會對start至end之間所有值做統計.如果hardend爲true的話,那麼該值就是各個時間段統計值的和.

none表示該項禁用.

all表示before,after,all都會統計.

發佈了28 篇原創文章 · 獲贊 7 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章