我在我的项目中使用RediSearch,它的索引有超过1300万个文档。如果没有用户提供的过滤器,我需要获取最新的文档。我的索引架构有一个带有可排序标志的数字字段,我试图运行以下查询。
FT.SEARCH media * SORTBY media_id DESC LIMIT 0 10
它有一段时间不返回响应,我通常会终止查询。
有没有办法在一个可接受的时间内得到最后的文件?
发布于 2021-12-12 11:40:47
我能够通过为数值字段插入具有递增值的文档来再现您描述的行为。我已经创建了一个FlameChart来检查代码的哪一部分消耗了CPU。
罪魁祸首是我们使用的排序堆,它是一种昂贵的数据结构。在我的实验中,每个数值都被插入到堆中,这会导致很长的查询时间。这是您如何运行查询的预期行为。
作为一种解决方案,您可以使用LIMIT 0 1运行查询,这将将堆工作减少到几乎为零,然后使用使用过滤器和LIMIT 0 10运行查询所获得的值。
我们正在考虑优化这些查询的方法,但目前还没有解决方案。
干杯

发布于 2021-12-12 15:23:18
短期的工作可能是在更新索引时将最新的文档ID存储在Redis字符串中。在管道中运行以消除不必要的网络来回运行。
SET LASTEST_DOCUMENT_ID $docId
HSET $docId KEY VALUE....如果没有搜索参数,您可以简单地使用GET LASTEST_DOCUMENT_ID。
https://stackoverflow.com/questions/70301431
复制相似问题