*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:productsac: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,减少网络往返。也可以在应用层循环调用。