导入
Redis 中的向量搜索简介
了解 Redis 如何通过不同的命令、索引、数据类型和查询格式来支持向量搜索。
创建 FLAT 索引
1FT.CREATE demo_index 2SCHEMA embedding VECTOR 3FLAT 410 5TYPE FLOAT64 6DIM 128 7DISTANCE_METRIC L2 8INITIAL_CAP 1000000 9BLOCK_SIZE 1000
创建 HNSW 索引
1FT.CREATE test_index 2SCHEMA embedding VECTOR 3HNSW 416 5TYPE FLOAT32 6DIM 256 7DISTANCE_METRIC COSINE 8INITIAL_CAP 1000000 9M 42 10EF_CONSTRUCTION 250 11EF_RUNTIME 20 12EPSILON 0.8
对比表
| 方面 | FLAT | HNSW |
|---|---|---|
| 搜索方式 | 暴力搜索 | 基于图的搜索 |
| 准确性 | 保证找到精确的最近邻 | 找到近似的最近邻 |
| 速度 | 较慢,尤其在大数据集上 | 大数据集上快得多 |
| 可扩展性 | 大数据集上表现差 | 大数据集上具有良好可扩展性 |
| 计算开销 | 高,随数据集大小线性增长 | 较低,随数据集增长更优 |
| 适用场景 | 小规模数据集,且需要精确匹配 | 大规模数据集,可接受近似结果 |
使用 HSET
1HSET product:1 name product_1 vector_field <binary_vector_data>
代码示例
1FT.CREATE demo_index ON JSON SCHEMA $.vector_field as vector VECTOR FLAT 6 TYPE FLOAT64 DIM 5 DISTANCE_METRIC COSINE
使用 JSON.SET
1JSON.SET 42 $ '{"name":"product_1","vector_field":[0.1,0.2,0.3,0.4,0.5]}'
使用 FT.SEARCH 进行 KNN 查询
1FT.SEARCH demo_index "(*)=>[KNN 5 @embedding $query_vector]" PARAMS 2 "query_vector" "<binary data>" SORTBY "__vector_score" ASC RETURN 2 "__vector_score" "description" DIALECT 2