一、RediSearch 是什么?
RediSearch 是 Redis 官方推出的内存全文搜索引擎模块。它通过模块机制直接集成在 Redis 中,让使用者无需部署额外的搜索引擎(如 ElasticSearch),就能在 Redis 中实现毫秒级的复杂查询、全文搜索和聚合分析。RediSearch 基于倒排索引和内存存储,复用 Redis 的内存、IO、持久化能力,可以将查询延迟降低至毫秒级。
简单来讲,RediSearch 把 Redis 从一个单纯的“键值对缓存”,升级成了一个可以处理复杂数据检索的“内存数据库”。官方文档见此处。
二、RediSearch 安装与配置
RediSearch 作为 Redis 的一个扩展模块,需要在 Redis 的基础上安装才可以正常使用。进入 Redis 客户端输入 MODULE LIST,如果没有看到任何输出,说明没有安装 RediSearch。官方提供了一个包含 Redis 和 RediSearch 的整合镜像。
执行 docker-compose 的脚本文件拉取景象并启动容器,统一由 portainer 管理
# 命令执行 docker-compose -f docker-compose-software-aliyun.yml up -d
version: '3.9'
services:
redis:
image: redislabs/redismod:latest
container_name: redis
restart: always
hostname: redis
privileged: true
ports:
- 16379:6379
networks:
- my-network
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 10s
timeout: 5s
retries: 3
networks:
my-network:
dribeer: bridge
安装成功后连接容器,进入客户端输入 MODULE LIST,可以看到 search,说明安装成功。

三、RediSearch 基础命令
RediSearch 的核心命令是 FT.* (FullText 全文的缩写)。
3.1 建索引:FT.CREATE
建索引时需要指定 索引名称、数据来源、索引字段。
# 给商品Hash建全文索引
# FT.CREATE 索引名 ON 数据类型 PREFIX 前缀数量 字段定义
FT.CREATE product_idx ON HASH PREFIX 1 "product:"
SCHEMA
name TEXT WEIGHT 5 # 商品名称,权重5(搜索时优先级)
description TEXT # 商品描述
price NUMERIC # 商品价格(支持范围查询)
category TAG # 商品分类(支持过滤)
命令详解:
- FT.CREATE product_idx:定义的索引名称为 product_idx
- ON HASH:监听 Hash 类型的数据
- PREFIX 1 “product:”:RediSearch 只索引那些以 product: 开头的键
- SCHEMA … :定义字段类型
其中 SCHEMA 负责定义 Hash 数据的各个字段类型
- TEXT:文本字段,支持全文搜索
- NUMERIC:数值字段,支持返回查询(比如 price > 100)
- TAG:标签字段,支持精确过滤(比如 category = “笔记本电脑”)
- WEIGHT:权重,树枝越高,搜索时匹配度越高。
3.2 存数据:用 Redis 原生命令 HSET
通过 FT.CREATE 创建的索引依赖 Redis 的 Hash 类型的数据结构,存数据使用 HSET 命令即可。创建索引之后,保存相关的 Hash 数据会自动同步到 RediSearch 索引。
# 存商品数据
HSET product:123 name "MacBook Air"
description "苹果最具性价比笔记本电脑,M4芯片"
price 7500
category "笔记本电脑"
3.2 查数据:FT.SEARCH
搜索用 FT.SEARCH 命令,支持全文匹配、过滤、排序、分页:
# 搜索名称或描述包含“旗舰”的商品,过滤分类为“笔记本电脑”,按价格升序,取前10条
FT.SEARCH product_idx "旗舰"
FILTER category "笔记本电脑"
SORTBT price ASC
LIMIT 0 10
四、RediSearch 在 RAG 中的应用(向量检索)
当用户提出问题时,系统并不会直接在 Redis 中进行字符串匹配查询,而是先将用户的问题转换成一个向量表示(Embedding),然后通过该向量在 RediSearch 中对名为 vector 的字段执行向量相似度搜索,从而找到语义上最接近的几段文本内容。
RediSearch 中的 vector 字段并不是在查询时临时生成的,而是在 RediSearch 初始化索引库时就已经提前写入完成。在初始化阶段,系统会将原始文档内容进行解析和切分,把每一段文本转换成向量,并将这些向量存储到 RediSearch 的 vector 字段中。下面的代码是初始化建库时的 RediSearch 语句,构建了 RediSearch 创建索引的命令参数列表,支持全文检索和向量检索。
createArgs := []interface{}{
"FT.CREATE", indexName, // 对indexName创建索引
"ON", "HASH", // 监听 Hash 类型的数据结构
"PREFIX", "1", prefix, // 只索引前缀为 prefix 这一个的字符串
"SCHEMA", // 索引结构定义,字段包括 content 和 metadata
"content", "TEXT",
"metadata", "TEXT",
"vector", "VECTOR", "FLAT", // 见下述详解
"6", // 代表 FLAT 算法的具体规则有 6 个(3对键值对)
"TYPE", "FLOAT32",
"DIM", dimension,
"DISTANCE_METRIC", "COSINE",
}
其中 “vector”, “VECTOR”, “FLAT” 配置支持语义搜索。
其中 vector 代表字段名称,在存入的 Hash 数据中,必须有一个 key 叫 vector。具体逻辑可以看 NewRAGIndexer 方法中构造的 Hash 数据中的 content 字段有一个 EmbedKey 为 vector。
VECTOR 代表字段类型,表明 RediSearch 这个字段存储的不是普通文本,而是向量数据。
FLAT 代表选择的算法是 FLAT,表示使用暴力扫描算法来计算向量距离。特点是精度很高,但是速度随着数据量的增加而变慢,适合百万级以下的数据场景。另一种算法是 HNSW,适合海量数据,速度更快但有精度损失。
“TYPE”, “FLOAT32” 表示向量的数据类型是 32 位浮点数,AI 模型输出向量的标准格式。
“DIM”, dimension 表示 AI 模型对文件文档向量化后得到的向量维数。
“DISTANCE_METRIC”, “COSINE” 表示距离度量标准采用的是余弦相似度,用于衡量两个向量的方向是否一致,取值范围为 -1 到 1,越接近 1 表示越相似。
参考链接:
博客园 https://www.cnblogs.com/sun-10387834/p/19201546
Redis 官方文档 https://redis.io/docs/latest/operate/oss_and_stack/stack-with-enterprise/search

No responses yet