*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:。