一.Facet简介
Facet是Solr的高级搜索功能之一,可以给用户更好的搜索体验,在搜索关键字的同时,能够按照Facet的字段进行分组并统计。
wareName(关键字)-->wareKind(Facet字段)
二.Facet字段
1、 适宜被Facet的字段;
一般代表了实体的某种公共属性,如商品的分类,商品的制造厂家,书籍的出版商等等. 例: 积分商城中的礼品的大类、中类、小类
2、 Facet字段的要求;
为什么无需分词?
因为该字段的值代表了一个整体概念。如电脑的品牌”联想”代表了一个整体概念,如果拆成”联”,”想”两个字都不具有实际意义.另外该字段的值无需进行大小写转换等处理,保持其原貌即可.
为什么无需存储?
因为一般而言用户所关心的并不是该字段的具体值,而是作为对查询结果进行分组的一种手段,用户一般会沿着这个分组进一步深入搜索.
3、 特殊情况;
对于一般查询而言,分词和存储都是必要的.比如CPU类型”Intel 酷睿2双核 P7570”,拆分成”Intel”,”酷睿”,”P7570”这样一些关键字并分别索引,可能提供更好的搜索体验.但是如果将CPU作为Facet字段,最好不进行分词.这样就造成了矛盾,解决方法为,将CPU字段设置为不分词不存储,然后建立另外一个字段为它的COPY,对这个COPY的字段进行分词和存储
例如:积分商城中礼品名称wareName,由于按照礼品名称搜索,故需要分词和存储,如果要按照对应的关键字进行分组的话,就需要COPY。
<types>
<fieldType name="string" class="solr.StrField" omitNorms="true"/>
<fieldType name="my\_text" class="solr.TextField" >
<analyzer>
……
</analyzer>
</fieldType>
……
</types>
<fields>
<field name=”cpu” type=”string” indexed=”true” stored=”false”/>
<field name=”cpuCopy” type=”my\_text” indexed=”true” stored=”true”/>
……
</fields>
<copyField source="cpu" dest="cpuCopy"/>
三.Facet组件
四.Facet查询
进行Facet查询需要在请求参数中加入”facet=on”或者”facet=true”只有这样Facet组件才起作用.
1、 FieldFacet;
五.SolrJ对Facet的支持
SolrServer server = getSolrServer();//获取SolrServer
SolrQuery query = new SolrQuery();//建立一个新的查询
query.setQuery("\*:\*");
query.setFacet(true);//设置facet=on
query.addFacetField(new String\[\] \{ "cpu", "videoCard" \});//设置需要facet的字段
query.setFacetLimit(10);//限制facet返回的数量
QueryResponse response = server.query(query);
List<FacetField> facets = response.getFacetFields();//返回的facet列表
for(FacetField facet : facets) \{
System.out.println(facet.getName());
System.out.println("----------------");
List<Count> counts = facet.getValues();
for(Count count : counts) \{
System.out.println(count.getName() + ":" + count.getCount());
\}
System.out.println();
\}
实战演练:
1、 http://192.168.204.135:9081/solr/select?q=wareName:NBA&facet=on&facet.field=sKind;
搜索NBA,然后按照sKind进行分组
2、 联想词;
http://192.168.204.135:9081/solr/select?q=wareName:mp&facet=true&rows=0&facet.prefix=m&facet.field=wareName&facet.limit=10
http://192.168.204.135:9081/solr/select?q=wareName:mp&facet=true&rows=0&facet.prefix=mp3&facet.field=wareName&facet.limit=10
http://192.168.204.135:9081/solr/select?q=wareName:mp&facet=true&rows=0&facet.prefix=mp&facet.field=wareName&facet.limit=10