在Apache Solr中,聚合分组(aggregation grouping)功能允许对查询结果按照一个或多个字段进行分组,并对每个组进行统计、计数、排序等操作。嵌套分组(nested grouping)则是在此基础上进行多层次的分组,实现对数据更细致的划分和分析。以下是如何使用Solr进行聚合分组和嵌套分组查询的指南:
1. 聚合分组查询
基本的聚合分组查询通常涉及以下参数:
group.field
: 指定分组字段,即按照哪个字段进行分组。group
: 设置为true
,启用分组功能。group.sort
(可选):指定分组结果的排序方式。group.limit
(可选):限制每个分组返回的最大文档数。group.offset
(可选):设置每个分组返回结果的起始偏移量。
一个简单的分组查询示例:
http://localhost:8983/solr/my_collection/select?q=*:*&group=true&group.field=category
此查询将返回所有文档按category
字段分组的结果,每个组包含该类别下的所有文档。
2. 聚合统计(统计函数)
在分组的基础上,可以添加统计函数(如计数、求和、平均值等)来获取每个组的统计信息。使用stats
参数启用统计,并通过stats.field
指定要统计的字段。例如:
http://localhost:8983/solr/my_collection/select?q=*:*&group=true&group.field=category&stats=true&stats.field=sales_amount
此查询将返回每个类别(按category
分组)下的文档总数以及sales_amount
字段的总和、平均值、最小值、最大值等统计信息。
3. 嵌套分组
嵌套分组允许在已有分组的基础上进一步细分。通过添加额外的group.field
参数实现多层分组。例如,按category
分组后,再按brand
分组:
http://localhost:8983/solr/my_collection/select?q=*:*&group=true&group.field=category&group.field=brand
此查询将返回每个类别下的子分组,每个子分组对应一个品牌,展示该品牌在该类别下的文档。
4. 多级嵌套与子组统计
在嵌套分组中,可以为每个子组添加统计函数。为子组添加统计时,使用stats.field
前缀加上分组字段名和.
,如stats.field.<group_field>.<field_to_stat>
。例如:
http://localhost:8983/solr/my_collection/select?q=*:*&group=true&group.field=category&group.field=brand&stats=true&stats.field.category.sales_amount
此查询将返回每个类别下的子分组(品牌),同时为每个子分组计算sales_amount
字段的统计信息。
5. 分组折叠(Group Collapsing)
分组折叠允许在分组结果中仅保留每个组内满足特定条件的一个文档。通过group.main
参数指定折叠的字段,并使用group.truncate
设置为true
启用折叠。例如:
http://localhost:8983/solr/my_collection/select?q=*:*&group=true&group.field=category&group.main=price&group.truncate=true
此查询将返回每个类别下的文档,但每个组内仅保留价格最低的一个文档。
6. 分组缓存
为了提升分组查询性能,可以启用分组缓存。通过group.cache.percent
设置缓存容量(以百分比表示),group.cache.initialSize
和group.cache.maximumSize
分别设置缓存初始大小和最大大小。例如:
http://localhost:8983/solr/my_collection/select?q=*:*&group=true&group.field=category&group.cache.percent=30&group.cache.initialSize=1000&group.cache.maximumSize=10000
此查询启用分组缓存,缓存容量占堆内存的30%,初始大小为1000条文档,最大容量为10000条文档。
7. 结果格式化与分页
分组查询结果可以通过group.format
参数选择不同的输出格式,如simple
(默认)、grouped
等。同时,可以使用rows
和start
参数对分组结果进行分页。
综上所述,Solr提供了丰富的分组查询功能,包括基本分组、嵌套分组、统计函数、分组折叠、缓存等,可以满足各种复杂的聚合分析需求。在实际使用时,请根据业务场景和数据特点选择合适的参数组合,并关注查询性能和资源消耗。对于复杂的查询,建议使用Solr Admin UI的Query或Analysis页面进行交互式调试和优化。