*Redis VSETATTR 命令

VSETATTR 为向量集合(Vector Set)中的元素关联一个 JSON 属性对象,用于在 VSIM 相似度搜索时进行过滤。


*语法

VSETATTR key element "{ JSON obj }"

*参数说明

参数 类型 必填 说明
key String 向量集合的键名
element String 要设置属性的元素名称
json String 有效的 JSON 字符串。传 "" 表示删除属性

*返回值

  • Integer (1):属性成功设置或更新
  • Integer (0):键或元素不存在
  • Error:JSON 字符串格式错误

*时间复杂度

O(1)

*

*示例

*设置属性

> VADD vset VALUES 3 1 0 1 apple
(integer) 1
> VSETATTR vset apple "{\"type\": \"fruit\", \"color\": \"red\"}"
(integer) 1

*更新属性

> VSETATTR vset apple "{\"type\": \"fruit\", \"color\": \"green\"}"
(integer) 1

*删除属性

> VSETATTR vset apple ""
(integer) 1

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数数量不足 确保提供 key、element 和 JSON 字符串
ERR Invalid JSON string JSON 格式错误 检查 JSON 语法,确保是有效的 JSON
WRONGTYPE key 不是向量集合 检查 key 的数据类型

*最佳实践

  • 属性用于 VSIM 的 FILTER 过滤,设计属性时考虑查询场景
  • 属性值建议使用简单类型(string, number, boolean),避免嵌套过深
  • 更新属性时,整个 JSON 对象会被替换,不是局部更新
  • 不需要属性时及时删除,避免存储冗余数据

*FAQ

Q1: VSETATTR 支持部分更新 JSON 吗? A: 不支持,VSETATTR 会替换整个 JSON 对象。需要部分更新时,客户端应读取、修改后再写入。

Q2: 属性对向量相似度计算有影响吗? A: 属性不影响相似度计算本身,但可以在 VSIM 中使用 FILTER 选项按属性过滤结果。

Q3: 元素可以没有属性吗? A: 可以,元素默认没有属性。VSETATTR 传 "" 可以删除已设置的属性。

Q4: 属性大小有限制吗? A: 属性作为 JSON 字符串存储,受 Redis 单个值 512 MB 限制,但建议保持小巧以优化性能。