精准定义 RediSearch 索引 Schema

发布于:2025-07-04 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、Schema 基础概念

  • 索引(Index):对 Redis 中的 Hash 或 JSON 文档进行反向索引,以支持全文、标签、数值、地理、向量等多种查询模式。
  • Schema:定义索引结构,包括哪些字段(fields/attributes)、字段类型、是否可排序、权重(relevance weight)、过滤条件等。

在执行 FT.CREATE 时,必须指定:

  1. 数据类型ON HASHON JSON
  2. Key 前缀(可选):PREFIX N prefix1 prefix2 ...
  3. 过滤条件(可选):FILTER <Lua 表达式>
  4. Schema 定义:SCHEMA 后面紧跟一系列 <field> <type> [OPTIONS]

二、字段类型与常用选项

类型 作用 常用选项
TEXT 全文检索(分词、模糊、权重) WEIGHT <float> 提升相关度;NOSTEM 关闭词干提取
TAG 精确匹配/集合过滤(支持多值) SEPARATOR <char> 自定义分隔符;SORTABLE 支持排序
NUMERIC 数值区间查询 SORTABLE 支持 SORTBY
GEO 地理坐标半径检索
VECTOR 向量相似度搜索(KNN) FLAT/HNSW 算法选择;DIMDISTANCE_METRICTYPE

三、基本示例

假设我们要为博客文章建立全文和基础过滤索引,文章存储在 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 索引

五、最佳实践

  1. 精准前缀:使用 PREFIX 限定 Key 空间,减少不必要的文档扫描。
  2. 权重与排序:对核心字段如标题、ID 增大 WEIGHT;需要排序的字段请加上 SORTABLE
  3. 合理分隔符:多值标签建议用 TAG SEPARATOR 指定分隔符,避免内置逗号冲突。
  4. 过滤与性能:对于海量数据,建议使用 FILTER 预筛,减少索引量级。
  5. JSON vs HASH:若文档结构复杂或深层嵌套,推荐 RedisJSON + JSONPath 索引;扁平结构可用 HASH。

通过本文,你已掌握 RediSearch 的 Schema 定义要领:从基础的字段类型、权重、排序选项,到分隔符、自字段重用、前缀混合、FILTER 条件再到 JSONPath 索引,让你能够根据业务场景灵活、高效地构建索引,打造性能与功能兼备的 Redis 搜索引擎。


网站公告

今日签到

点亮在社区的每一天
去签到