【ClickHouse系列】ClickHouse 支持 ANN 向量索引

实现背景

最近邻域搜索(ANN)是指在 n 维空间中找到与给定点距离最小的点的问题。如果数据要逐条对比,性能和内存都有很大的消耗,所以添加了 annoy_index 索引,利用 ann 索引来加速计算。相关PR:https://github.com/ClickHouse/ClickHouse/pull/40818

使用限制

  1. ClickHouse 的 ANN 索引还有很多局限性
    • 目前是个实验性功能需要开始 setting 才能使用(SET allow_experimental_annoy_index = 1
    • 由于算法存在内存安全问题,目前已在 ARM 上禁用
    • 如果 where 和 order by 同时使用时,没有效率提升,所以必须和 limit 子句一起使用
    • 只有当 limit 的值小于 max_limit_for_ann_queries(默认:100W)时,才会使用 ANN 索引加速,否则会很消耗内存。

特殊函数支持及 ANN 索引使用方法

  1. ClickHouse 为此增加几个特殊的函数来支持查询,如 L2NormalizeL2Norm 等。示例如下:

    SELECT L2Distance((1, 2), (2, 3));
    
    ┌─L2Distance((1, 2), (2, 3))─┐
    │         1.4142135623730951 │
    └────────────────────────────┘
    
    SELECT L2Norm((1, 2));
    
    ┌───L2Norm((1, 2))─┐
    │ 2.23606797749979 │
    └──────────────────┘
    
  2. ANN 索引使用示例如下,更多示例详见:示例

    CREATE TABLE 02354_annoy
    (
        id Int32,
        embedding Array(Float32),
        INDEX annoy_index embedding TYPE annoy(100) GRANULARITY 1
    )
    ENGINE = MergeTree
    ORDER BY id
    SETTINGS index_granularity=5;
    
    INSERT INTO 02354_annoy VALUES (1, [0.0, 0.0, 10.0]), (2, [0.0, 0.0, 10.5]), (3, [0.0, 0.0, 9.5]), (4, [0.0, 0.0, 9.7]), (5, [0.0, 0.0, 10.2]), (6, [10.0, 0.0, 0.0]), (7, [9.5, 0.0, 0.0]), (8, [9.7, 0.0, 0.0]), (9, [10.2, 0.0, 0.0]), (10, [10.5, 0.0, 0.0]), (11, [0.0, 10.0, 0.0]), (12, [0.0, 9.5, 0.0]), (13, [0.0, 9.7, 0.0]), (14, [0.0, 10.2, 0.0]), (15, [0.0, 10.5, 0.0]);
    
    SELECT *
    FROM 02354_annoy
    WHERE L2Distance(embedding, [0.0, 0.0, 10.0]) < 1.0
    LIMIT 5;
    
    # 1	[0,0,10]
    # 2	[0,0,10.5]
    # 3	[0,0,9.5]
    # 4	[0,0,9.7]
    # 5	[0,0,10.2]
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只努力的微服务

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

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

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

打赏作者

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

抵扣说明:

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

余额充值