一、Schema 基础概念
- 索引(Index):对 Redis 中的 Hash 或 JSON 文档进行反向索引,以支持全文、标签、数值、地理、向量等多种查询模式。
- Schema:定义索引结构,包括哪些字段(fields/attributes)、字段类型、是否可排序、权重(relevance weight)、过滤条件等。
在执行 FT.CREATE
时,必须指定:
- 数据类型:
ON HASH
或ON JSON
- Key 前缀(可选):
PREFIX N prefix1 prefix2 ...
- 过滤条件(可选):
FILTER <Lua 表达式>
- Schema 定义:SCHEMA 后面紧跟一系列
<field> <type> [OPTIONS]
二、字段类型与常用选项
类型 | 作用 | 常用选项 |
---|---|---|
TEXT | 全文检索(分词、模糊、权重) | WEIGHT <float> 提升相关度;NOSTEM 关闭词干提取 |
TAG | 精确匹配/集合过滤(支持多值) | SEPARATOR <char> 自定义分隔符;SORTABLE 支持排序 |
NUMERIC | 数值区间查询 | SORTABLE 支持 SORTBY |
GEO | 地理坐标半径检索 | 无 |
VECTOR | 向量相似度搜索(KNN) | FLAT /HNSW 算法选择;DIM 、DISTANCE_METRIC 、TYPE |
三、基本示例
假设我们要为博客文章建立全文和基础过滤索引,文章存储在 Hash 中,Key 前缀为 blog:post:
。
FT.CREATE idx:post
ON HASH
PREFIX 1 blog:post:
SCHEMA
title TEXT WEIGHT 5.0 # 标题文本,相关度提高 5 倍
content TEXT # 正文全文
author TAG # 作者标签
created_date NUMERIC SORTABLE # 发布时间,支持排序
views NUMERIC # 浏览量
WEIGHT 5.0
:在全文检索时让title
的权重比content
更重要。SORTABLE
:允许通过SORTBY created_date
来对结果按日期排序。
四、进阶示例
4.1 TAG 字段自定义分隔符
如果某个字段内含多项标签,并以特定分隔符(如 ;
)分隔,可用 SEPARATOR
:
FT.CREATE books-idx
ON HASH
PREFIX 1 book:details:
SCHEMA
title TEXT
categories TAG SEPARATOR ";" # categories 字段按 ';' 切分索引
分词后,每个子项会被独立索引,查询时可用
@categories:{fiction}
精确过滤。
4.2 单字段多重索引
有时需要同一个字段同时作为全文和标签分别处理,例如 sku
:
FT.CREATE sku-idx
ON HASH
PREFIX 1 product:
SCHEMA
sku_text AS sku TEXT # sku 作为全文,字段名 sku_text
sku_tag AS sku TAG SORTABLE # sku 也作为标签,并支持排序
4.3 多前缀混合索引
如果你的数据分散在多个前缀下(如作者和书籍),也可一次性建同一个索引:
FT.CREATE author-books-idx
ON HASH
PREFIX 2 author:details: book:details:
SCHEMA
author_id TAG SORTABLE
author_ids TAG
title TEXT
name TEXT
4.4 基于 FILTER 条件索引
只有当文档满足特定条件时才索引,可用 FILTER
传入 Lua 表达式:
# 仅索引作者名以 G 开头的作者
FT.CREATE g-authors-idx
ON HASH
PREFIX 1 author:details:
FILTER 'startswith(@name, "G")'
SCHEMA
name TEXT
# 仅索引有 subtitle 字段且非空的书籍
FT.CREATE subtitled-books-idx
ON HASH
PREFIX 1 book:details:
FILTER '@subtitle != ""'
SCHEMA
title TEXT
subtitle TEXT
执行机制:在
FT.CREATE
时,RediSearch 扫描已有文档并按 FILTER 条件异步索引;新写入或修改时同步生效。
4.5 JSONPath 表达式索引 JSON 文档
对于存储在 RedisJSON 的文档,可以直接用 JSONPath 建索引:
FT.CREATE json-idx
ON JSON
SCHEMA
$.title AS title TEXT
$.categories AS categories TAG
$.title
:映射到属性title
,类型为TEXT
$.categories
:映射到多值数组categories
,用TAG
索引
五、最佳实践
- 精准前缀:使用
PREFIX
限定 Key 空间,减少不必要的文档扫描。 - 权重与排序:对核心字段如标题、ID 增大
WEIGHT
;需要排序的字段请加上SORTABLE
。 - 合理分隔符:多值标签建议用
TAG SEPARATOR
指定分隔符,避免内置逗号冲突。 - 过滤与性能:对于海量数据,建议使用
FILTER
预筛,减少索引量级。 - JSON vs HASH:若文档结构复杂或深层嵌套,推荐 RedisJSON + JSONPath 索引;扁平结构可用 HASH。
通过本文,你已掌握 RediSearch 的 Schema 定义要领:从基础的字段类型、权重、排序选项,到分隔符、自字段重用、前缀混合、FILTER 条件再到 JSONPath 索引,让你能够根据业务场景灵活、高效地构建索引,打造性能与功能兼备的 Redis 搜索引擎。