RedisSearch向量搜索技术深度解析
RediSearch 项目地址: https://gitcode.com/gh_mirrors/red/RediSearch
引言
在现代搜索和推荐系统中,向量搜索技术扮演着越来越重要的角色。RedisSearch作为Redis的全文搜索模块,提供了强大的向量搜索功能,能够高效处理高维向量数据的存储、索引和查询。本文将深入解析RedisSearch中的向量搜索技术,帮助开发者理解其核心概念和最佳实践。
向量搜索基础概念
什么是向量搜索
向量搜索是一种基于向量相似度的搜索技术,它通过计算向量之间的距离或相似度来找到最相似的项。在RedisSearch中,向量可以表示各种数据,如文本嵌入、图像特征、用户偏好等。
向量字段类型
RedisSearch支持两种向量字段类型:
- FLAT:暴力搜索算法,精确但计算成本高
- HNSW:基于分层导航小世界图的近似最近邻搜索算法,在精度和性能之间取得平衡
距离度量标准
RedisSearch支持三种距离度量方式:
- L2距离(欧氏距离):计算向量间的直线距离
- IP(内积):计算向量点积
- COSINE(余弦相似度):测量向量方向的相似性
创建向量索引
基本语法
创建包含向量字段的索引语法如下:
FT.CREATE ... SCHEMA ... {field_name} VECTOR {algorithm} {count} [{attribute_name} {attribute_value} ...]
FLAT索引参数
必需参数:
TYPE
:向量类型(FLOAT32或FLOAT64)DIM
:向量维度(正整数)DISTANCE_METRIC
:距离度量标准(L2/IP/COSINE)
可选参数:
INITIAL_CAP
:初始容量BLOCK_SIZE
:块大小(默认1024)
示例:
FT.CREATE products
SCHEMA embedding VECTOR
FLAT
10
TYPE FLOAT32
DIM 768
DISTANCE_METRIC COSINE
INITIAL_CAP 100000
BLOCK_SIZE 500
HNSW索引参数
必需参数:
TYPE
、DIM
、DISTANCE_METRIC
(同FLAT)
可选参数:
M
:每层最大边数(默认16)EF_CONSTRUCTION
:构建时的候选数(默认200)EF_RUNTIME
:搜索时的候选数(默认10)EPSILON
:范围查询边界因子(默认0.01)
示例:
FT.CREATE recommendations
SCHEMA user_vector VECTOR
HNSW
16
TYPE FLOAT64
DIM 300
DISTANCE_METRIC IP
M 32
EF_CONSTRUCTION 300
EF_RUNTIME 50
向量数据存储
哈希存储方式
向量可以二进制形式存储在Redis哈希中。Python示例:
import numpy as np
from redis import Redis
redis = Redis()
dim = 300
vector = np.random.rand(dim).astype(np.float32)
redis.hset('user:1001', 'embedding', vector.tobytes())
JSON存储方式
向量也可以作为数组存储在JSON文档中:
FT.CREATE docs ON JSON SCHEMA $.vector as vec VECTOR FLAT 6 TYPE FLOAT32 DIM 4 DISTANCE_METRIC L2
JSON.SET doc:1 $ '{"vector":[0.1,0.2,0.3,0.4]}'
向量查询技术
查询语法基础
使用向量查询需要设置DIALECT为2或更高:
FT.SEARCH ... DIALECT 2
KNN最近邻搜索
基本语法:
*=>[KNN <K> @<vector_field> $<blob_param>]
示例:
FT.SEARCH products "*=>[KNN 10 @embedding $query_vec]" PARAMS 2 query_vec "\x12\xa9\xf5\x6c" DIALECT 2
范围查询
查找距离在指定半径内的向量:
@vector_field:[VECTOR_RANGE $radius $query_vec]
混合查询
结合传统过滤和向量搜索:
(@category:electronics @price:[100 500])=>[KNN 10 @embedding $query_vec]
高级查询技巧
结果排序
默认按文档分数排序,可按向量距离排序:
FT.SEARCH idx "*=>[KNN 10 @vec $BLOB AS dist]" PARAMS 2 BLOB "..." SORTBY dist DIALECT 2
查询参数优化
对于HNSW索引,可调整运行时参数:
FT.SEARCH idx "*=>[KNN 10 @vec $BLOB EF_RUNTIME 150]" PARAMS 2 BLOB "..." DIALECT 2
混合查询策略
RedisSearch自动选择最佳执行策略:
- 批量模式:分批获取高分文档
- 即时暴力搜索:当过滤后文档较少时使用
可手动指定策略:
FT.SEARCH idx "(@tags:book)=>[KNN 10 @vec $BLOB]=>{$HYBRID_POLICY: ADHOC_BF}" PARAMS 2 BLOB "..." DIALECT 2
性能优化建议
- 维度选择:根据实际需求选择合适维度,不是越高越好
- 距离度量:文本通常用余弦,图像用L2
- HNSW参数:
- 更高M值提高召回率但增加内存
- 更高EF值提高精度但降低速度
- 批量导入:大量数据时考虑批量导入
- 内存分配:合理设置INITIAL_CAP减少扩容开销
典型应用场景
- 推荐系统:用户-物品相似度匹配
- 语义搜索:文本嵌入向量搜索
- 图像检索:视觉特征向量匹配
- 异常检测:查找异常向量模式
- 去重系统:识别相似内容
总结
RedisSearch的向量搜索功能为开发者提供了强大的相似性搜索工具。通过合理配置索引参数和查询策略,可以在各种应用场景中实现高效的向量相似性搜索。理解不同算法的特性和适用场景,结合实际业务需求进行调优,是使用RedisSearch向量搜索的关键。
随着向量搜索技术的不断发展,RedisSearch也在持续优化其向量功能,为开发者提供更强大、更灵活的搜索解决方案。
RediSearch 项目地址: https://gitcode.com/gh_mirrors/red/RediSearch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考