学习目标

掌握折叠展开结果的用法;
掌握分组结果的用法;
了解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
03-06 23:18