*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:products、ac:users,避免单词典过大
*FAQ
Q1: FT.SUGGET 的匹配是前缀匹配还是子串匹配? A: 是前缀匹配,即词条必须以传入的 prefix 开头。如果需要子串匹配,应考虑使用 FT.SEARCH。
Q2: FUZZY 模式的编辑距离是多少? A: 模糊匹配使用编辑距离 1(允许一个字符的插入、删除或替换)。
Q3: 返回的建议数量超过 MAX 会怎样? A: MAX 是上限,返回数量不会超过该值。如果匹配的建议少于 MAX,则返回全部匹配项。
Q4: 如何按自定义逻辑排序建议? A: FT.SUGGET 默认按分数排序。若需要更复杂的排序(如结合用户历史、地理位置等),建议在客户端获取结果后进行二次排序。