*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 限制,但建议保持小巧以优化性能。