【问题标题】:Why is RediSearch slow when sorting numeric field?为什么 RediSearch 在排序数字字段时很慢?
【发布时间】:2021-12-12 23:23:18
【问题描述】:

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

FT.SEARCH media * SORTBY media_id DESC LIMIT 0 10

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

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

【问题讨论】:

    标签: redisearch


    【解决方案1】:

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

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

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

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

    干杯

    【讨论】:

      【解决方案2】:

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

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

      如果没有搜索参数,那么你可以简单地GET LASTEST_DOCUMENT_ID

      【讨论】:

      • @namirazu 谢谢,我正在使用 mysql 获取最大 id,并将其发送到 redis 搜索以运行带有 [max_id - 10000, +inf] 的数字过滤器。但你的工作似乎更简单,我很可能会改变它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2010-12-10
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      相关资源
      最近更新 更多