Facet 介绍

 
Facet 是 solr 的高级搜索功能之一 ,可以给用户提供更友好的搜索体验,在搜索关键字的同时 , 能够按照 Facet 的字段进行分组并统计。
       比如你上淘宝,输入“笔记本”进行搜索,就会出现品牌分类,价格范围等分类,这个就叫facet了。这个例子也许不是那么准确的描述facet,不过基本上就是这个意思。对输入关键字后搜索出来的结果再进行分类。
       solr有几种facet: 
      普通facet,比如从厂商品牌的维度建立fact 。
      查询facet,比如根据价格查询时,将根据价格,设置多个区间,比如0-10, 10-20, 20-30等。
      日期facet, 也是一种特殊的范围查询,比如按照月份进行facet。
 
 

 
 进行Facet查询需要在请求参数中加入“facet=on”或“facet=true”只有这样Facet组件才起作用。
1. Field Facet
       Facet字段通过在请求中加入“facet.field”参数加以声明,如果需要对多个字段进行Facet查询,那么将该参数声明多次.比如
http://localhost:8081/solr/select?q=联想&facet=on&facet.field=cpu&facet.field=videoCard
       各个Facet字段互不影响,且可以针对每个Facet字段设置查询参数.以下介绍的参数既可以应用于所有的Facet字段,也可以应用于每个单独的Facet字段.应用于单独的字段时通过 f.字段名.参数名=参数值,这种方式调用。比如facet.prefix参数应用于cpu字段,可以采用如下形式
