StarRocks向量索引技术详解:实现高效近似最近邻搜索

StarRocks向量索引技术详解:实现高效近似最近邻搜索

starrocks StarRocks是一个开源的分布式数据分析引擎,用于处理大规模数据查询和分析。 - 功能:分布式数据分析;大规模数据查询;数据分析;数据仓库。 - 特点:高性能;可扩展;易于使用;支持多种数据源。 starrocks 项目地址: https://gitcode.com/gh_mirrors/st/starrocks

概述

在当今大数据和人工智能时代,向量数据(如嵌入向量、特征向量等)的处理变得越来越重要。StarRocks作为一款高性能分析型数据库,在3.4版本中引入了向量索引功能,支持高效的近似最近邻搜索(ANNS),为向量相似性搜索场景提供了强大的支持。

向量索引基础

什么是向量索引

向量索引是一种专门为高维向量数据设计的索引结构,它能够快速找到与查询向量最相似的向量,而无需进行暴力计算。StarRocks目前支持两种主流的向量索引算法:

  1. IVFPQ(倒排文件与乘积量化)
  2. HNSW(分层可导航小世界图)

索引算法对比

| 特性 | IVFPQ | HNSW | |------|-------|------| | 压缩比 | 高(约1:0.15) | 低(约1:0.8) | | 查询精度 | 需要二次精排 | 直接提供精确排序 | | 计算成本 | 较高 | 较低 | | 存储成本 | 低 | 高 | | 缓存策略 | 可调整缓存比例 | 仅支持全文件缓存 |

向量索引创建与使用

准备工作

在使用向量索引前,需要先启用该功能:

ADMIN SET FRONTEND CONFIG ("enable_experimental_vector" = "true");

创建表时定义向量索引

HNSW索引示例
CREATE TABLE hnsw (
    id BIGINT(20) NOT NULL COMMENT "",
    vector ARRAY<FLOAT> NOT NULL COMMENT "",
    INDEX hnsw_vector (vector) USING VECTOR (
        "index_type" = "hnsw", 
        "dim"="5", 
        "metric_type" = "l2_distance", 
        "is_vector_normed" = "false", 
        "M" = "16", 
        "efconstruction" = "40"
    )
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1;
IVFPQ索引示例
CREATE TABLE ivfpq (
    id BIGINT(20) NOT NULL COMMENT "",
    vector ARRAY<FLOAT> NOT NULL COMMENT "",
    INDEX ivfpq_vector (vector) USING VECTOR (
        "index_type" = "ivfpq", 
        "dim"="5", 
        "metric_type" = "l2_distance", 
        "is_vector_normed" = "false", 
        "nbits" = "16", 
        "nlist" = "40"
    )
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1;

关键参数详解

通用参数
  • index_type: 索引类型,支持hnswivfpq
  • dim: 向量维度,必须与实际数据维度一致
  • metric_type: 相似度度量方式,支持l2_distance(欧式距离)和cosine_similarity(余弦相似度)
  • is_vector_normed: 向量是否已归一化,仅在cosine_similarity时有效
HNSW特有参数
  • M: 每个节点在构建时建立的连接数,影响图结构的密度和搜索效率
  • efconstruction: 构建时的候选列表大小,影响图构建质量和构建时间
IVFPQ特有参数
  • nbits: 乘积量化的精度,影响压缩率和精度
  • nlist: 聚类中心数量,影响搜索范围和精度
  • M_IVFPQ: 子向量划分数量,必须是dim的因数

为已有表添加向量索引

CREATE INDEX ivfpq_vector 
ON ivfpq (vector) 
USING VECTOR (
    "index_type" = "ivfpq",
    "metric_type" = "l2_distance", 
    "is_vector_normed" = "false",  
    "dim"="5", 
    "nlist" = "256", 
    "nbits"="10"
);

向量搜索实践

基本搜索语法

SELECT *, <vector_index_distance_func>(v1, [1,2,3]) as dis
FROM table_name
WHERE <vector_index_distance_func>(v1, [1,2,3]) <= 10
ORDER BY <vector_index_distance_func>(v1, [1,2,3]) 
LIMIT 10

搜索示例

近似搜索
SELECT id, approx_l2_distance([1,1,1,1,1], vector) 
FROM test_hnsw 
ORDER BY approx_l2_distance([1,1,1,1,1], vector) 
LIMIT 1;
标量-向量联合搜索
SELECT id, approx_l2_distance([1,1,1,1,1], vector) 
FROM test_hnsw 
WHERE id = 1 
ORDER BY approx_l2_distance([1,1,1,1,1], vector) 
LIMIT 1;
范围搜索
SELECT * FROM (
    SELECT id, approx_l2_distance([1,1,1,1,1], vector) score 
    FROM test_hnsw
) a 
WHERE score < 40 
ORDER BY score 
LIMIT 1;
精确计算
SELECT id, l2_distance([1,1,1,1,1], vector) 
FROM test_hnsw WHERE id = 1 
ORDER BY l2_distance([1,1,1,1,1], vector) 
LIMIT 1;

参数调优

HNSW搜索参数调优
SELECT 
    /*+ SET_VAR (ann_params='{efsearch=256}') */ 
    id, approx_l2_distance([1,1,1,1,1], vector) 
FROM test_hnsw 
WHERE id = 1 
ORDER BY approx_l2_distance([1,1,1,1,1], vector) 
LIMIT 1;

efsearch参数:

  • 默认值: 16
  • 作用: 控制搜索时的候选列表大小,影响搜索精度和性能

最佳实践建议

  1. 索引选择:

    • 对存储敏感且能接受较高计算成本的场景选择IVFPQ
    • 对查询延迟敏感且存储资源充足的场景选择HNSW
  2. 参数调优:

    • 从小数据集开始调优,确认效果后再应用到生产环境
    • 平衡精度和性能,根据业务需求调整参数
  3. 查询优化:

    • 合理使用范围过滤减少计算量
    • 结合标量条件加速查询
  4. 监控与维护:

    • 定期检查索引使用情况
    • 根据数据变化调整索引参数

总结

StarRocks的向量索引功能为高维向量数据的相似性搜索提供了高效的解决方案。通过合理选择索引类型和调优参数,可以在精度和性能之间取得良好平衡,满足各种业务场景的需求。随着向量数据应用的不断扩展,这一功能将为用户带来显著的价值提升。

starrocks StarRocks是一个开源的分布式数据分析引擎,用于处理大规模数据查询和分析。 - 功能:分布式数据分析;大规模数据查询;数据分析;数据仓库。 - 特点:高性能;可扩展;易于使用;支持多种数据源。 starrocks 项目地址: https://gitcode.com/gh_mirrors/st/starrocks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎牧联Wood

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值