使用NRediSearch调用Aggregate时如何获取匹配文档总数量
NRediSearch 聚合查询获取总匹配数方案
你可以通过以下两种方式实现需求,无需更换为Search接口即可同时实现多字段排序和总计数获取:
方式1:开启WITHCOUNT参数(推荐,适配RediSearch 2.0+及新版NRediSearch)
RediSearch原生的AGGREGATE命令支持WITHCOUNT可选参数,会在返回分页结果的同时附带原始查询匹配的总文档数,不会影响你设置的多字段排序、分页逻辑。
在NRediSearch中调用示例如下:
// 构造聚合查询 var aggQuery = new AggregationQuery("@content:your_search_keyword") // 设置多字段排序规则 .SetSortBy(new List<SortField> { new SortField("sort_field1", SortOrder.Descending), new SortField("sort_field2", SortOrder.Ascending) }) .Limit(0, 20) // 分页参数,此处取第1页20条数据 .WithCount(); // 显式开启总计数返回 // 执行查询 var aggResult = client.Aggregate(aggQuery); // 读取结果 long totalMatchCount = aggResult.TotalResults; // 总匹配数 var currentPageRecords = aggResult.GetResults(); // 当前页的文档数据
方式2:二次查询兼容旧版本
如果你使用的NRediSearch或RediSearch版本较低不支持WITHCOUNT参数,可以分两次请求实现:
- 第一次执行仅带查询条件、不带排序和分页的计数聚合,拿到总匹配数
- 第二次执行带多字段排序、分页参数的聚合,拿到当前页数据
示例逻辑:
// 第一步:查询总计数 var countQuery = new AggregationQuery("@content:your_search_keyword") .GroupBy(0, new Reducer[] { Reducer.Count().As("total_count") }); var countResult = client.Aggregate(countQuery); long totalMatchCount = (long)countResult.GetResults().First()["total_count"]; // 第二步:查询分页排序数据 var dataQuery = new AggregationQuery("@content:your_search_keyword") .SetSortBy(new List<SortField> { new SortField("sort_field1", SortOrder.Descending), new SortField("sort_field2", SortOrder.Ascending) }) .Limit(0, 20); var dataResult = client.Aggregate(dataQuery); var currentPageRecords = dataResult.GetResults();
注意事项
- 若使用
WITHCOUNT参数,不要在排序前添加FILTER、非全量GROUPBY这类会缩减匹配文档数的聚合阶段,否则返回的总计数会是阶段处理后的结果数,而非原始查询匹配数 - 多字段排序规则需要设置在
LIMIT参数之前,才能保证排序后再分页的逻辑生效
内容的提问来源于stack exchange,提问作者zigzag
相关产品推荐
相关产品推荐

