Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够按照Facet的字段进行分组并统计。例如下图所示,你上淘宝,输入“电脑”进行搜索,就会出现品牌分类,价格范围等分类,这个就叫Facet。
二)Solr Facet类型
Solr提供了4种类型的Fact
<lst name="facet_counts"> <lst name="facet_queries"/> <lst name="facet_fields"/> <lst name="facet_dates"/> <lst name="facet_ranges"/> </lst>
1. facet_queries:代表自定义条件查询facet,类似数据库的count函数2. facet_fields :代表根据字段分组查询,类似数据库的group by count的组合
3. facet_dates :根据日期区间分组查询
4. facet_ranges:当然了,日期有区间,数字也有,这个就是根据数字分组查询
三)Solr Facet组件
Solr的默认requestHandler已经包含了Facet组件(solr.FacetComponent).如果自定义requestHandler或者对默认的requestHandler自定义组件列表,那么需要将Facet加入到组件列表中去.
四)facet query
Facet Query 用户自定义条件查询facet,他提供了非常灵活的Facet.通过facet.query参数,可以对任意字段进行筛选.下面通过实例来阐述。基本上他的用法,都会在我实例中体现出来
例一:日期区间查询
&facet=true &facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z] &facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]
返回结果如下:<lst name="facet_counts"> <lst name="facet_queries"> <int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int> <int name="date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]">3</int> </lst> <lst name="facet_fields"/> <lst name="facet_dates"/> </lst>
例2:数字区间统计
&facet=on &facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z] &facet.query=price:[* TO 5000]
返回结果
<lst name="facet_counts"> <lst name="facet_queries"> <int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int> <int name="price:[* TO 5000]">116</int> </lst> <lst name="facet_fields"/> <lst name="facet_dates"/> </lst>
例3:自定义条件
&facet=true &facet.query=brand:联想 AND price:1100
返回结果
"facet_counts":{ "facet_queries":{ "brand:联想 AND price:1100":1}, "facet_fields":{}, "facet_dates":{}, "facet_ranges":{}}}
五)Field Facet
Facet字段通过在请求中加入facet.field参数加以声明,如果需要对多个字段进行Facet查询,那么将该参数声明多次.这就是类似于数据库的group by 加上count的功能,非常的灵活。
实例一:最简单的field facet
&facet=true &facet.field=brand &facet.field=price
返回结果如下"facet_counts":{ "facet_queries":{}, "facet_fields":{ "brand":[ "苹果",4, "联想",3, "惠普",2], "price":[ "1100.0",2, "2200.0",2, "3300.0",2, "1200.0",1, "2100.0",1, "4400.0",1]}, "facet_dates":{}, "facet_ranges":{}}}
从返回结果可以看出各个field字段互不影响;而且可以针对,下面实例会体现
每个Facet字段设置查询参数.以下介绍的参数既可以应用于所有的Facet字段,也可以应用于每个单独的Facet字段.应用于单独的字段时通过下面语法实现
1. f.字段名.参数名=参数值
例如:将facet.prefix参数应用于brand字段,可以采用如下形式
&facet.field=brand &facet.field=price &f.brand.facet.prefix=联
返回结果如下: