*Redis VSIM 命令

VSIM 返回与给定向量或元素相似的结果,用于在向量集合(Vector Set)中执行近似或精确的相似度搜索。


*语法

VSIM key (ELE | FP32 | VALUES num) (vector | element)
  [WITHSCORES] [WITHATTRIBS] [COUNT num]
  [EPSILON delta] [EF search-exploration-factor]
  [FILTER expression] [FILTER-EF max-filtering-effort]
  [TRUTH] [NOTHREAD]

*参数说明

参数 类型 必填 说明
key String 向量集合的键名
ELE / FP32 / VALUES num Keyword 查询方式:ELE 引用现有元素,FP32 传入二进制浮点,VALUES 传入字符串化的浮点列表
vector / element String / Bytes 查询向量数据或元素名称
WITHSCORES Flag 返回相似度分数(1 表示完全相同,0 表示相反)
WITHATTRIBS Flag 返回元素的 JSON 属性(Redis 8.2.0+)
COUNT num Integer 限制返回结果数量
EPSILON delta Float 只返回相似度 >= (1 - delta) 的结果
EF search-exploration-factor Integer 搜索探索因子,越大召回率越高但速度越慢
FILTER expression String 使用属性过滤表达式筛选结果
FILTER-EF max-filtering-effort Integer 过滤尝试的最大次数
TRUTH Flag 强制精确线性扫描(O(N)),用于基准测试
NOTHREAD Flag 在主线程执行搜索,可能阻塞服务器

*返回值

  • Array:匹配的元素列表
  • Array with scores:带 WITHSCORES 时,每个元素后紧跟相似度分数
  • Array with attribs:带 WITHATTRIBS 时,每个元素后紧跟分数和 JSON 属性
  • Empty Array:键不存在时返回空数组
  • Error:元素不存在时返回错误

*时间复杂度

O(log(N)),N 为向量集合中的元素数量。TRUTH 模式下为 O(N)。


*示例

*基本相似度查询

> VSIM word_embeddings ELE apple
1) "apple"
2) "apples"
3) "pear"
4) "fruit"
5) "berry"
6) "pears"
7) "strawberry"
8) "peach"
9) "potato"
10) "grape"

*带分数和属性(Redis 8.2.0+)

> VSETATTR word_embeddings apple "{\"len\": 5}"
(integer) 1
> VSIM word_embeddings ELE apple WITHSCORES WITHATTRIBS COUNT 3
1) "apple"
2) "0.9998867657923256"
3) "{\"len\": 5}"
4) "apples"
5) "0.859852746129036"
6) (nil)

*使用 VALUES 传入向量

> VSIM myset VALUES 3 0.1 0.2 0.3 COUNT 5
1) "item_a"
2) "item_b"
3) "item_c"
4) "item_d"
5) "item_e"

*带 FILTER 过滤

> VSIM word_embeddings ELE apple WITHSCORES COUNT 5 FILTER "type == 'fruit'"
1) "apple"
2) "0.9998867657923256"
3) "pear"
4) "0.8226882070302963"

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数数量不足 检查 key、查询方式和向量/元素参数
ERR Invalid vector format 向量格式错误 确保 FP32 或 VALUES 的格式正确
ERR Unknown element ELE 引用的元素不存在 确认元素已存在于向量集合中
WRONGTYPE key 不是向量集合 检查 key 的数据类型

*最佳实践

  • 默认使用近似搜索(HNSW 图),平衡速度和召回率
  • 需要高召回率时增大 EF 值(通常 50-1000),典型值 200
  • 使用 EPSILON 限制最相似结果,避免返回相关性低的结果
  • 大结果集使用 COUNT 限制返回数量,减少网络传输
  • 基准测试或计算召回率时使用 TRUTH 选项进行精确扫描
  • 属性过滤与向量搜索结合,实现语义 + 结构化筛选

*FAQ

Q1: VSIM 的相似度分数范围是多少? A: 分数范围是 0 到 1,其中 1 表示完全相同,0 表示完全相反的向量。

Q2: EF 参数应该如何设置? A: EF 是探索因子,值越大搜索越彻底、召回率越高但速度越慢。通常设置在 50-1000 之间,根据数据量和召回率要求调整。

Q3: TRUTH 和默认搜索有什么区别? A: 默认搜索使用 HNSW 近似图搜索,速度快;TRUTH 强制线性扫描所有元素,速度为 O(N),但结果 100% 精确,主要用于基准测试和召回率计算。

Q4: FILTER 表达式支持哪些操作? A: 支持属性字段的比较运算,如 ==!=><>=<=,以及逻辑运算符 &&||。具体语法参考 Redis 向量集合文档。

Q5: WITHATTRIBS 需要 Redis 什么版本? A: WITHATTRIBS 选项从 Redis 8.2.0 开始支持。