Solr中Facet用法和Group用法
Group分组划分结果,返回的是分组结果;
Facet分组统计,侧重统计,返回的是分组后的数量;
一、Group用法:
//组查询基础配置
params.set(GroupParams.GROUP, "true");
params.set(GroupParams.GROUP_FIELD, "dkeys");根据dkeys域上的值来分组划分结果,建议dkeys上不要分词;
params.set(GroupParams.GROUP_LIMIT, "5");
params.set(GroupParams.GROUP_FORMAT, "grouped");
params.set(GroupParams.GROUP_MAIN, "false");
Group查询结果遍历方式:
QueryResponse response = solrServer.query(query);
GroupResponse groupResponse = response.getGroupResponse();
List<GroupCommand> ls = groupResponse.getValues();
for(GroupCommand gc:ls){
List<Group> list = gc.getValues();
for(Group g : list){
SolrDocumentList sdl = g.getResult();
if (CollectionUtils.isNotEmpty(sdl)) {
for (SolrDocument doc : sdl) {
System.out.println(doc.toString());//相同的dkeys下的文档每5个作为一组返回;
}
}
}
}
此时普通遍历结果的方法无效:
SolrDocumentList results = response.getResults();
System.out.println(ls+"\t\t"+results);//输出null
二、Facet用法:类似。也有自己独立的遍历方式
1 、什么是Faceted Search
Facet['fæsɪt]很难翻译,只能靠例子来理解了。Solr作者Yonik Seeley也给出更为直接的名字:导航(Guided Navigation)、参数化查询(Paramatic Search)。

上面是比较直接的Faceted Search例子,品牌、产品特征、卖家,均是 Facet 。而Apple、Lenovo等品牌,就是 Facet values 或者说 Constraints ,而Facet values所带的统计值就是 Facet count/Constraint count 。
2 、Facet 使用
q = 超级本
facet = true
facet.field = 产品特性
facet.field = 品牌
facet.field = 卖家
http://…/select?q=超级本&facet=true&wt=json
&facet.field=品牌&facet.field=产品特性&facet.field=卖家
也可以提交查询条件,设置fq(filter query)。
q = 电脑
facet = true
fq = 价格:[8000 TO *]
facet.mincount = 1 // fq将不符合的字段过滤后,会显示count为0
facet.field = 产品特性
facet.field = 品牌
facet.field = 卖家
http://…/select?q=超级本&facet=true&wt=json
&fq=价格:[8000 TO *]&facet.mincount=1
&facet.field=品牌&facet.field=产品特性&facet.field=卖家
"facet_counts": {
"facet_fields": {
"品牌": [
"Apple", 4,
"Lenovo", 39
…]
"产品特性": [
"显卡", 42,
"酷睿", 38
…]
…}}
如果用户选择了Apple这个分类,查询条件中需要添加另外一个fq查询条件,并移除Apple所在的facet.field。
http://…/select?q=超级本&facet=true&wt=json
&fq=价格:[8000 TO *]&fq=品牌:Apple&facet.mincount=1
&facet.field= 品牌&facet.field=产品特性&facet.field=卖家
3 、Facet 参数
facet.prefix – 限制constaints的前缀
facet.mincount=0 – 限制constants count的最小返回值,默认为0
facet.sort=count – 排序的方式,根据count或者index
facet.offset=0 – 表示在当前排序情况下的偏移,可以做分页
facet.limit=100 – constraints返回的数目
facet.missing=false – 是否返回没有值的field
facet.date – Deprecated, use facet.range
facet.query
指定一个查询字符串作为Facet Constraint
facet.query = rank:[* TO 20]
facet.query = rank:[21 TO *]
"facet_counts": {
"facet_fields": {
"品牌": [
"Apple", 4,
"Lenovo", 10
…]
"产品特性": [
"显卡", 11,
"酷睿", 20
…]
…}}
facet.range
http://…/select?&facet=true
&facet.range=price
&facet.range.start=5000
&facet.range.end=8000
&facet.range.gap=1000(每1000分一组,5000-6000一组,6000-7000一组,7000-8000一组)
<result numFound="27" ... />
...
<lst name="facet_counts">
<lst name="facet_queries">
<int name="rank:[* TO 20]">2</int>
<int name="rank:[21 TO *]">15</int>
</lst>
...
WARNING: range范围是左闭右开,[start, end)
facet.pivot
这个是Solr 4.0的新特性,pivot和facet一样难理解,还是用例子来讲吧。
Syntax: facet.pivot=field1,field2,field3...
e.g. facet.pivot=comment_user, grade
|
#docs |
#docs grade:好 |
#docs 等级:中 |
#docs 等级:差 |
|
|
comment_user:1 |
10 |
8 |
1 |
1 |
|
comment_user:2 |
20 |
18 |
2 |
0 |
|
comment_user:3 |
15 |
12 |
2 |
1 |
|
comment_user:4 |
18 |
15 |
2 |
1 |
"facet_counts":{
"facet_pivot":{
"comment_user, grade ":[{
"field":"comment_user",
"value":"1",
"count":10,
"pivot":[{
"field":"grade",
"value":"好",
"count":8}, {
"field":"grade",
"value":"中",
"count":1}, {
"field":"grade",
"value":"差",
"count":1}]
}, {
"field":" comment_user ",
"value":"2",
"count":20,
"pivot":[{
…
没有pivot机制的话,要做到上面那点可能需要多次查询:
http://...q= comment&fq= grade:好&facet=true&facet.field=comment_user
http://...q=comment&fq=grade:中&facet=true&facet.field=comment_user
http://...q=comment&fq=grade:差&facet=true&facet.field=comment_user
Facet.pivot - Computes a Matrix of Constraint Counts across multiple Facet Fields. by Yonik Seeley.
上面那个解释很不错,只能理解不能翻译。
返回查询集合中指定field的统计情况,例如找到city一样的文档数目:
加入文档
- <add>
- <doc>
- <field name="id">1</field>
- <field name="name">Company 1</field>
- <field name="city">New York</field>
- </doc>
- <doc>
- <field name="id">2</field>
- <field name="name">Company 2</field>
- <field name="city">New Orleans</field>
- </doc>
- <doc>
- <field name="id">3</field>
- <field name="name">Company 3</field>
- <field name="city">New York</field>
- </doc>
- </add>
查询:http://localhost:8983/solr/select?q=name:company&facet=true&facet.field=city&facet.mincount=1
结果:
- <lst name="facet_fields">
- <lst name="city">
- <int name="New York">2</int>
- <int name="New Orleans">1</int>
- </lst>
- </lst>
获得指定日期范围内的文档:添加的文档
- <add>
- <doc>
- <field name="id">1</field>
- <field name="title">Lucene or Solr ?</field>
- <field name="added">2010-12-06T12:12:12Z</field>
- </doc>
- <doc>
- <field name="id">2</field>
- <field name="title">My Solr and the rest of the world</field>
- <field name="added">2010-12-07T11:11:11Z</field>
- </doc>
- <doc>
- <field name="id">3</field>
- <field name="title">Solr recipes</field>
- <field name="added">2010-11-30T12:12:12Z</field>
- </doc>
- <doc>
- <field name="id">4</field>
- <field name="title">Solr cookbook</field>
- <field name="added">2010-11-29T12:12:12Z</field>
- </doc>
- </add>
查询语句:分别指定时间的field,开始时间和结束时间,gap指定时间的划分,结果显示时间区间的数目。
http://localhost:8983/solr/select?q=*:*&rows=0&facet=true&facet.date=added&facet.date.start=NOW/DAY-30DAYS&facet.date.end=NOW/DAY&facet.date.gap=+7DAY
结果:
- <int name="2010-11-08T00:00:00Z">0</int>
- <int name="2010-11-15T00:00:00Z">0</int>
- <int name="2010-11-22T00:00:00Z">0</int>
- <int name="2010-11-29T00:00:00Z">2</int>
- <int name="2010-12-06T00:00:00Z">2</int>
得到数值范围的数目,和时间范围一样:
http://localhost:8983/solr/select?q=*:*&rows=0&facet=true&facet.range=price&facet.range.start=0&facet.range.end=400&facet.range.gap=100
自定义区间,而不是连续区间的划分:
http://localhost:8983/solr/select?q=name:car&facet=true&facet.query=price:[10 TO 80]&facet.query=price:[90 TO 300]
移除过滤:
http://localhost:8983/solr/select?q=name:company&facet=true&fq={!tag=stateTag}state:"New York"&facet.field={!ex=stateTag}city&facet.field={!ex=stateTag}state
fq={!tag=stateTag}state:"New York":只显示state为"New York"的结果。
facet.field={!ex=stateTag}city:移除stateTag的过滤后,在结果集中,对city域进行统计。
命名facet结果集:
http://localhost:8983/solr/select?q=name:company&facet=true&fq={!tag=stateTag}state:Luiziana&facet.field={!key=stateFiltered}city&facet.field={!ex=stateTag key=stateUnfiltered}state
acet.field={!key=stateFiltered}city:命名city为stateFiltered,并按照前面的过滤
对facet结果集进行排序按照字典序排序,默认是按数量排序:
http://localhost:8983/solr/select?q=name:house&facet=true&facet.field=city&facet.sort=index
实现自动提示:前缀为so的都会显示,一般不需要分词
http://localhost:8983/solr/select?q=*:*&rows=0&facet=true&facet.field=title_autocomplete&facet.prefix=so
得到某一个域中不含某词的facet,也可以是不含某个域:
http://localhost:8983/solr/select?q=title:solr&facet=true&facet.query=!price:[* TO *]
指定结果集数目的统计facet:-1表示所有
http://localhost:8983/solr/select?q=title:solr&facet=true&facet.field=category&facet.limit=-1
指定不同域的facet的限制数目:一个没限制,一个限制10
http://localhost:8983/solr/select?q=name:car&facet=true&facet.field=category&facet.field=manufacturer&f.category.facet.limit=-1&f.manufacturer.face
Solr中Facet用法和Group用法的更多相关文章
- solr中facet及facet.pivot理解(整合两篇文章保留参考)
Facet['fæsɪt]很难翻译,只能靠例子来理解了.Solr作者Yonik Seeley也给出更为直接的名字:导航(Guided Navigation).参数化查询(Paramatic Searc ...
- solr中facet及facet.pivot理解
Facet['fæsɪt]很难翻译,只能靠例子来理解了.Solr作者Yonik Seeley也给出更为直接的名字:导航(Guided Navigation).参数化查询(Paramatic Searc ...
- 指尖上的电商---(8)Solr中Facet的使用方法
在大型电子商务站点中,在商品列表页,我们都能够看到商品按分类,品牌,价格的分类显示,例如以下图,这些我们能够使用solr中的facet功能实现. facet的基本功能就是对搜索结果中的商品进行分类. ...
- Solr中的group与facet的区别
Solr中的group与facet的区别 如果是简单的使用的话,那么Facet与group都可以用来进行数据的聚合查询,但是他们还是有很大的区别的. 首先上facet跟group的操作: Facet的 ...
- Solr中的group与facet的区别 [转]
Solr中的group与facet的区别 facet 自己理解就是分组聚合用的, 如下说明 http://blog.csdn.net/a925907195/article/details/472572 ...
- 分组函数group by和Oracle中分析函数partition by的用法以及区别
1.分组函数group by和Oracle中分析函数partition by的用法以及区别 2.开窗函数.
- sql中的 where 、group by 和 having 用法解析
--sql中的 where .group by 和 having 用法解析 --如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术 ...
- Solr 中的 docValues=true
前言: 在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticsearch用户,无疑来说是一个福音,这玩意的出现通过牺牲一定的磁盘空间带来 ...
- 查询语句中select from where group by having order by的执行顺序
查询语句中select from where group by having order by的执行顺序 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select--from--w ...
随机推荐
- python 递归求阶乘
#用递归函数求 n 阶乘的值 def factorial(i): : else: )# sum=n*(n-)!所以直接调用自身 n=int(input('请输入阶乘数:')) ): print('%d ...
- 【Python】使用Pytest集成Allure生成漂亮的图形测试报告
前言 大概两个月前写过一篇<[测试设计]使用jenkins 插件Allure生成漂亮的自动化测试报告>的博客,但是其实Allure首先是一个可以独立运行的测试报告生成框架,然后才有了Jen ...
- 基于Oracle的SQL优化(崔华著)-整理笔记-第5章“Oracle里的统计信息”
第5章“Oracle里的统计信息” 详细介绍了Oracle数据库里与统计信息相关的各个方面的内容,包括 Oracle数据库中各种统计信息的分类.含义.收集和查看方法,以及如何在Oracle数据库里正确 ...
- 深入理解javascript之typeof和instanceof
1.https://blog.csdn.net/mevicky/article/details/50353881 (深入理解javascript之typeof和instanceof)
- Qt 线程基础
(转自:http://my.oschina.net/laopiao/blog/88158) 何谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据 ...
- Fedora BCM43142 无线网卡驱动安装
OS:Fedora 25 KDE 系统内核:4.10.16-200.fc25.x86_64 #1 网卡:BCM43142 1.识别自己的网卡型号:命令:lspci | grep -i broadcom ...
- 6.4-6.5 使用form表单验证,完善登录页面
之前是使用自定义的类来实现登录逻辑,现在使用django内置的form表单验证,用继承django的view来实现登录页面. users > views.py 的内容是: from django ...
- 转:Android-apt
转自http://blog.csdn.net/zjbpku/article/details/22976291 What is this? The Android-apt plugin assists ...
- Swift 获取plist文件展示在TableView上
// 1.定义二维数组 var data:[[String]]! override func viewDidLoad() { super.viewDidLoad() // 2.实例化tableView ...
- BZOJ5312: 冒险【线段树】【位运算】
Description Kaiser终于成为冒险协会的一员,这次冒险协会派他去冒险,他来到一处古墓,却被大门上的守护神挡住了去路,守护神给出了一个问题, 只有答对了问题才能进入,守护神给出了一个自然数 ...