Redis 向量检索怎么配置:RediSearch 模块加载与相似度查询
Redis 要支持向量检索,靠的不是 Redis 核心本身,而是 RediSearch 模块。
确认模块已加载后,用 FT.CREATE 建索引、HSET 写入向量、FT.SEARCH 执行 KNN 查询即可完成最小验证。
下面按“确认环境→建索引→写数据→查相似→排错”的顺序展开,命令可直接在 redis-cli 中执行。
先确认 Redis 是否带 RediSearch
向量检索依赖 RediSearch 模块。
先连上 Redis 执行:
redis-cli MODULE LIST
返回结果中应出现 search 模块。
如果没有,说明当前实例是普通 Redis,需要换用 Redis Stack(官方集成 RediSearch 的发行版)或手动加载模块。
用 Docker 启动 Redis Stack 最省事:
docker run -d --name redis-stack -p 6379:6379 redis/redis-stack-server:latest
启动后再次执行 MODULE LIST,
看到 search 即表示模块可用。注意:
Redis Stack 与普通 Redis 的端口默认都是 6379,
同一台机器上不要重复启动导致端口冲突。
创建向量索引
向量检索需要先定义索引结构。
假设存储 4 维浮点向量,字段名为 vec,用 HASH 结构存储:
FT.CREATE idx:demo ON HASH PREFIX 1 doc: SCHEMA vec VECTOR FLAT 6 TYPE FLOAT32 DIM 4 DISTANCE_METRIC COSINE
参数含义:PREFIX 1 doc: 表示只索引以 doc: 开头的键;FLAT 是暴力检索算法,适合数据量小的场景;DIM 4 是向量维度,必须与实际写入的维度一致;COSINE 是余弦距离。
维度写错或数据类型不匹配,后续查询会报错或结果异常。
写入向量并执行相似度查询
写入一条 4 维向量,向量需按 FLOAT32 二进制格式传入。
在 redis-cli 中可用 --raw 配合脚本,更推荐用 Python 客户端操作:
import redis, struct, numpy as np
r = redis.Redis(host='127.0.0.1', port=6379)
vec = np.array([0.1, 0.2, 0.3, 0.4], dtype=np.float32)
r.hset('doc:1', mapping={'vec': vec.tobytes(), 'title': '示例文档'})
查询与目标向量最相似的记录:
query_vec = np.array([0.1, 0.2, 0.3, 0.4], dtype=np.float32)
q = query_vec.tobytes()
res = r.execute_command('FT.SEARCH', 'idx:demo', '*=>[KNN 3 @vec $BLOB AS score]',
'PARAMS', 2, 'BLOB', q, 'SORTBY', 'score', 'RETURN', 2, 'title', 'score', 'DIALECT', 2)
print(res)
返回结果按距离升序排列,第一条应为最相似记录。
如果返回空,先检查写入的键是否匹配索引前缀 doc:,以及向量维度是否为 4。
常见报错与避坑
unknown command 'FT.CREATE':模块未加载,回到第一步确认MODULE LIST。Vector dimension mismatch:写入或查询的向量维度与索引DIM不一致,检查 numpy 数组长度。- 查询结果为空:确认键前缀匹配、数据已写入,且查询语句使用了
DIALECT 2。 - 性能问题:
FLAT在数据量大时变慢,可改用HNSW算法,但建索引和内存开销更高,需按数据规模取舍。 - 生产环境:修改索引结构需重建索引,建议先在测试实例验证命令,再操作线上数据。
验证配置是否生效
执行 FT.INFO idx:demo 可查看索引的维度、距离算法和文档数量。
写入多条不同向量后,用相同查询语句观察返回顺序是否随目标向量变化,能进一步确认检索逻辑正常。
若结果始终不变,优先排查是否写入了相同向量或索引前缀配置错误。
Redis 向量检索配置的核心是模块可用、维度一致、前缀匹配这三件事。
按本文顺序跑通最小示例后,再根据业务数据量在 FLAT 和 HNSW 之间做选择即可。