*Redis FT.SPELLCHECK 命令
FT.SPELLCHECK 用于对搜索查询中的关键词进行拼写检查,返回可能的拼写建议。
*语法
FT.SPELLCHECK index_name query [DISTANCE dist] [TERMS {INCLUDE | EXCLUDE} {dict} [TERMS {INCLUDE | EXCLUDE} {dict} ...]] [DIALECT dialect]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| index_name | String | 是 | 索引名称 |
| query | String | 是 | 要检查的查询文本 |
| DISTANCE | Integer | 否 | 最大编辑距离(默认 1,最大 4) |
| TERMS INCLUDE | 字典 | 否 | 包含指定字典的术语 |
| TERMS EXCLUDE | 字典 | 否 | 排除指定字典的术语 |
| DIALECT | Integer | 否 | 查询方言版本(1、2、3、4) |
*返回值
返回一个数组,包含每个疑似拼写错误的词项及其建议:
- TERM: 词项名称
- 词项: 疑似错误的词
- 建议: 以评分和距离排序的建议列表,格式为 score => suggestion
- 若所有词拼写正确,返回空数组或仅包含 1 的数组
*时间复杂度
O(n),其中 n 是查询中词项的数量和每个词项的建议数量。与索引大小和字典大小相关。
*示例
*基本拼写检查
> FT.SPELLCHECK myIndex "hello wrld"
1) 1) "TERM"
2) "wrld"
3) 1) "0.5" => "world"
2) "0.4" => "word"
3) "0.1" => "wild"
*增加编辑距离
> FT.SPELLCHECK myIndex "hello wrld" DISTANCE 2
1) 1) "TERM"
2) "wrld"
3) 1) "0.8" => "world"
2) "0.5" => "word"
3) "0.3" => "wild"
4) "0.1" => "would"
*使用自定义字典
> FT.SPELLCHECK myIndex "redis serch" TERMS INCLUDE myDict
1) 1) "TERM"
2) "serch"
3) 1) "0.9" => "search"
2) "0.1" => "serch"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| Unknown index name | 索引不存在 | 检查索引名称或先创建索引 |
| Syntax error | 查询语法错误 | 检查 query 参数格式 |
| DISTANCE too large | 编辑距离超过限制 | 将 DISTANCE 设置为 1-4 之间的值 |
*最佳实践
- 默认 DISTANCE 1 已能满足大多数拼写错误场景,过大可能返回过多无关建议
- 在搜索 UI 的"您是不是想找"功能中集成 FT.SPELLCHECK
- 使用自定义字典(通过 FT.DICTADD)补充领域术语,提高专业词汇的拼写检查准确度
- 结合客户端逻辑对建议进行排序和过滤,优先展示高频词汇
- 对于已知词表较小的场景,可考虑使用 TERMS EXCLUDE 排除不必要的字典
*FAQ
Q1: FT.SPELLCHECK 和搜索引擎的自动纠错有什么区别? A: FT.SPELLCHECK 基于索引中的词频和编辑距离给出建议,是离线/静态的拼写检查。自动纠错通常还结合用户行为、查询日志等动态数据。
Q2: 如何添加自定义字典?
A: 使用 FT.DICTADD dict_name term1 term2 ... 添加自定义字典,然后在 FT.SPELLCHECK 中使用 TERMS INCLUDE dict_name 引用。
Q3: 为什么某些正确拼写的词也返回了建议? A: 如果该词在索引中出现频率极低,或不在默认字典中,FT.SPELLCHECK 可能误认为它是拼写错误。可通过 TERMS EXCLUDE 或添加自定义字典解决。
Q4: 支持多语言拼写检查吗? A: 支持,但效果取决于索引中包含该语言的词汇量。对于非英语语言,建议构建专门的字典并通过 TERMS INCLUDE 引入。