使用 Redis 执行分面搜索是否可行?

最后更新于 2024 年 4 月 24 日

问题

使用 Redis 执行分面搜索是否可行?

回答

分面搜索帮助您通过 Redis 数据库中的属性(或分面)对数据进行分类。您可以使用 FT.AGGREGATE 命令实现分面搜索。在此示例中,我们将存储五个按不同类别分类的文档。索引创建如下。

FT.CREATE doc_idx PREFIX 1 doc: SCHEMA category TAG content TEXT title TEXT

文档可以存储为哈希(JSON 文档也适用)。

HSET doc:1 title "How to perform vector search with Redis" content "..." category "docs"
HSET doc:2 title "Configure Redis durability" content "..." category "docs"
HSET doc:3 title "Reduce memory consumption" content "..." category "kb"
HSET doc:4 title "Addressing performance tuning" content "..." category "kb"
HSET doc:5 title "Getting started with the C#/.NET NRedisStack client library" content "..." category "training"

然后我们可以按类别获取存储的文档数量概览。

FT.AGGREGATE doc_idx * GROUPBY 1 @category REDUCE COUNT 0 AS num_per_ctg SORTBY 2 @num_per_ctg DESC
1) (integer) 3
2) 1) "category"
   2) "docs"
   3) "num_per_ctg"
   4) "2"
3) 1) "category"
   2) "kb"
   3) "num_per_ctg"
   4) "2"
4) 1) "category"
   2) "training"
   3) "num_per_ctg"
   4) "1"

并检索特定类别中的所有文档。

FT.SEARCH doc_idx '@category:{docs}' RETURN 1 title LIMIT 0 10
1) (integer) 2
2) "doc:2"
3) 1) "title"
   2) "Configure Redis durability"
4) "doc:1"
5) 1) "title"
   2) "How to perform vector search with Redis"

并包含附加过滤器,例如针对术语 "vectors" 的文本过滤器,以执行全文搜索。

FT.SEARCH doc_idx 'vectors @category:{docs}' RETURN 1 title LIMIT 0 10
1) (integer) 1
2) "doc:1"
3) 1) "title"
   2) "How to perform vector search with Redis"

参考资料