*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 添加字段是轻量级操作,不会阻塞现有查询。