文档章节

solr4.7开发实践 3——分组查询facet

一枚Sir
 一枚Sir
发布于 2014/04/15 16:50
字数 749
阅读 2894
收藏 7

solr将以导航为目的的查询结果称为facet. 它并不会修改查询结果信息, 只是在查询结果上根据分类添加了count信息, 然后用户根据count信息做进一步的查询, 比如淘宝的查询列表中, 上面会表示不同的类目相关查询结果的数量. 

比如搜索数码相机, 在搜索结果栏会根据厂商, 分辨率等维度列出, 这里厂商, 分辨率就是一个个facet. 

然后在厂商下面会有nikon, canon, sony等品牌, 这个叫约束(constraints) 

接下来是根据选择, 列出当前的导航路径, 这个叫面包屑(breadcrumb). 

solr有几种facet: 
普通facet, 比如从厂商品牌的维度建立fact 
查询facet, 比如根据价格查询时, 将根据价格, 设置多个区间, 比如0-10, 10-20, 20-30等 
日期facet, 也是一种特殊的范围查询, 比如按照月份进行facet. 

facet的主要好处就是可以任意对搜索条件进行组合, 避免无效搜索, 改善搜索体验. 

facet都是在查询时通过参数指定. 比如 
在http api中这样写: 

引用

"&facet=true&facet.field=manu"

java代码 solrj这样写: 

   query.setFacet(true);//是否分组查询
   query.setRows(0);//设置返回结果条数,如果你时分组查询,你就设置为0
   query.addFacetField("region");//增加分组字段   q
   query.addFacetField("theme");//增加分组字段   q
   QueryResponse rsp = server.query(query);
   //取出结果  
   FacetField facetField = rsp.getFacetField("region");
   List<Count> counts = null;
   if (facetField != null) {
     counts = facetField.getValues();
     if (counts != null) {
      for (Count count : counts) {
       if (count.getCount() != 0) {
        listRegion.add(count.getName()+"("+count.getCount()+")");
      }
      }
      map.put("region", listRegion);
     }
   }
   
   FacetField facetFieldTheme = rsp.getFacetField("theme");
   List<Count> countsTheme = null;
   if (facetFieldTheme != null) {
    countsTheme = facetFieldTheme.getValues();
     if (countsTheme != null) {
      for (Count count : countsTheme) {
         if (count.getCount() != 0) {
        listTheme.add(count.getName()+"("+count.getCount()+")");
      }
      }
      map.put("theme", listTheme);
     }
   }

而xml返回的结果为这样: 

<lst name="facet_fields">
            <lst name="manu">
               <int name="Canon USA">17</int>
               <int name="Olympus">12</int>
               <int name="Sony">12</int>
               <int name="Panasonic">9</int>
               <int name="Nikon">4</int>
            </lst>
</lst>

通过java代码可以这样获取facet结果:

List<FacetField> facetFields = queryResponse.getFacetFields();

在已有的查询基础上增加facet query, 可以这样写: 

solrQuery.addFacetQuery("quality:[* TO 10]")

比如对价格按照指定的区间进行facet, 可以这样加上facet后缀: 

引用

&facet=true&facet.query=price:[* TO 100] 
&facet.query=price:[100 TO 200];&facet.query=[price:200 TO 300] 
&facet.query=price:[300 TO 400];&facet.query=[price:400 TO 500] 
&facet.query=price:[500 TO *]



如果要对价格在400到500期间的产品做进一步的搜索, 那么可以这样写(使用了solr的过滤查询): 

引用

http://localhost:8983/solr/select?q=camera &facet=on&facet.field=manu&facet.field=camera_type &fq=price:[400 to 500]



注意这里的facet field不再包含price了 

如果这里对类型做进一步的查询, 那么query语句可以这样写: 

引用

http://localhost:8983/solr/select?q=camera &facet=on&facet.field=manu &fq=price:[400 to 500] &fq=camera_type:SLR 



facet的使用场景: 
1.类目导航 
2.自动提示, 需要借助一个支持多值的tag field. 
3.热门关键词排行, 也需要借助一个tag field 

 

© 著作权归作者所有

一枚Sir
粉丝 119
博文 209
码字总数 350904
作品 0
朝阳
架构师
私信 提问
solr高级查询——group和facet

概述 facet只是简单统计记录数,如果需要获取doc信息,并不能为每组数据返回实际的数据回来,查询实际数据还需要再次进行查询,group类似于关系型数据库中的group by,除了分组外,还能返回实...

freeli
2018/08/31
341
0
solr高级查询——facet分面

1.简述 1.1 概念 分面搜索也称为分面浏览,他允许用户在执行搜索时,根据文档的一个或者多个方面(即分面)对搜索结果进行细分。用户通过选择不同的过滤器来探索搜索结果。 1.2 应用场景 在搜...

freeli
2018/09/03
100
0
Lucene 之 Facet

说到Facet,我还真找不到一个合适的中文词汇来描述它,英文翻译是方面,感觉不够贴切,大家也不必纠结它的中文叫法是啥,你只需要知道使用Facet能解决什么类型的问题就行了,来看几个典型的应...

引鸩怼孑
2015/04/17
171
3
solr中facet及facet.pivot理解(整合两篇文章保留参考)

Facet['fæsɪt]很难翻译,只能靠例子来理解了。Solr作者Yonik Seeley也给出更为直接的名字:导航(Guided Navigation)、参数化查询(Paramatic Search)。 上面是比较直接的Faceted Searc...

飞翼
2016/12/13
120
0
#研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

首先要感谢王超和胡耀华两位研发经理以严谨治学的研究精神和孜孜以求的工作态度给我们提供了高可用、可伸缩、高性能的ES方案。 一,曾经的基于 MongoDB 的筛选+排序解决方案 电商的商品展示无...

旁观者-郑昀
2014/12/16
189
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
32分钟前
3
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部