You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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参数,可以分两次请求实现:

  1. 第一次执行仅带查询条件、不带排序和分页的计数聚合,拿到总匹配数
  2. 第二次执行带多字段排序、分页参数的聚合,拿到当前页数据

示例逻辑:

// 第一步:查询总计数
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:06:00