一、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

Categories:

Tags:

No responses yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注