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"

参考文献