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中這樣寫:
html
引用java
"&facet=true&facet.field=manu"
java代碼 solrj這樣寫: web
query.setFacet(true);//是否分組查詢 query.setRows(0);//設置返回結果條數,若是你時分組查詢,你就設置爲0 query.addFacetField("region");//增長分組字段 q query.addFacetField("theme");//增長分組字段 q QueryResponse rsp = server.query(query); //取出結果 FacetField facetField = rsp.getFacetField("region"); List<Count> counts = null; if (facetField != null) { counts = facetField.getValues(); if (counts != null) { for (Count count : counts) { if (count.getCount() != 0) { listRegion.add(count.getName()+"("+count.getCount()+")"); } } map.put("region", listRegion); } } FacetField facetFieldTheme = rsp.getFacetField("theme"); List<Count> countsTheme = null; if (facetFieldTheme != null) { countsTheme = facetFieldTheme.getValues(); if (countsTheme != null) { for (Count count : countsTheme) { if (count.getCount() != 0) { listTheme.add(count.getName()+"("+count.getCount()+")"); } } map.put("theme", listTheme); } }
而xml返回的結果爲這樣: api
<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結果:spa
List<FacetField> facetFields = queryResponse.getFacetFields();
在已有的查詢基礎上增長facet query, 能夠這樣寫: code
solrQuery.addFacetQuery("quality:[* TO 10]")
好比對價格按照指定的區間進行facet, 能夠這樣加上facet後綴:
orm
引用server
&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 *]xml
若是要對價格在400到500期間的產品作進一步的搜索, 那麼能夠這樣寫(使用了solr的過濾查詢):
htm
引用
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