*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 引入。