solr的facet查詢

原帖地址:http://www.blogjava.net/conans/articles/379555.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代碼這樣寫:

new SolrQuery("*:*").setFacet(true).addFacetField("manu");

而xml返回的結果爲這樣:

<lst name="facet_fields">
           
<lst name="manu">
              
<int name="Canon USA">17</int>
              
<int name="Olympus">12</int>
              
<int name="Sony">12</int>
              
<int name="Panasonic">9</int>
              
<int name="Nikon">4</int>
           
</lst>
</lst>

通過java代碼可以這樣獲取facet結果:

List<FacetField> facetFields = queryResponse.getFacetFields();

在已有的查詢基礎上增加facet query,可以這樣寫:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章