Result Grouping / Field Collapsing-结果分组
WiKi:http://wiki.apache.org/solr/FieldCollapsing
Introduction
字段折叠和结果分组是考虑相同solr功能的两种不同的方式.
字段折叠折叠一组具有相同字段值的结果到一个单个(或固定数量)的条目(实体)中.例如,大多数搜索引擎如谷歌聚合站点,所以只有一个或两个条目显示,然后点击这个站点连接,用户可以查阅来自这个站点的更多结果.字段折叠还具有抑制重复的文件的功能.
结果分组使用普通的字段值将文档分为多组.返回每组文档的前几个文档.一个常见的例子就是搜索购买率比较高的term,如DVD,这里展示了每组分类("TVs & Video","Movies","Computers"等)的前3个结果.
Quick Start
现在我们发送一个查询请求给solr,然后打开结果分组,我们首先试着对manu_exact字段分组,你目前只能分组为单值字段:
...&q=solr+memory&group=true&group.field=manu_exact
返回分组响应结果:
[...]
"grouped":{
"manu_exact":{
"matches":6,
"groups":[{
"groupValue":"Apache Software Foundation",
"doclist":{"numFound":1,"start":0,"docs":[
{
"id":"SOLR1000",
"name":"Solr, the Enterprise Search Server"}]
}},
{
"groupValue":"Corsair Microsystems Inc.",
"doclist":{"numFound":2,"start":0,"docs":[
{
"id":"VS1GB400C3",
"name":"CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail"}]
}},
{
"groupValue":"A-DATA Technology Inc.",
"doclist":{"numFound":1,"start":0,"docs":[
{
"id":"VDBDB1A16",
"name":"A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM"}]
}},
{
"groupValue":"Canon Inc.",
"doclist":{"numFound":1,"start":0,"docs":[
{
"id":"0579B002",
"name":"Canon PIXMA MP500 All-In-One Photo Printer"}]
}},
{
"groupValue":"ASUS Computer Inc.",
"doclist":{"numFound":1,"start":0,"docs":[
{
"id":"EN7800GTX/2DHTV/256M",
"name":"ASUS Extreme N7800GTX/2DHTV (256 MB)"}]
}}]}}
响应表面总共有6个结果匹配.对于每个group.field的唯一值,都会返回一个doc集合,默认包含第一个最高得分文档返回.这个文档集合(docList)同样给出了分组的文档总数--numFound.这些组同样按照他们每组内的第一个文档的得分排序.
我们也可以使用group.query命令(和facet.query命令很像)按查询分组文档.例如,我们可以找到不同价格范围的前3个文档.
...&q=memory&group=true&group.query=price:[0 TO 99.99]&group.query=price:[100 TO *]&group.limit=3
[...]
"grouped":{
"price:[0 TO 99.99]":{
"matches":5,
"doclist":{"numFound":1,"start":0,"docs":[
{
"name":"CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail",
"price":74.99}]
}},
"price:[100 TO *]":{
"matches":5,
"doclist":{"numFound":3,"start":0,"docs":[
{
"name":"Canon PIXMA MP500 All-In-One Photo Printer",
"price":179.99},
{
"name":"CORSAIR XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail",
"price":185.0},
{
"name":"ASUS Extreme N7800GTX/2DHTV (256 MB)",
"price":479.95}]
}}
[...]
从上面的响应我们可以看出有5个结果匹配了基础查询"memory",其中,一个价格在$100以下,3个在$100以上,这加起来不够5个,这是因为有一个文档没有价格,因此,这个文档不匹配任何一个分组查询.
通过参数group.main=true,我们可以选择性的使用分组结果作为"main"结果.尽管这个结果没有太多信息,但是它比较容易让客户端解析数据.
...&q=solr+memory&group=true&group.field=manu_exact&group.main=true
"response":{"numFound":6,"start":0,"docs":[
{
"id":"SOLR1000",
"name":"Solr, the Enterprise Search Server",
"manu":"Apache Software Foundation"},
{
"id":"VS1GB400C3",
"name":"CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail",
"manu":"Corsair Microsystems Inc."},
{
"id":"VDBDB1A16",
"name":"A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM",
"manu":"A-DATA Technology Inc."},
{
"id":"0579B002",
"name":"Canon PIXMA MP500 All-In-One Photo Printer",
"manu":"Canon Inc."},
{
"id":"EN7800GTX/2DHTV/256M",
"name":"ASUS Extreme N7800GTX/2DHTV (256 MB)",
"manu":"ASUS Computer Inc."}]
}
Request Parameters
group: 参数值true/false 打开关闭分组.
group.field : 参数值:字段名称,基于字段唯一的值来分组的.这个字段必须是单值字段,并且是必须被索引的字段.
group.func: 参数值:查询函数,这个参数支持版本4.0以上的.
group.query: 参数值:查询,这是基于查询的分组.
rows: 参数值:number,返回分组的组数.
start: 参数值:number,结果分组集合的偏移量.
group.limit: 参数值:number,每组返回的结果数.默认是1.
group.offset: 参数值:number,每组返回的起始偏移量.
sort: 参数值:[sortspec],如何对分组排序,例如,sort=popularity desc将导致分组按照每组最高人气的文档排序.默认是"score desc".
group.sort: 参数值:[sortspec],如果在组内排序文档,默认值和sort参数一样.
group.format: 参数值:grouped/simple,如果simple,分组的文档展现成一个单独的平面列表.这时候start和rows参数关联的就是文档的数量了,不再是分组的组数量.
group.main: 参数值:true/false,如果为true,最后一个字段的分组结果将被作为响应的主结果列表.使用group.format=simple.
group.ngroups: 参数值:true/false,如果为true,包含匹配查询的分组数量.默认是false.
group.truncate: 参数值:true/false,facet计数是根据匹配查询的每组最相关的文档.
group.facet: 参数值:true/false,
group.cache.percent:参数值:[0-100],如果> 0,开启分组缓存.分组事实上是执行了两次搜索,这个选项缓存了第二次搜索,值为0则关闭分组缓存.默认是0.测试发现,这个缓存只能提高boolean查询,通配符查询,模糊查询的搜索时间.举个简单的例子,对于term查询或者是全匹配查询,这个缓存就会对搜索有消极的影响.
注意:
1.可以在单个request请求中指定多个分组命令(如group.field, group.func, group.query)
2.分组同样支持分布式搜索.group.truncate和group.func是唯一不支持分布式搜索的参数.
Known Limitations
1.目前还不支持在多值字段上分组.
2.进一步的性能改进计划很快!
不当之处,还请指正! 谢谢!
Result Grouping / Field Collapsing-结果分组的更多相关文章
- Distributed Result Grouping Caveats
Distributed Result Grouping Caveats Grouping is supported distributed searches, with some caveats: 1 ...
- 8.4Solr API使用(Result Grouping分组查询)
转载请出自出处:http://eksliang.iteye.com/blog/2169458 一.概述 分组统计查询不同于分组统计(Facet),facet只是简单统计记录数,并不能为每组数据返回实际 ...
- elasticsearch 基础 —— Field Collapsing字段折叠
允许根据字段值折叠搜索结果.通过按折叠键选择顶部排序文档来完成折叠.例如,下面的查询检索每个用户的最佳推文,并按喜欢的数量对它们进行排序. GET /twitter/_search { "q ...
- solr调用lucene底层实现倒排索引源码解析
1.什么是Lucene? 作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用, ...
- solr服务器的查询过程
SolrDispatchFilter的作用 This filter looks at the incoming URL maps them to handlers defined in solrcon ...
- solr源码分析之searchComponent
上文solr源码分析之数据导入DataImporter追溯中提到了solr的工作流程,其核心是各种handler. handler定义了各种search Component, @Override pu ...
- Storm Grouping —— 流分组策略
Storm Grouping: Shuffle Grouping :随机分组,尽量均匀分布到下游Bolt中 将流分组定义为混排.这种混排分组意味着来自Spout的输入将混排,或随机分发给此Bolt中的 ...
- Storm累计求和中使用各种分组Grouping
Shuffle Grouping: 随机分组, 随机派发stream里面的tuple, 保证bolt中的每个任务接收到的tuple数目相同.(它能实现较好的负载均衡) Fields Grouping: ...
- Solr系列六:solr搜索详解优化查询结果(分面搜索、搜索结果高亮、查询建议、折叠展开结果、结果分组、其他搜索特性介绍)
一.分面搜索 1. 什么是分面搜索? 分面搜索:在搜索结果的基础上进行按指定维度的统计,以展示搜索结果的另一面信息.类似于SQL语句的group by 分面搜索的示例: http://localhos ...
随机推荐
- 最近github上的一些有用链接资料备份
https://github.com/dlunion 这个人写了库里面有caffe简单版本的代码,依赖少的版本,他的caffe可以支持ssd和lstm序列识别等等 还有openPose等库代码 OCR ...
- POJ 3279 Fliptile(反转 +二进制枚举)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13631 Accepted: 5027 Descrip ...
- [转]Jsp 映射
<servlet> <servlet-name>SimpleJspServlet</servlet-name> <jsp-file>/jsp/simpl ...
- 模块初识2-模块的默认保存路径Python36-32\\lib\\site-packages,Python36-32\,标准库和第三方库
import 可以直接导入当前目录的其他脚本 如果你把login.py移动到new_dir的目录下,那么就会提示找不到模块: 要解决这个问题,有两个方法: 1.把login.py复制到C:\\User ...
- JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
一般商业网站都有一个语言的需求,就是为了照顾使用正体中文的国人,会特地提供一个切换到正体中文的选项(或曰“繁体中文”).传统做法是在服务端完成的,即通过某些控件或者过滤器转换文本语言.这里笔者介绍一种 ...
- 022:SQL优化--JOIN算法
目录 一. SQL优化--JOIN算法 1.1. JOIN 写法对比 2. JOIN的成本 3. JOIN算法 3.1. simple nested loop join 3.2. index nest ...
- Code blocks调试教程
特别声明:本教程已转移至百度经验:https://jingyan.baidu.com/article/6b182309939a87ba58e159bf.html 一.题外话 之前一直想用Code bl ...
- org.hibernate.Session常用方法的作用总结
clear(): 清理session缓存.把所有加载出来的持久化实例都从session缓存中清除,同时,也会挂掉当前session中正在排队的save,update,delete操作. evict: ...
- 跨境B2B电商
主要处理问题:解决整个支付和流通环节,各国双方的供应商和销售商只关注下单支付后就可以拿到货物,中间环节由平台处理,支付和流通环节消费越少速度越快服务越好. 主体业务 1.合同处理. 2.货币支付,互换 ...
- 检测python进程是否存活
crontab -e */ * * * * /data/log_realtime/check.sh > /data/log_realtime/check.log >& * * /d ...