1

我在我的项目中使用 RediSearch,该项目的索引包含超过 1300 万份文档。如果用户没有提供过滤器,我需要获取最新的文档。我的索引架构有一个带有 SORTABLE 标志的 NUMERIC 字段,我尝试运行以下查询。

FT.SEARCH media * SORTBY media_id DESC LIMIT 0 10

它有一段时间没有返回响应,我通常会终止查询。

有没有办法在可接受的时间内获得最后的文件?

4

2 回答 2

3

我能够通过插入数字字段的值增加的文档来重现您描述的行为。我创建了一个 FlameChart 来检查代码的哪一部分消耗了 CPU。

罪魁祸首是我们使用的排序堆,它是一种昂贵的数据结构。在我的实验中,每个数值都被插入到堆中,这导致了很长的查询时间。这是您运行查询的预期行为。

作为一种解决方案,您可以运行查询LIMIT 0 1,将堆工作减少到几乎为零,然后使用您将获得的值运行带有过滤器的查询和LIMIT 0 10.

我们正在考虑优化此类查询的方法,但目前还没有解决方案。

干杯

火焰图

于 2021-12-12T11:40:47.533 回答
2

一个短期的解决方法可能是在更新索引时将最新的文档 ID 存储在 Redis 字符串中。在管道中运行以来回消除不必要的网络

SET LASTEST_DOCUMENT_ID $docId
HSET $docId KEY VALUE....

然后你可以简单地GET LASTEST_DOCUMENT_ID如果没有搜索参数

于 2021-12-12T15:23:18.937 回答