*Redis FT.SYNUPDATE 命令

FT.SYNUPDATE 用于创建或更新索引的同义词组。同义词组中的词项在搜索时会互相扩展,提高召回率。


*语法

FT.SYNUPDATE index_name group_id term [term ...] [SKIPINITIALSCAN]

*参数说明

参数 类型 必填 说明
index_name String 索引名称
group_id Integer 同义词组 ID(从 1 开始递增)
term String 同义词组中的词项,至少一个
SKIPINITIALSCAN Flag 跳过对现有文档的重新扫描,仅在更新同义词定义时使用

*返回值

  • OK: 操作成功

*时间复杂度

O(n),其中 n 是同义词组中的词项数量。若未使用 SKIPINITIALSCAN,还会触发对现有文档的重新扫描,复杂度取决于索引大小。


*示例

*创建同义词组

> FT.SYNUPDATE myIndex 1 phone telephone cell mobile
OK

*更新现有同义词组

> FT.SYNUPDATE myIndex 1 phone telephone cell mobile smartphone
OK

*添加新同义词组(跳过初始扫描)

> FT.SYNUPDATE myIndex 2 laptop notebook SKIPINITIALSCAN
OK

*常见错误

错误 原因 解决
Unknown index name 索引不存在 检查索引名称或先创建索引
ERR wrong number of arguments 缺少词项 至少提供一个词项

*最佳实践

  • 在索引创建后尽早定义同义词组,避免后续重建索引
  • 使用 SKIPINITIALSCAN 在批量更新多个同义词组时减少开销,但之后需手动触发索引重建
  • 合理规划同义词组粒度,避免将语义差异过大的词放入同一组(如"便宜"和"劣质")
  • 定期审查同义词组,根据业务需求调整和扩展
  • 同义词在索引和查询时都会生效,因此添加同义词后无需重新索引已有文档(除非使用 SKIPINITIALSCAN)
  • 对于多语言场景,为每种语言维护独立的同义词组

*FAQ

Q1: 同义词组中的词项有数量限制吗? A: 没有硬性限制,但建议每个组控制在合理范围内(如 10-50 个词),过多可能影响性能。

Q2: 一个词条可以属于多个同义词组吗? A: 可以,一个词条可以出现在多个同义词组中。搜索时会合并所有相关组的同义词。

Q3: 使用 SKIPINITIALSCAN 后已有文档会怎样? A: 已有文档的同义词关系不会被更新。如果需要对现有文档应用新同义词,需删除索引后重建,或使用其他方式触发重新索引。

Q4: 如何删除同义词组? A: 目前 RediSearch 没有直接删除同义词组的命令。可以通过替换同义词组为空(FT.SYNUPDATE index group_id )或重建索引来实现。