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

最后更新于 2024年3月22日

问题

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

答案

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

使用 FT.AGGREGATE 和类似的查询并使用游标 API 时,查询结果在初始查询时构建一次,并返回一个游标 ID,之后可以使用 FT.CURSOR READ <index> <cursor-id> 进行查询。后续调用将返回查询的更多结果,直到游标耗尽。这将有助于处理大型数据集。

确保 FT.AGGREGATE 命令不使用 LOAD,因为它会损害聚合查询的性能。

使用 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 使用率和吞吐量。

参考资料

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