數據庫管理157期 2024-03-01
- 數據庫管理-第157期 Oracle Vector DB & AI-08(20240301)
- 1 創建示例向量
- 2 查找最近向量
- 3 基于向量簇組的最近向量查詢
- 總結
數據庫管理-第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軸創建對應的向量信息:
CREATE TABLE IF NOT EXISTS vt1(id NUMBER NOT NULL,v VECTOR(2, FLOAT32),PRIMARY KEY (id));DESC vt1;
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;
2 查找最近向量
1.以下圖方式,查找q點(0,5)最近的3個向量點:
從圖中實際情況來看最近的為2,1,3或者2,3,1。
SELECT id
FROM vt1
ORDER BY vector_distance(vector('[5, 0]'), v)
FETCH FIRST 3 ROWS ONLY;
2.以下圖方式,查找q點(3,0)最近的3個向量點:
從圖中實際情況來看最近的為1,2,3。
SELECT id
FROM vt1
ORDER BY vector_distance(vector('[3, 0]'), v)
FETCH FIRST 3 ROWS ONLY;
3.以下圖方式,查找q點(3,9)最近的3個向量點:
從圖中實際情況來看最近的為7,8,4。
SELECT id
FROM vt1
ORDER BY vector_distance(vector('[3, 9]'), v)
FETCH FIRST 3 ROWS ONLY;
4.以下圖方式,查找q點(3.1,6.9)最近的4個向量點:
從圖中實際情況來看最近的為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;
3 基于向量簇組的最近向量查詢
目前,vector_distance的結果依賴于兩個內容:
- 對于向量簇來說,查詢向量所在的位置,以特定向量或坐標為中心,比如(5,5)
- 結果集有多少行
然而,向量數據通常由一組向量簇組成,并且數據往往不是均勻分布的。也可能存在零個或多個數據簇。因此,向量簇往往表示相似數據的組。例如:地址、汽車類型、人名、報告或書籍等。
1.下面的示例有5個向量簇。因此我們會在vt1表中添加其他4組向量簇。這里你會發現一個向量簇中有負值(或坐標)。
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;
2.以下圖方式,查找q點(16,4)最近的3個向量點:
從圖中實際情況來看,我們希望結果是3x。
SELECT id
FROM vt1
ORDER BY vector_distance(vector('[16, 4]'), v)
FETCH FIRST 3 ROWS ONLY;
3.以下圖方式,查找q點(7,-5)最近的5個向量點:
從圖中實際情況來看,我們希望結果是2x。
SELECT id
FROM vt1
ORDER BY vector_distance(vector('[7, -5]'), v)
FETCH FIRST 5 ROWS ONLY;
4.以下圖方式,查找q點(6,10)最近的5個向量點:
從圖中實際情況來看,我們希望結果是5x。
SELECT id
FROM vt1
ORDER BY vector_distance(vector('[6, 10]'), v)
FETCH FIRST 5 ROWS ONLY;
5.以下圖方式,查找q點(6,8)最近的4個向量點:
從圖中實際情況來看,我們希望結果是8,9,51,52。
SELECT id
FROM vt1
ORDER BY vector_distance(vector('[6, 8]'), v)
FETCH FIRST 4 ROWS ONLY;
6.以下圖方式,查找q點(2.5,8.5)最近的4個向量點:
從圖中實際情況來看,我們希望結果是x,4x,5x。
SELECT id
FROM vt1
ORDER BY vector_distance(vector('[2.5, 8.5]'), v)
FETCH FIRST 4 ROWS ONLY;
總結
本期通過多個實際案例演示了Oracle Vector DB中如何實現近似查詢。
老規矩,知道寫了些啥。