如何提高大型数据集搜索的性能?

上次更新时间:2024 年 3 月 22 日

问题

如何提高大型数据集搜索的性能?

答案

当使用 FT.SEARCH 以及排序和分页 (LIMIT <offset> <count>) 时,每次都会执行新的搜索查询,并且结果会收集起来并截断为请求的大小。这在大型数据集上可能不方便。

当使用 FT.AGGREGATE 以及类似查询并使用游标 API 时,查询结果将在初始查询中被构建一次,并返回一个游标 ID,该 ID 可以稍后通过使用 FT.CURSOR READ <index> <cursor-id> 来查询。后续调用将从查询中返回越来越多的结果,直到游标耗尽。这将有助于处理大型数据集。

确保 LOAD 不与 FT.AGGREGATE 命令一起使用,因为它会影响聚合查询的性能。

使用 FT.SEARCH

FT.CREATE po ON JSON PREFIX 1 "original:" SCHEMA "$.datetime" as datetime NUMERIC SORTABLE
FT.SEARCH po "@datetime:[1619290184.788929 1682362184.788929]" WITHSCORES SORTBY datetime DESC LIMIT 0 50

后续查询

FT.SEARCH po "@datetime:[1619290184.788929 1682362184.788929]" WITHSCORES SORTBY datetime DESC LIMIT 50 50

使用 FT.AGGREGATE

FT.CREATE pp ON JSON PREFIX 1 "proposed:" SCHEMA "$.datetime" as datetime NUMERIC SORTABLE
FT.AGGREGATE pp "@datetime:[1619290321.959789 1682362321.959789]" WITHCURSOR COUNT 50 LOAD * SORTBY 2 @datetime DESC MAX 1000

后续读取使用 cursor-id 执行,该 ID 从初始查询返回,并可用于从同一查询获取其他结果集。

FT.CURSOR READ pp <cursor-id> READ 50

在处理大型数据集时测试两种方法,并评估平均延迟、CPU 使用率和吞吐量。

参考资料

请参阅文档以了解有关 聚合 的更多信息