資料庫管理-第157期 Oracle Vector DB & AI-08(20240301)

yhw1809發表於2024-03-01

資料庫管理-第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;

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;

image.png

2 查詢最近向量

1.以下圖方式,查詢q點(0,5)最近的3個向量點:
image.png
從圖中實際情況來看最近的為2,1,3或者2,3,1。

SELECT idFROM   vt1ORDER  BY  vector_distance(vector('[5, 0]'), v)FETCH FIRST 3 ROWS ONLY;

image.png
2.以下圖方式,查詢q點(3,0)最近的3個向量點:
image.png
從圖中實際情況來看最近的為1,2,3。

SELECT idFROM   vt1ORDER  BY  vector_distance(vector('[3, 0]'), v)FETCH FIRST 3 ROWS ONLY;

image.png
3.以下圖方式,查詢q點(3,9)最近的3個向量點:
image.png
從圖中實際情況來看最近的為7,8,4。

SELECT idFROM   vt1ORDER  BY  vector_distance(vector('[3, 9]'), v)FETCH FIRST 3 ROWS ONLY;

image.png
4.以下圖方式,查詢q點(3.1,6.9)最近的4個向量點:
image.png
從圖中實際情況來看最近的為7,4,8,5或者7,8,4,5。

SELECT idFROM   vt1ORDER  BY vector_distance(vector('[3.1, 6.9]'), v)FETCH FIRST 4 ROWS ONLY;

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;

image.png
image.png
2.以下圖方式,查詢q點(16,4)最近的3個向量點:
image.png
從圖中實際情況來看,我們希望結果是3x。

SELECT idFROM   vt1ORDER  BY vector_distance(vector('[16, 4]'), v)FETCH FIRST 3 ROWS ONLY;

image.png
3.以下圖方式,查詢q點(7,-5)最近的5個向量點:
image.png
從圖中實際情況來看,我們希望結果是2x。

SELECT idFROM   vt1ORDER  BY vector_distance(vector('[7, -5]'), v)FETCH FIRST 5 ROWS ONLY;

image.png
4.以下圖方式,查詢q點(6,10)最近的5個向量點:
image.png
從圖中實際情況來看,我們希望結果是5x。

SELECT idFROM   vt1ORDER  BY vector_distance(vector('[6, 10]'), v)FETCH FIRST 5 ROWS ONLY;

image.png
5.以下圖方式,查詢q點(6,8)最近的4個向量點:
image.png
從圖中實際情況來看,我們希望結果是8,9,51,52。

SELECT idFROM   vt1ORDER  BY vector_distance(vector('[6, 8]'), v)FETCH FIRST 4 ROWS ONLY;

image.png
6.以下圖方式,查詢q點(2.5,8.5)最近的4個向量點:
image.png
從圖中實際情況來看,我們希望結果是x,4x,5x。

SELECT idFROM   vt1ORDER  BY vector_distance(vector('[2.5, 8.5]'), v)FETCH FIRST 4 ROWS ONLY;

image.png

總結

本期透過多個實際案例演示了Oracle Vector DB中如何實現近似查詢。
老規矩,知道寫了些啥。

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/31466763/viewspace-3007790/,如需轉載,請註明出處,否則將追究法律責任。

相關文章