*Redis FT.SUGADD 命令
FT.SUGADD 用于向自动补全建议词典中添加一个词条,支持指定词条权重和payload。
*语法
FT.SUGADD key string score [INCR] [PAYLOAD payload]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 自动补全词典的键名 |
| string | String | 是 | 要添加的词条文本 |
| score | Double | 是 | 词条权重(分数),分数越高排序越靠前 |
| INCR | Flag | 否 | 增量更新:将新分数加到现有词条分数上 |
| PAYLOAD | String | 否 | 附加的 payload 数据,可在 FT.SUGGET 时返回 |
*返回值
- Integer: 操作后词典中的词条总数(新词条计入,若词条已存在且未使用 INCR 则不计入新增长度)
*时间复杂度
O(n),其中 n 是词条长度。与词典大小无关。
*示例
*基本添加
> FT.SUGADD ac:products "redis" 1.0
(integer) 1
> FT.SUGADD ac:products "redisearch" 0.8
(integer) 2
> FT.SUGADD ac:products "redisson" 0.6
(integer) 3
*带 Payload 添加
> FT.SUGADD ac:products "redis" 1.0 PAYLOAD "product:100"
(integer) 1
> FT.SUGADD ac:products "redis cluster" 0.9 PAYLOAD "product:101"
(integer) 2
*增量更新分数
> FT.SUGADD ac:products "redis" 0.5 INCR
(integer) 1
> FT.SUGADD ac:products "redis" 0.3 INCR
(integer) 1
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 缺少必要参数 | 确保传入 key、string 和 score |
| ERR score is not a valid float | 分数格式错误 | score 必须是有效的浮点数 |
*最佳实践
- 使用有意义的 key 命名空间,如
ac:products、ac:users等,便于管理多个词典 - 分数应根据业务逻辑设置,如搜索频率、热门程度、相关性等
- 使用 PAYLOAD 存储额外的业务数据(如 ID、分类、URL),在补全建议时一并返回
- 对于高频搜索词,使用 INCR 模式累积权重,反映实时热度
- 定期清理低频词条以控制词典大小
- 词条添加后立即可用于 FT.SUGGET 查询,无需重建索引
*FAQ
Q1: FT.SUGADD 和 FT.ADD 有什么区别? A: FT.SUGADD 用于自动补全建议词典(前缀匹配),FT.ADD 用于向搜索索引中添加文档。两者数据结构和用途完全不同。
Q2: 词条已存在时使用 INCR 会怎样? A: 新分数会累加到现有分数上。如果不使用 INCR,新分数会覆盖旧分数。
Q3: PAYLOAD 有大小限制吗? A: 没有严格限制,但建议保持较小(如存储 ID 或短字符串),避免占用过多内存。
Q4: 如何批量添加词条? A: 可以使用 Redis Pipeline 或 Lua 脚本批量执行 FT.SUGADD,减少网络往返。也可以在应用层循环调用。