*Redis FT.CREATE 命令

FT.CREATE 创建一个 RediSearch 索引,指定数据源、字段 schema 和索引选项。


*语法

FT.CREATE index
  [ON HASH | JSON]
  [PREFIX count prefix [prefix ...]]
  [FILTER filter_expr]
  [LANGUAGE default_lang]
  [LANGUAGE_FIELD lang_field]
  [SCORE default_score]
  [SCORE_FIELD score_field]
  [PAYLOAD_FIELD payload_field]
  [SORTABLE]
  [NOINDEX]
  [MAXTEXTFIELDS]
  [TEMPORARY seconds]
  [NOHL]
  [NOFIELDS]
  [NOFREQS]
  [STOPWORDS count [stopword ...]]
  SCHEMA field [AS alias] type [attribute ...] [field ...]

*参数说明

参数 类型 必填 说明
index String 索引名称
ON Keyword 数据源类型,HASH(默认)或 JSON
PREFIX Keyword 键名前缀过滤,仅索引匹配的键
FILTER String 表达式过滤,仅索引满足条件的文档
LANGUAGE String 默认语言(用于分词)
LANGUAGE_FIELD String 指定文档中存储语言的字段
SCORE Float 默认文档评分
SCORE_FIELD String 指定文档中存储评分的字段
PAYLOAD_FIELD String 指定文档中存储 payload 的字段
SCHEMA Keyword 字段定义列表
field String 字段名
AS alias Keyword 字段别名
type Keyword 字段类型:TEXT、NUMERIC、TAG、GEO、VECTOR
attribute Keyword 类型属性:SORTABLE、NOINDEX、WEIGHT、SEPARATOR、CASESENSITIVE 等

*返回值

  • OK:索引创建成功
  • Error:参数错误、索引已存在、字段类型不支持

*时间复杂度

O(1) 创建索引结构。若已有数据匹配前缀,会触发异步后台扫描。


*示例

*基本 HASH 索引

> FT.CREATE idx:products ON HASH PREFIX 1 product: SCHEMA name TEXT price NUMERIC category TAG
OK

*JSON 索引

> FT.CREATE idx:users ON JSON PREFIX 1 user: SCHEMA $.name AS name TEXT $.age AS age NUMERIC
OK

*带排序的 TEXT 字段

> FT.CREATE idx:articles ON HASH PREFIX 1 article: SCHEMA title TEXT SORTABLE content TEXT author TAG SORTABLE created_at NUMERIC SORTABLE
OK

*VECTOR 字段(向量搜索)

> FT.CREATE idx:images ON HASH PREFIX 1 image: SCHEMA embedding VECTOR FLAT 6 DIM 128 DISTANCE_METRIC COSINE TYPE FLOAT32
OK

*临时索引

> FT.CREATE idx:temp ON HASH PREFIX 1 temp: SCHEMA data TEXT TEMPORARY 3600
OK

*常见错误

错误 原因 解决
Index already exists 索引名称已存在 使用新名称或先 FT.DROPINDEX
Invalid schema 字段类型错误 检查 TEXT/NUMERIC/TAG/GEO/VECTOR 拼写
Unknown index type ON 参数错误 只支持 HASH 或 JSON

*最佳实践

  • 使用 PREFIX 限制索引范围,避免全库扫描
  • 常用过滤字段标记 SORTABLE,避免排序时加载文档
  • 大文本字段用 NOINDEX 避免索引膨胀(仅存储可检索)
  • 向量索引使用 HNSW 算法以获得更好性能(RediSearch 2.6+)
  • 临时索引 TEMPORARY 适合会话级搜索场景

*FAQ

Q1: FT.CREATE 后现有数据会自动索引吗? A: 是的,RediSearch 会自动扫描匹配 PREFIX 的现有键并建立索引。

Q2: 可以索引 RedisJSON 文档吗? A: 可以,使用 ON JSON 和 JSONPath 表达式(如 $.field)定义字段。

Q3: VECTOR 字段支持哪些距离度量? A: L2(欧几里得)、IP(内积)、COSINE(余弦相似度)。

Q4: 索引创建后还能修改字段吗? A: 可以添加字段(FT.ALTER),但不能删除或修改已有字段类型。

Q5: 一个索引可以匹配多个前缀吗? A: 可以,PREFIX 支持多个前缀,如 PREFIX 2 product: item: