solr種以導航為目的的查詢結果成為facet,在用戶查詢的結果上根據分類增加了count信息,然後用戶根據count信息做進一步搜索。
facet主要用於導航實現漸進式精確搜索,從兩張圖來看看Facet用途。 (圖1)當進入重慶二手車列表時搜索條件會列出所有品牌、車系、價格區間、車系年貸款等等。 (圖2)當你點擊大眾時頁面刷新車系會列出大眾所屬的所有車系、價格區間。顧名思義我雖solr facet的理解也就是: 當然,你從京東導航、淘寶導航也能看到如此效果,這樣的場景下就是solr facet扮演的角色。
在接觸facet查詢過程中可以在solr控制台裡多觀察查詢路徑的變化及返回response的變化。
2.1 facet.field使用
q=條件 facet=true or facet=on facet.fields=品牌 facet.fields=車系 http://localhost:8080/solr/select/?q=*:*&facet=on&facet.field=品牌&facet.field=車系
<response> <lst name="responseHeader">......</lst> <result name="response" numFound="6" start="0">...</result> <lst name="facet_counts"> <lst name="facet_queries" /> <lst name="facet_fields"> <lst name="品牌"> <int name="大眾">1</int> <int name="奧迪">1</int> <int name="寶馬">1</int> </lst> <lst name="車系"> <int name="POLO">1</int> <int name="邁騰">1</int> </lst> </lst> <lst name="facet_dates" /> <lst name="facet_ranges" /> </lst> </response>
2.2 facet.query 查詢
facet.query類似於filter query的語法。可以提供自定義區間查詢,可以對任何字段進行區間篩選。
q=條件 facet=true &facet.query=price:[*+TO+3] &facet.query=price:[3.01+TO+5]
http://localhost:8080/solr/select/?q=*:*&fq=price%3A%5B3.01+TO+5%5D+&facet=true //注意使用facet.query時不再是facet.query字段,而是fq字段。
<response> <lst name="responseHeader">......</lst> <result name="response" numFound="6" start="0">...</result> <lst name="facet_counts"> <lst name="facet_queries"> <int name="price:[*+TO+3]">1</int> <int name="price:[3.01+5]">1</int> </lst> <lst name="facet_fields"/> <lst name="facet_dates" /> <lst name="facet_ranges" /> </lst> </response>
2.3 facet.Date
http://localhost:8080/solr/select?q=*:*&rows=0&facet=true&facet.date=added&facet.date.start=NOW/DAY-30DAYS&facet.date.end=NOW/DAY&facet.date.gap=+7DAY
<int name="2010-11-08T00:00:00Z">0</int> <int name="2010-11-15T00:00:00Z">0</int> <int name="2010-11-22T00:00:00Z">0</int> <int name="2010-11-29T00:00:00Z">2</int> <int name="2010-12-06T00:00:00Z">2</int>
2.4 key操作符
&facet=on
&facet.field={!key=中央處理器}cpu
&facet.field={!key=顯卡}videoCard
2.5 什麼字段適合用facet呢?
facet中適宜的字段一般代表某個實體的公共屬性,比如品牌、型號、價格區間、作者、廠商、書籍出版商等。
facet.prefix – 限制constaints的前綴
facet.mincount=0 – 限制constants count的最小返回值,默認為0
facet.sort=count – 排序的方式,根據count或者index
facet.offset=0 – 表示在當前排序情況下的偏移,可以做分頁
facet.limit=100 – constraints返回的數目
facet.missing=false – 是否返回沒有值的field
facet.date – Deprecated, use facet.range
facet.query
facet.method 取值為enum或fc,默認為fc.該字段表示了兩種Facet的算法,與執行效率相關.
facet.date、facet.date.start、facet.date.end、facet.date.gap、facet.date.hardend
wiki https://wiki.apache.org/solr/SimpleFacetParameters
http://www.coin163.com/java/docs/201310/d_3010029802.html
http://www.tuicool.com/articles/Iv2UjiU
http://blog.csdn.net/zhangshuliai/article/details/8022316