学习目标
掌握折叠展开结果的用法;
掌握分组结果的用法;
了解solr支持的其他搜索特性
折叠展开结果
什么是折叠展开结果?
问:在商品搜索中,当我们输入关键字,搜索到很多相关的商品文档,当结果中存在大量的同名商品时(不同卖家的),你是希望看到重复的商品罗列还是看到更多的不同商品(同名商品展示一个)?
折叠结果,就是对搜索结果根据某字段的值进行分组去重。
展开结果:在返回结果中附带上折叠结果的展开列表
请看下面查询的结果
http://localhost:8983/solr/techproducts/select?q=*:*&fq={!collapse%20field=price}&expand=true
Solr折叠展开结果
Solr中通过Collapsing query parser 和 Expand component 的组合来提供根据某一字段对搜索结果进行折叠、展开处理。Solr中还提供的结果分组组件也能实现折叠功能,但如果仅是要做折叠展开处理,折叠展开结果性能要优些。
CollapsingQParser 其实是一个后置查询过滤器,对搜索结果根据指定的字段进行折叠处理。它需要的本地参数有:
field:指定折叠字段,必须是单值的String 、int 、float 类型的字段。
min or max:通过min或max指定的数值字段或函数查询来选择每个组的头文档(取最大或最小值的文档)。min、max、sort只可用其一。
sort:指定组内排序规则来选择排在第一的文档作为头文档。默认是选取组中相关性评分最高的文档作为头文档。
nullPolicy:对不包含折叠字段的文档采取什么处理策略:
ignore:忽略,默认选项。
expand:独立为一个组。
collapse:折叠为一个组。
折叠结果示例
fq={!collapse field=group_field}
fq={!collapse field=group_field min=numeric_field}
fq={!collapse field=group_field max=numeric_field}
fq={!collapse field=group_field max=sum(cscore(),numeric_field)}
fq={!collapse field=group_field nullPolicy=collapse sort='numeric_field asc, score desc'}
Solr展开结果
如果你需要在结果中返回每个折叠组的展开列表,在请求中加上参数 expand=true
q=*:*&fq={!collapse%20field=price}&expand=true
展开组件还支持如下参数:
expand.sort:组内排序规则,默认是相关性评分。
expand.rows:每组返回的文档数。默认5
还有 expand.q、expand.fq
结果分组
Solr结果分组
根据某个字段对结果进行分组,每组返回一个头文档。
http://localhost:8983/solr/techproducts/select?fl=id,name&q=solr+memory&group=true&group.field=manu_exact
结果分组请求参数说明:
group :true,对搜索结果进行分组。
group.field :分组字段,必须是单值、索引的字段。
group.func:根据函数查询结果值进行分组(分布式下不可用)。
group.query:指定分组的查询语句,类似 facet.query。
rows:返回的分组数,默认10
start:分页起始行
group.limit:每组返回的文档数,默认1。
group.offset:组内返回的文档的偏移量。
sort:如何排序组。
group.sort:组内排序规则
group.main:用分组结果中的文档作为主结果返回
Solr结果分组-示例
Grouping Results by Field 根据字段进行分组
http://localhost:8983/solr/techproducts/select?fl=id,name&q=solr+memory&group=true&group.field=manu_exact
作为主结果返回
http://localhost:8983/solr/techproducts/select?fl=id,name,manufacturer&q=solr+memory&group=true&group.field=manu_exact&group.main=true
Grouping by Query 根据查询进行分组
http://localhost:8983/solr/techproducts/select?indent=true&fl=name,price&q=memory&group=true&group.query=price:[0+TO+99.99]&group.query=price:[100+TO+*]&group.limit=3
其他搜索特性介绍
Solr其他搜索特性
Result clustering 结果聚合
http://lucene.apache.org/solr/guide/7_3/result-clustering.html
Spatial Search 地理空间搜索
http://lucene.apache.org/solr/guide/7_3/spatial-search.html
Parallel SQL Interface 搜索的SQL接口
http://lucene.apache.org/solr/guide/7_3/parallel-sql-interface.html