当前位置: 首页 > news >正文

精准定义 RediSearch 索引 Schema

一、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:postON HASHPREFIX 1 blog:post:
SCHEMAtitle         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-idxON HASHPREFIX 1 book:details:
SCHEMAtitle       TEXTcategories  TAG SEPARATOR ";"   # categories 字段按 ';' 切分索引

分词后,每个子项会被独立索引,查询时可用 @categories:{fiction} 精确过滤。

4.2 单字段多重索引

有时需要同一个字段同时作为全文和标签分别处理,例如 sku

FT.CREATE sku-idxON HASHPREFIX 1 product:
SCHEMAsku_text  AS sku TEXT           # sku 作为全文,字段名 sku_textsku_tag   AS sku TAG SORTABLE   # sku 也作为标签,并支持排序

4.3 多前缀混合索引

如果你的数据分散在多个前缀下(如作者和书籍),也可一次性建同一个索引:

FT.CREATE author-books-idxON HASHPREFIX 2 author:details: book:details:
SCHEMAauthor_id   TAG SORTABLEauthor_ids  TAGtitle       TEXTname        TEXT

4.4 基于 FILTER 条件索引

只有当文档满足特定条件时才索引,可用 FILTER 传入 Lua 表达式:

# 仅索引作者名以 G 开头的作者
FT.CREATE g-authors-idxON HASHPREFIX 1 author:details:FILTER 'startswith(@name, "G")'
SCHEMAname  TEXT# 仅索引有 subtitle 字段且非空的书籍
FT.CREATE subtitled-books-idxON HASHPREFIX 1 book:details:FILTER '@subtitle != ""'
SCHEMAtitle     TEXTsubtitle  TEXT

执行机制:在 FT.CREATE 时,RediSearch 扫描已有文档并按 FILTER 条件异步索引;新写入或修改时同步生效。

4.5 JSONPath 表达式索引 JSON 文档

对于存储在 RedisJSON 的文档,可以直接用 JSONPath 建索引:

FT.CREATE json-idxON 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 搜索引擎。

http://www.dtcms.com/a/265120.html

相关文章:

  • LeetCode Hot 100 哈希【Java和Golang解法】
  • 无人机状态识别研究梳理2025.7.2
  • 欧拉角、四元数和旋转矩阵的变换关系以及无人机的坐标变换
  • 在服务器中下载 HuggingFace 模型:终极指南
  • Java的SpringAI+Deepseek大模型实战-会话记忆【三】
  • 深度学习入门day4--手写数字识别初探
  • Cloudflare大动作
  • 大语言模型:是逐字生成还是一次多词?
  • Ubuntu22.04搭建基于GPU的Yolov8环境
  • 昇腾NPU节点软件版本检查与升级方法
  • iOS 集成RN Installing glog (0.3.5)报错的解决方案
  • 深度解析Linux内核IPv4设备管理:net/ipv4/devinet.c
  • 单片机学习笔记.10.串口UART
  • Excel 如何让某些符合特定条件的数据自动变色,以作警示?
  • SSL/TLS协议信息泄露漏洞(CVE-2016-2183)、SSL/TLS RC4 信息泄露漏洞(CVE-2013-2566)修复方法
  • Tomcat10.0以上版本编译成功但报错HTTP状态 404
  • MVI+Compose架构实战
  • 解释LLM怎么预测下一个词语的
  • Go语言动态数据访问实战
  • windows安装maven环境
  • vscode vim配置
  • ElementUI el-select多选下拉框,回显数据后无法重新选择和修改
  • vue中的torefs
  • 自定义注解的使用
  • 玄机——某学校系统中挖矿病毒应急排查
  • Redis 常用五大数据类型
  • 【大模型学习 | MINIGPT-4原理】
  • MacOS 安装brew 国内源【超简洁步骤】
  • 数论基础知识和模板
  • Windows下docker安装