f.cpu.facet.prefix=Intel
package Facet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.apache.solr.client.solrj.response.QueryResponse;
public class SolrFacet {
public static void addIndex(){
HttpSolrClient server = solrServer.getServer();
List<ProductBO> list = new ArrayList<>();
ProductBO bo1 = new ProductBO();
bo1.setId("1001");
bo1.setTitle("27寸曲面显示器");
bo1.setMajor_s("电器");
bo1.setSubMajor_s("显示器");
bo1.setBrand_s("海尔儿");
bo1.setPrice_i(5000);
list.add(bo1);
bo1 = new ProductBO();
bo1.setId("1002");
bo1.setTitle("无敌28寸曲面显示器");
bo1.setMajor_s("无敌电器");
bo1.setSubMajor_s("无敌显示器");
bo1.setBrand_s("无敌海尔儿");
bo1.setPrice_i(6000);
list.add(bo1);
bo1 = new ProductBO();
bo1.setId("1003");
bo1.setTitle("超级28寸曲面显示器");
bo1.setMajor_s("超级电器");
bo1.setSubMajor_s("超级显示器");
bo1.setBrand_s("超级海尔儿");
bo1.setPrice_i(7000);
list.add(bo1);
bo1 = new ProductBO();
bo1.setId("1004");
bo1.setTitle("28寸曲面显示器");
bo1.setMajor_s("电器");
bo1.setSubMajor_s("显示器");
bo1.setBrand_s("海尔儿");
bo1.setPrice_i(7000);
list.add(bo1);
try {
server.addBeans(list);
server.commit();
} catch (SolrServerException | IOException e) {
e.printStackTrace();
}
} public static void facetQuery(){
HttpSolrClient server = solrServer.getServer();
SolrQuery query = new SolrQuery(); String para = "*:*";
query.setFacet(true);
query.addFacetField(new String[]{"subMajor_s","brand_s"});
query.setFacetLimit(100);//限制facet返回数量
query.setFacetMissing(false);//不统计null的值
query.setFacetMinCount(1);//分组的数据最小为1
query.addFacetQuery("price_i:[5000 TO 6000]");
query.setQuery(para);
QueryResponse queryResponse;
try {
queryResponse = server.query(query);
List<FacetField> list = queryResponse.getFacetFields();
for(FacetField f : list){
System.out.println(f.getName());
System.out.println("-------------------");
List<Count> values = f.getValues();
for(Count c : values){
System.out.println(c.getName() + ":" + c.getCount());
}
System.out.println("===================");
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
//addIndex();
facetQuery();
}
}
结果:
subMajor_s
-------------------
显示器:2
无敌显示器:1
超级显示器:1
===================
brand_s
-------------------
海尔儿:2
无敌海尔儿:1
超级海尔儿:1

===================

 
 
 
 
 
 

7.solr学习速成之facet的更多相关文章

  1. 10.solr学习速成之高亮显示

    Solr高亮显示的三种实现 高亮显示在搜索中使用的比较多,比较常用的有三种使用方式,如果要对某field做高亮显示,必须对该field设置stored=true .          第一种是普通的高 ...

  2. 9.solr学习速成之group

    Group与Facet的区别  facet的查询结果主要是分组信息:有什么分组,每个分组包括多少记录:但是分组中有哪些数据是不可知道的,只有进一步搜索.        group则类似于关系数据库的g ...

  3. 8.solr学习速成之FacetPivot

    什么是Facet.pivot  Facet.pivot就是按照多个维度进行分组查询,是Facet的加强,在实际运用中经常用到,一个典型的例子就是商品目录树 NamedList解释: NamedList ...

  4. 1.solr学习速成之配置文件

    什么是solr Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过H ...

  5. 2.solr学习速成之安装

    1.下载解压solr-5.3.1.tgz [root@205 opt]# tar -zxf solr-5.3.1.tgz -C /opt/module/ 2.将solr-5.3.1/server/so ...

  6. 13.solr学习速成之IK分词器

    IKAnalyzer简介 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. IKAnalyzer特性 a. 算法采用“正向迭代最细粒度切分算法”,支持细粒度和最大词长两 ...

  7. 12.solr学习速成之dataimport

    solr除了利用solrj建立索引外,还可以由列式数据库hbase触发器添加索引,自动全量或者增量索引关系数据库数据等. dataimport可以配置从任何关系数据库导入索引 1.将jar包拷贝到to ...

  8. 11.solr学习速成之MoreLikeThis

    Solr相似匹配    在网页搜索或电商产品搜索结果页面,很多时候会看到一个相似文档.相似产品或找相似的链接.Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeT ...

  9. 6.solr学习速成之multicore查询

    查询关联多个core 再新建一个core 向每个core添加索引,修改 final static String SOLR_URL = "http://localhost:8080/solr/ ...

随机推荐

  1. ubuntu下安装交叉编译工具链

    /usr/localmkdir arm 将文件file1复制成文件file2 cp file1 file2 /cp /mnt/hgfs/UbuntuGX/arm-2008q3-linux.tar.gz ...

  2. scrapy的简单使用以及相关设置属性的介绍

    0. 楔子(一个最简单的案例) 1.scrapy.Spider scrapy.spiders.Spider name allowed_domains start_urls custom_setting ...

  3. 理解RESTful风格(转)

    原文链接:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件 ...

  4. 【tensorflow:Google】二、Tensorflow环境搭建

    2.1 Tensorflow 主要依赖包 2.1.1 Protocol Buffer 结构化数据序列化的过程,另外的工具:XML, JSON, 区别:二进制(不可读):先定义数据格式,还原的时候将需要 ...

  5. H264的start code是什么?

    H.264起始码 在网络传输h264数据时,一个UDP包就是一个NALU,解码器可以很方便的检测出NAL分界和解码.但是如果编码数据存储为一个文件,原来的解码器将无法从数据流中分别出每个NAL的起始位 ...

  6. C++ 资源管理 —— RAII

    RAII:在构造函数中申请资源,在析构函数中释放资源. 1. RAII 自动实现锁资源的释放 void bad() { m.lock(); f(); if (COND) return; m.unloc ...

  7. 【MFC】MoveWindow();函数使用详解

    摘自:http://blog.csdn.net/yjkwf/article/details/5281207 CWnd::MoveWindow 详解 2010-02-02 16:08 3432人阅读 评 ...

  8. 使用iptables nat进行端口转发

    1.将发向HostA:PortA的请求转发到HostB:PortB iptables -t nat -A PREROUTING -p tcp -i eth0 -d HostA --dport Port ...

  9. 在Ajax.ActionLink的OnBegin,onComplete等事件中使用this【解决办法】

    方法就是修改这个文件[jquery.unobtrusive-ajax.js] options.data.push({ name: "X-Requested-With", value ...

  10. wlan经常掉线怎么办?

    有没有这样的情款,好好的网络总是突然断掉然,之后就需要重新连接,连接以后没多久有需要重新连接.本次经验就来和大家一起分享一下几种情况的解决方法,非常的简单实用. 工具/原料 电脑 电源设置问题 1.本 ...