如何提高大型数据集搜索的性能?
上次更新时间: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 使用率和吞吐量。
参考资料
请参阅文档以了解有关 聚合 的更多信息