Solr學習之—:solr facet
1. facet介紹
solr將以導航為目的的查詢結果稱為facet.它並不會修改查詢結果資訊,只是在查詢結果上根據分類添加了count資訊, 然後使用者根據count資訊做進一步的查詢,比如淘寶的查詢列表中,上面會表示不同的類目相關查詢結果的數量.
比如搜尋數碼相機,在搜尋結果欄會根據廠商,解析度等維度列出,這裡廠商,解析度就是一個個facet.
然後在廠商下面會有nikon,canon,sony等品牌, 這個叫約束(constraints)
接下來是根據選擇,列出當前的導航路徑,這個叫麵包屑(breadcrumb).
solr有幾種facet:
(1)普通facet,比如從廠商品牌的維度建立fact
(2) 查詢facet,比如根據價格查詢時, 將根據價格, 設定多個區間, 比如0-10, 10-20, 20-30等
(3)日期facet,也是一種特殊的範圍查詢,比如按照月份進行facet.
facet的主要好處就是可以任意對搜尋條件進行組合,避免無效搜尋,改善搜尋體驗.
2. facet查詢
進行Facet查詢需要在請求引數中加入”facet=on”或者”facet=true”只有這樣Facet元件才起作用.
(1) Field Facet
Facet欄位通過在請求中加入”facet.field”引數加以宣告,如果需要對多個欄位進行Facet查詢,那麼將該引數宣告多次.比如:
java程式碼可以這樣寫:new SolrQuery("*:*").setFacet(true).addFacetField("name").addFacetField("sex");
通過java程式碼可以這樣獲取facet結果:
List<FacetField> facetFields = queryResponse.getFacetFields();
查詢返回結果如下
注意:name最好不要使用中文名字,否者分詞器會把中文名字進行拆分,出現如下結果(讓大家見笑了,其實可以使用中文,之前只是我沒安裝中文分詞器,所以才出現如下情況)
如上例中還需新增age欄位查詢,則再加上&facet.field=age;如還指定了age範圍20到30歲,則寫成&fq=age:[20 TO 30]
3. facet引數
facet的引數見solr官方wiki http://wiki.apache.org/solr/SimpleFacetParameters
說明:搜尋結果按照Facet的欄位分組並統計
facet 引數欄位要求:欄位必須被索引
(1)field Facet說明如下
Facet.field:分組的欄位
facet.prefix:表示Facet欄位字首
facet.limit:Facet欄位返回條數
facet.offict:開始條數,偏移量,它與facet.limit配合使用可以達到分頁的效果
facet.mincount:Facet欄位最小count,預設為0
facet.missing:如果為on或true,那麼將統計那些Facet欄位值為null的記錄
facet.method:取值為enum或fc,預設為fc, fc表示Field Cache
facet.enum.cache.minDf:當facet.method=enum時,引數起作用,文件內出現某個關鍵字的最少次數
例:
&facet=on&facet.field=city_id&facet.field=address
(2)Date Facet說明如下
facet.date:表示需要Data Facet的欄位名
facet.date.start:起始時間.時間一般格式為"1995-12-31T12:59:59Z",另外可以使用"NOW","YEAR","MONTH"等
facet.date.end:結束時間
facet.date.gap:時間間隔
facet.date.hardend:true|false
facet.date.include:lower|upper|edge|outer|all
facet.date.other:before|after|between|none|all預設為none
before會對start之前的值做統計
after會對end之後的值做統計
between會對start至end之間的值做統計,如果hardend為true的話,那麼改值就是各個時間段統計值的和
none 表示該項禁用
all 表示before,after,all都會統計
例:
&facet=on
&facet.date=date
&facet.date.start=2009-1-1T0:0:0Z
&facet.date.end=2010-1-1T0:0:0Z
&facet.date.gap=;1MONTH
&facet.date.other=all
(3)Facet Query說明如下
facet.query:可以對任意的欄位進行篩選
例:
&facet=on&facet.query=date:[2009-1-1T0:0:0ZTO 2010-1-1T0:0:0Z]
(4)Facet Range說明如下
注意:range範圍是左閉右開[start, end),如下
http://localhost:8080/solr/select?&facet=true&facet.range=price&facet.range.start=5000&facet.range.end=8000&facet.range.gap=1000
輸出結果如下
"facet_counts":{
"facet_ranges":{
"price":{
"counts”:[
"5000.0”,5,
"6000.0”,2,
"7000.0”,3,],
"gap":1000.0,
"start":5000.0,
"end":8000.0}}}}
(5)Facet Pivot說明如下
這個是Solr 4.0的新特性,pivot和facet一樣難理解,還是用例子來講吧。
語法:facet.pivot=field1,field2,field3...
例如: facet.pivot=comment_user,grade
#docs |
#docs grade:好 |
#docs grade:中 |
#docs grade:差 |
|
comment_user:1 |
10 |
8 |
1 |
1 |
comment_user:2 |
20 |
18 |
2 |
0 |
comment_user:3 |
15 |
12 |
2 |
1 |
comment_user:4 |
18 |
15 |
2 |
1 |
輸出結果如下
"facet_counts":{
"facet_pivot":{
"comment_user, grade ":[{
"field":"comment_user",
"value":"1",
"count":10,
"pivot":[{
"field":"grade",
"value":"好",
"count":8}, {
"field":"grade",
"value":"中",
"count":1}, {
"field":"grade",
"value":"差",
"count":1}]
},{
"field":" comment_user ",
"value":"2",
"count":20,
"pivot":[{……
沒有pivot機制的話,要做到上面那點可能需要多次查詢:
http://...q=comment&fq=grade:好&facet=true&facet.field=comment_user
http://...q=comment&fq=grade:中&facet=true&facet.field=comment_user
http://...q=comment&fq=grade:差&facet=true&facet.field=comment_use