Redis 向量检索是什么
Redis Stack 内置的 RediSearch 模块提供向量字段与近邻查询:向量和元数据存在 HASH 或 JSON 里,用 FT.CREATE 声明向量字段(类型、维度、距离度量、算法),再用 FT.SEARCH 的 KNN 表达式做近邻检索。它的价值在于复用已有的 Redis 运维体系(监控、备份、主从与集群),不必为一个新组件单独做运维;代价是过滤聚合能力、索引管理与运维工具不如专用向量库丰富,更适合数据量中等、延迟敏感的场景。
基本信息
| 依赖 | Redis Stack(含 RediSearch 模块) |
|---|---|
| 数据形态 | HASH 或 JSON 文档 |
| 向量编码 | 二进制 float32 blob |
| 建索引 | FT.CREATE ... VECTOR HNSW / FLAT |
| 查询 | FT.SEARCH ... =>[KNN k @field $vec AS score],需 DIALECT 2 |
| 调优 | HNSW 的 EF_RUNTIME 与 M 影响召回和延迟 |
典型使用场景
- 已有 Redis 基础设施,低成本上线中小规模向量检索
- 相似内容推荐:低延迟、数据量中等、对精确召回要求不极端
- 缓存与检索共用一份数据,减少组件与同步链路
- 带标签过滤的近邻查询:先用 TAG 缩小范围再做 KNN
- 会话、画像这类短生命周期数据,随缓存一起过期清理
建索引
建索引
FT.CREATE idx:kb ON HASH PREFIX 1 kb: SCHEMA
source TAG # 元数据字段,用于过滤
embedding VECTOR HNSW 6 # 向量字段,HNSW 参数 6 个
TYPE FLOAT32 DIM 1024 DISTANCE_METRIC COSINE
# 距离度量在建索引时固定,建好后不能修改
# 过滤字段必须先声明,否则无法在查询里按条件缩小范围KNN 查询逐项读法
| 要素 | 含义 | 注意 |
|---|---|---|
| *=>[KNN 5 @embedding $vec AS score] | 近邻查询表达式 | 过滤条件写在 KNN 之前,语法随 DIALECT 版本变化 |
| PARAMS 2 vec <blob> | 传入查询向量 | 参数个数写错直接报错 |
| SORTBY score | 按距离排序 | 要确认度量语义,升序还是降序取决于度量 |
| DIALECT 2 | 启用新版查询语法 | 遗漏会解析失败 |
| EF_RUNTIME | 运行时候选集大小 | 调大召回上升、延迟上升 |
向量以二进制 blob 写入:Python 端用 numpy 的 tobytes(),并确认 dtype 为 float32,否则写入成功但检索结果无意义。
距离度量与维度在 FT.CREATE 时确定,建成后只能重建索引修改;换 embedding 模型通常意味着整库重灌。