Redis RediSearch查询默认仅返回10条结果,如何调整获取全部匹配数据?
问题原因
RediSearch的底层查询命令FT.SEARCH默认自带分页限制,默认参数为LIMIT 0 10,也就是默认只返回从第0位开始的10条结果,和Elasticsearch的默认size=10逻辑一致,该参数属于查询级配置,不需要修改全局Redis设置。
解决方案
你使用的NRediSearch客户端的Query类提供了Limit方法用于修改分页参数,只需在构造查询对象时添加对应配置即可:
NRediSearch.Query query = new NRediSearch.Query(searchString); // 新增这一行配置,第一个参数为偏移量(分页起始位置),第二个参数为返回的最大条数 query.Limit(0, 100); // 这里设置为返回最多100条结果,可根据业务实际最大量级调整
如果需要实现分页查询,可将偏移量和返回条数作为方法入参动态传入即可。如果需要返回全部符合条件的结果,也可以先调用dbRedis.Count(query)先获取总匹配数,再动态设置Limit的第二个参数,避免硬编码数值不合理。
修改后的完整业务代码参考
public List<DynamicDoc> GetFullMoc(string queryParm){ var redisConection = ConnectionMultiplexer.Connect(GetParameter("REDIS_SERVER")); var dbRedis = new Client("feeders", redisConection.GetDatabase()); string searchString = "@MOC:" + queryParm; NRediSearch.Query query = new NRediSearch.Query(searchString); string[] returnFields = { "Moc", "H_W","H_Y", "F"}; query.ReturnFields(returnFields); query.WithPayloads = true; // 新增分页配置,直接拉取最多100条符合条件的结果 query.Limit(0, 100); SearchResult res = dbRedis.Search(query); List<DynamicDoc> dynamicDocs = new List<DynamicDoc>(); foreach (Document doc in res.Documents) { IEnumerable<KeyValuePair<string, RedisValue>> record = doc.GetProperties(); string jsonRecord = JsonConvert.SerializeObject(record); Dictionary<string, object> _record = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonRecord); Console.WriteLine("\n \n \n ================" + doc.Id + "================ \n \n \n"); foreach(var rec in _record){ Console.WriteLine(rec); } DynamicDoc dynamicDoc = new DynamicDoc() { id = doc.Id, score = doc.Score, payload = _record }; dynamicDocs.Add(dynamicDoc); } return dynamicDocs; }
注意事项
- 若符合条件的文档量级很大(过万条),不建议直接设置超大Limit一次性拉取全部数据,会占用过多内存和带宽,建议按业务场景做分页查询。
- Limit的偏移量是从0开始计数,和Elasticsearch的from参数逻辑一致。
内容的提问来源于stack exchange,提问作者ojoaovitoraraujo
相关产品推荐
相关产品推荐

