• 数据库管理-第157期 Oracle Vector DB & AI-08(20240301)


    数据库管理-第157期 Oracle Vector DB & AI-08(20240301)

    作者:胖头鱼的鱼缸(尹海文)
    Oracle ACE Associate: Database(Oracle与MySQL)
    国内某科技公司 DBA总监
    10年数据库行业经验,现主要从事数据库服务工作
    拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
    墨天轮MVP、认证技术专家、年度墨力之星,ITPUB认证专家,OCM讲师
    圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
    公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
    除授权转载并标明出处外,均为“非法”抄袭。

    进入新的一个月,昨天可能是很多国产数据库开始较大规模使用遇到的第一个闰二月,听说有些国产数据库直接跳过了2月29日来到了3月1日,挺好玩的。
    本期内容,模拟在一个二维平面上进行近似查询。

    1 创建示例向量

    按照下图内容,以X和Y轴创建对应的向量信息:
    image.png

    CREATE TABLE IF NOT EXISTS vt1
             (id   NUMBER NOT NULL,
              v    VECTOR(2, FLOAT32),
                   PRIMARY KEY (id)
             );
    
    DESC vt1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image.png

    INSERT INTO vt1 VALUES (1, '[3, 3]'),  (2, '[5, 3]'),  (3, '[7, 3]'),
                           (4, '[3, 5]'),  (5, '[5, 5]'),  (6, '[7, 5]'),
                           (7, '[3, 7]'),  (8, '[5, 7]'),  (9, '[7, 7]');
    
    COMMIT;
    
    SELECT * FROM vt1 ORDER BY id;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image.png

    2 查找最近向量

    1.以下图方式,查找q点(0,5)最近的3个向量点:
    image.png
    从图中实际情况来看最近的为2,1,3或者2,3,1。

    SELECT id
    FROM   vt1
    ORDER  BY  vector_distance(vector('[5, 0]'), v)
    FETCH FIRST 3 ROWS ONLY;
    
    • 1
    • 2
    • 3
    • 4

    image.png
    2.以下图方式,查找q点(3,0)最近的3个向量点:
    image.png
    从图中实际情况来看最近的为1,2,3。

    SELECT id
    FROM   vt1
    ORDER  BY  vector_distance(vector('[3, 0]'), v)
    FETCH FIRST 3 ROWS ONLY;
    
    • 1
    • 2
    • 3
    • 4

    image.png
    3.以下图方式,查找q点(3,9)最近的3个向量点:
    image.png
    从图中实际情况来看最近的为7,8,4。

    SELECT id
    FROM   vt1
    ORDER  BY  vector_distance(vector('[3, 9]'), v)
    FETCH FIRST 3 ROWS ONLY;
    
    • 1
    • 2
    • 3
    • 4

    image.png
    4.以下图方式,查找q点(3.1,6.9)最近的4个向量点:
    image.png
    从图中实际情况来看最近的为7,4,8,5或者7,8,4,5。

    SELECT id
    FROM   vt1
    ORDER  BY vector_distance(vector('[3.1, 6.9]'), v)
    FETCH FIRST 4 ROWS ONLY;
    
    • 1
    • 2
    • 3
    • 4

    image.png

    3 基于向量簇组的最近向量查询

    目前,vector_distance的结果依赖于两个内容:

    • 对于向量簇来说,查询向量所在的位置,以特定向量或坐标为中心,比如(5,5)
    • 结果集有多少行

    然而,向量数据通常由一组向量簇组成,并且数据往往不是均匀分布的。也可能存在零个或多个数据簇。因此,向量簇往往表示相似数据的组。例如:地址、汽车类型、人名、报告或书籍等。
    1.下面的示例有5个向量簇。因此我们会在vt1表中添加其他4组向量簇。这里你会发现一个向量簇中有负值(或坐标)。
    image.png

    INSERT INTO vt1 VALUES (21, '[9, -1]'),
                           (22, '[10, -1]'),
                           (23, '[11, -1]'),
                           (24, '[9, -3]'),
                           (25, '[10, -4]'),
                           (26, '[12, -3]') ;
    INSERT INTO vt1 VALUES (31, '[13, 6]'),
                           (32, '[14, 7]'),
                           (33, '[14, 4]'),
                           (34, '[16, 6]') ;
    INSERT INTO vt1 VALUES (41, '[0, 7]'),
                           (42, '[1, 7]'),
                           (43, '[1, 6]'),
                           (44, '[0, 5]'),
                           (45, '[1, 5]') ;
    INSERT INTO vt1 VALUES (51, '[5, 9]'),
                           (52, '[7, 9]'),
                           (53, '[6, 10]'),
                           (54, '[5, 11]'),
                           (55, '[7, 11]') ;
    
    COMMIT ;
    
    SELECT * FROM vt1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    image.png
    image.png
    2.以下图方式,查找q点(16,4)最近的3个向量点:
    image.png
    从图中实际情况来看,我们希望结果是3x。

    SELECT id
    FROM   vt1
    ORDER  BY vector_distance(vector('[16, 4]'), v)
    FETCH FIRST 3 ROWS ONLY;
    
    • 1
    • 2
    • 3
    • 4

    image.png
    3.以下图方式,查找q点(7,-5)最近的5个向量点:
    image.png
    从图中实际情况来看,我们希望结果是2x。

    SELECT id
    FROM   vt1
    ORDER  BY vector_distance(vector('[7, -5]'), v)
    FETCH FIRST 5 ROWS ONLY;
    
    • 1
    • 2
    • 3
    • 4

    image.png
    4.以下图方式,查找q点(6,10)最近的5个向量点:
    image.png
    从图中实际情况来看,我们希望结果是5x。

    SELECT id
    FROM   vt1
    ORDER  BY vector_distance(vector('[6, 10]'), v)
    FETCH FIRST 5 ROWS ONLY;
    
    • 1
    • 2
    • 3
    • 4

    image.png
    5.以下图方式,查找q点(6,8)最近的4个向量点:
    image.png
    从图中实际情况来看,我们希望结果是8,9,51,52。

    SELECT id
    FROM   vt1
    ORDER  BY vector_distance(vector('[6, 8]'), v)
    FETCH FIRST 4 ROWS ONLY;
    
    • 1
    • 2
    • 3
    • 4

    image.png
    6.以下图方式,查找q点(2.5,8.5)最近的4个向量点:
    image.png
    从图中实际情况来看,我们希望结果是x,4x,5x。

    SELECT id
    FROM   vt1
    ORDER  BY vector_distance(vector('[2.5, 8.5]'), v)
    FETCH FIRST 4 ROWS ONLY;
    
    • 1
    • 2
    • 3
    • 4

    image.png

    总结

    本期通过多个实际案例演示了Oracle Vector DB中如何实现近似查询。
    老规矩,知道写了些啥。

  • 相关阅读:
    血泪史!外包如何找到靠谱的兼职程序员?
    javabean项目专项练习(1) 文字格斗游戏
    MATLAB中deg2rad和rad2deg函数的使用
    【解刊】3区SCI,25天录用,4天见刊!计算机网络通信领域
    【RocketMQ】(六)顺序消息实现原理
    迅为RK3568开发Android12系统烧写 Android 固件
    设置小于浏览器默认字体大小的显示方法
    J2EE基础:SpringAop的使用
    前端面试题之——说一说深浅拷贝,都是怎么实现的?
    Panda3D设置游戏背景颜色和节点颜色
  • 原文地址:https://blog.csdn.net/yhw1809/article/details/136389077