1. 程式人生 > >solr的facet查詢(轉載)

solr的facet查詢(轉載)

轉自http://www.cnblogs.com/chenying99/archive/2012/07/28/2613398.html

solr將以導航為目的的查詢結果稱為facet. 它並不會修改查詢結果資訊, 只是在查詢結果上根據分類添加了count資訊, 然後使用者根據count資訊做進一步的查詢, 比如淘寶的查詢列表中, 上面會表示不同的類目相關查詢結果的數量. 


比如搜尋數碼相機, 在搜尋結果欄會根據廠商, 解析度等維度列出, 這裡廠商, 解析度就是一個個facet. 

然後在廠商下面會有nikon, canon, sony等品牌, 這個叫約束(constraints) 

接下來是根據選擇, 列出當前的導航路徑, 這個叫麵包屑(breadcrumb). 


solr有幾種facet: 
普通facet, 比如從廠商品牌的維度建立fact 
查詢facet, 比如根據價格查詢時, 將根據價格, 設定多個區間, 比如0-10, 10-20, 20-30等 
日期facet, 也是一種特殊的範圍查詢, 比如按照月份進行facet. 

facet的主要好處就是可以任意對搜尋條件進行組合, 避免無效搜尋, 改善搜尋體驗. 

facet都是在查詢時通過引數指定. 比如 
在http api中這樣寫: 
引用 "&facet=true&facet.field=manu"
java程式碼這樣寫: 
Java程式碼  收藏程式碼
  1. new SolrQuery("*:*").setFacet(true
    ).addFacetField("manu");  


而xml返回的結果為這樣: 

Xml程式碼  收藏程式碼
  1. <lst name="facet_fields">  
  2.             <lst name="manu">  
  3.                <int name="Canon USA">17</int>  
  4.                <int name="Olympus">12</int>  
  5.                <int name="Sony">12</int>  
  6.                <
    int name="Panasonic">9</int>  
  7.                <int name="Nikon">4</int>  
  8.             </lst>  
  9. </lst>  


通過java程式碼可以這樣獲取facet結果: 
Java程式碼  收藏程式碼
  1. List<FacetField> facetFields = queryResponse.getFacetFields();  


在已有的查詢基礎上增加facet query, 可以這樣寫: 
Java程式碼  收藏程式碼
  1. solrQuery.addFacetQuery("quality:[* TO 10]")  


比如對價格按照指定的區間進行facet, 可以這樣加上facet字尾: 
引用 &facet=true&facet.query=price:[* TO 100] 
&facet.query=price:[100 TO 200];&facet.query=[price:200 TO 300] 
&facet.query=price:[300 TO 400];&facet.query=[price:400 TO 500] 
&facet.query=price:[500 TO *]

如果要對價格在400到500期間的產品做進一步的搜尋, 那麼可以這樣寫(使用了solr的過濾查詢): 
引用 http://localhost:8983/solr/select?q=camera &facet=on&facet.field=manu&facet.field=camera_type &fq=price:[400 to 500]

注意這裡的facet field不再包含price了 

如果這裡對型別做進一步的查詢, 那麼query語句可以這樣寫: 
引用 http://localhost:8983/solr/select?q=camera &facet=on&facet.field=manu &fq=price:[400 to 500] &fq=camera_type:SLR 

facet的使用場景: 
1.類目導航 
2.自動提示, 需要藉助一個支援多值的tag field. 
3.熱門關鍵詞排行, 也需要藉助一個tag field 

參考文件: 
http://www.lucidimagination.com/devzone/technical-articles/faceted-search-solr