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