8.2Solr API使用(Facet查询)

时间:2021-08-17 06:51:57

Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够按照Facet的字段进行分组并统计。例如下图所示,你上淘宝,输入“电脑”进行搜索,就会出现品牌分类,价格范围等分类,这个就叫Facet。

8.2Solr API使用(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=联

返回结果如下: