*Redis FT.SUGGET 命令

FT.SUGGET 用于根据前缀从自动补全建议词典中获取匹配的建议列表。


*语法

FT.SUGGET key prefix [FUZZY] [MAX num] [WITHSCORES] [WITHPAYLOADS]

*参数说明

参数 类型 必填 说明
key String 自动补全词典的键名
prefix String 前缀匹配字符串
FUZZY Flag 启用模糊匹配(允许拼写错误)
MAX Integer 最大返回数量(默认 5)
WITHSCORES Flag 返回建议的权重分数
WITHPAYLOADS Flag 返回建议的 payload 数据

*返回值

  • 数组:匹配的建议列表,按分数从高到低排序
  • 若使用 WITHSCORES:每个建议后跟随其分数
  • 若使用 WITHPAYLOADS:每个建议后跟随其 payload(需与 WITHSCORES 同时使用时,顺序为:建议、分数、payload)
  • 无匹配时返回空数组

*时间复杂度

O(log n + m),其中 n 是词典大小,m 是返回的建议数量。


*示例

*基本前缀查询

> FT.SUGADD ac:products "redis" 1.0
(integer) 1
> FT.SUGADD ac:products "redisearch" 0.9
(integer) 2
> FT.SUGADD ac:products "redisson" 0.8
(integer) 3
> FT.SUGADD ac:products "redhat" 0.7
(integer) 4
> FT.SUGGET ac:products "red"
1) "redis"
2) "redisearch"
3) "redisson"
4) "redhat"

*限制返回数量

> FT.SUGGET ac:products "red" MAX 2
1) "redis"
2) "redisearch"

*带分数和 Payload 返回

> FT.SUGADD ac:products "redis" 1.0 PAYLOAD "product:100"
(integer) 1
> FT.SUGADD ac:products "redisearch" 0.9 PAYLOAD "product:101"
(integer) 2
> FT.SUGGET ac:products "red" WITHSCORES WITHPAYLOADS
1) "redis"
2) "1"
3) "product:100"
4) "redisearch"
5) "0.9"
6) "product:101"

*模糊匹配

> FT.SUGGET ac:products "rdeis" FUZZY
1) "redis"
2) "redisearch"

*常见错误

错误 原因 解决
ERR wrong number of arguments 缺少参数 提供 key 和 prefix 两个参数

*最佳实践

  • 在搜索框自动补全功能中使用,设置合理的 MAX 值(如 5-10 条),避免返回过多建议
  • 根据业务场景选择是否启用 FUZZY,模糊匹配能容忍用户拼写错误但性能略低
  • 使用 WITHPAYLOADS 存储和返回业务 ID,补全后直接跳转无需二次查询
  • 对于高频查询场景,可在客户端做缓存,减少对 FT.SUGGET 的调用
  • 分数应反映词条的业务权重(如热度、点击率),确保高价值建议优先展示
  • 词典 key 建议按业务模块划分,如 ac:productsac:users,避免单词典过大

*FAQ

Q1: FT.SUGGET 的匹配是前缀匹配还是子串匹配? A: 是前缀匹配,即词条必须以传入的 prefix 开头。如果需要子串匹配,应考虑使用 FT.SEARCH

Q2: FUZZY 模式的编辑距离是多少? A: 模糊匹配使用编辑距离 1(允许一个字符的插入、删除或替换)。

Q3: 返回的建议数量超过 MAX 会怎样? A: MAX 是上限,返回数量不会超过该值。如果匹配的建议少于 MAX,则返回全部匹配项。

Q4: 如何按自定义逻辑排序建议? A: FT.SUGGET 默认按分数排序。若需要更复杂的排序(如结合用户历史、地理位置等),建议在客户端获取结果后进行二次排序。