1. 程式人生 > >Solr學習之—:solr facet

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