*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 )或重建索引来实现。