*Redis FT.ALTER 命令
FT.ALTER 修改现有 RediSearch 索引的 schema,添加新的字段定义。
*语法
FT.ALTER index SKIPINITIALSCAN SCHEMA ADD field [AS alias] type [attribute ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| index | String | 是 | 索引名称 |
| SKIPINITIALSCAN | Flag | 否 | 跳过对现有文档的重新扫描 |
| SCHEMA ADD | Keyword | 是 | 指定添加字段操作 |
| field | String | 是 | 字段名 |
| AS alias | Keyword | 否 | 字段别名 |
| type | Keyword | 是 | 字段类型(TEXT、NUMERIC、TAG、GEO、VECTOR) |
| attribute | Keyword | 否 | 类型相关属性(SORTABLE、NOINDEX、WEIGHT 等) |
*返回值
- OK:Schema 修改成功
- Error:索引不存在或字段已存在
*时间复杂度
O(1) 添加字段定义。若未指定 SKIPINITIALSCAN,会触发后台扫描现有文档。
*示例
*添加 TEXT 字段
> FT.ALTER idx:products SCHEMA ADD description TEXT
OK
*添加 NUMERIC 字段并启用排序
> FT.ALTER idx:products SCHEMA ADD stock NUMERIC SORTABLE
OK
*添加 TAG 字段
> FT.ALTER idx:products SCHEMA ADD brand TAG
OK
*跳过初始扫描
> FT.ALTER idx:products SKIPINITIALSCAN SCHEMA ADD tags TAG
OK
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| Index not found | 索引不存在 | 确认索引名称 |
| Field already exists | 字段已定义 | 不能重复添加同名字段 |
*最佳实践
- 新字段仅对 ALTER 后写入/更新的文档生效(除非重新索引)
- 使用 SKIPINITIALSCAN 避免阻塞,但现有文档新字段不可搜索
- 生产环境建议重建索引而非频繁 ALTER,避免 schema 碎片化
- ALTER 不能删除字段,删除字段需要重建索引
*FAQ
Q1: FT.ALTER 可以删除字段吗? A: 不能,只能添加字段。删除字段需要 FT.DROPINDEX 重建。
Q2: 添加字段后现有文档能搜索到新字段吗? A: 默认会扫描现有文档;若使用 SKIPINITIALSCAN,则仅新写入的文档包含该字段索引。
Q3: 可以添加 VECTOR 字段吗? A: 可以,RediSearch 2.4+ 支持通过 ALTER 添加 VECTOR 字段。
Q4: ALTER 会影响现有查询性能吗? A: 不会,ALTER 添加字段是轻量级操作,不会阻塞现有查询。