AnalyticDB for MySQL的向量檢索功能可以協助您實現非結構化資料的近似檢索。本文主要介紹向量檢索功能以及如何建立並使用向量索引。
前提條件
叢集的核心版本需為3.1.4.0及以上版本。
核心版本為3.1.5.16、3.1.6.8、3.1.8.6及以上版本的叢集向量索引功能相對穩定。
若您的叢集不是上述列舉的穩定版本,建議您先將參數CSTORE_PROJECT_PUSH_DOWN和CSTORE_PPD_TOP_N_ENABLE設定為false,再使用向量索引功能。
如何查看叢集核心版本,請參見如何查看執行個體版本資訊。如需升級核心版本,請聯絡支援人員。
背景資訊
功能介紹
您可以通過AI演算法提取非結構化資料的特徵進行資料編碼,形成一個特徵向量,將特徵向量儲存在AnalyticDB for MySQL中。使用特徵向量標識非結構化資料,向量間的距離用于衡量非結構化資料之間的相似性。AnalyticDB for MySQL叢集提供高效的向量檢索功能,可應用於圖片檢索、聲紋匹配、Face Service、文本檢索等情境中。
產品架構
產品優勢
向量資料的高維度、高效能和高召回率。
以人臉512維向量為例,AnalyticDB for MySQL向量檢索提供百億向量100 QPS、50毫秒回應時間約束下99%的資料召回率和兩億向量1000 QPS、1秒回應時間約束下99%的資料召回率。
結構化和非結構資料的融合查詢
支援KNN和RNN融合查詢,例如:比較一批向量與另外一批向量的相似性。
即時更新
支援高並發的即時寫入和即時更新,資料寫入後即可查詢。
即時檢索
MPP查詢架構提供毫秒級即時檢索效能,提升檢索效率。
開箱即用
支援標準的SQL語句,簡化開發流程,不需要額外安裝其他複雜的配置。
基本概念
建立向量索引
文法
您可以在建立表時同步建立向量索引。定義為:
ANN INDEX [index_name] (column_name)] [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]
參數說明
ANN INDEX:向量索引關鍵字。
index_name:索引名。索引的命名規則,請參見命名約束。
column_name:向量列的名稱。列名的命名規則,請參見命名約束。 僅支援
array <float>
、array <byte>
、array <smallint>
三種資料類型。algorithm:向量距離計算公式使用的演算法,取值僅支援:
HNSW_PQ
。distancemeasure:向量距離計算公式,取值僅支援:
SquaredL2
。SquaredL2
的計算公式為:(x1-y1)2+(x2-y2)2+…...(xn-yn)2
。
樣本
本樣本建立表vector
,表定義了兩個向量列float_feature
和short_feature
,其中,float_feature
的類型為arrary<float>
,維度為4
,short_feature
類型為arrary<smallint>
,維度也為4
,對這兩個列分別建立向量索引。
CREATE TABLE vector (
xid BIGINT NOT NULL,
cid BIGINT NOT NULL,
uid VARCHAR NOT NULL,
vid VARCHAR NOT NULL,
wid VARCHAR NOT NULL,
float_feature ARRAY < FLOAT >(4),
short_feature ARRAY < SMALLINT >(4),
ANN INDEX idx_short_feature(short_feature),
ANN INDEX idx_float_feature(float_feature),
PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);
增加向量索引
文法
您可以在建立表後增加向量索引。定義為:
ALTER TABLE table_name ADD ANN INDEX [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]
樣本
假設已有表vector
,建表語句如下。
CREATE TABLE vector (
xid BIGINT not null,
cid BIGINT not null,
uid VARCHAR not null,
vid VARCHAR not null,
wid VARCHAR not null,
float_feature array < FLOAT >(4),
short_feature array < SMALLINT >(4),
PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);
為float_feature
和short_feature
建立向量索引,樣本如下。
ALTER TABLE vector ADD ANN INDEX idx_float_feature(float_feature);
ALTER TABLE vector ADD ANN INDEX idx_short_feature(short_feature);
查詢向量資料
您可以在查詢語句中加入距離計算函數,將實體關聯抽象成向量空間的距離。例如L2_DISTANCE
。
樣本
插入資料
已建好表vector
後,在表中插入資料。
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (1,2,'A','B','C','[1,1,1,1]','[1.2,1.5,2,3.0]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (2,1,'e','v','f','[2,2,2,2]','[1.5,1.15,2.2,2.7]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (0,6,'d','f','g','[3,3,3,3]','[0.2,1.6,5,3.7]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'j','b','h','[4,4,4,4]','[1.0,4.15,6,2.9]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (8,5,'Sj','Hb','Dh','[5,5,5,5]','[1.3,4.5,6.9,5.2]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'x','g','h','[3,4,4,4]','[1.0,4.15,6,2.9]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'j','r','k','[6,6,4,4]','[1.0,4.15,6,2.9]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'s','i','q','[2,2,4,4]','[1.0,4.15,6,2.9]');
查詢資料
查詢short_feature與向量
'[1,1,1,1]'
距離最近的3條記錄,按距離排序:SELECT xid, l2_distance(short_feature, '[1,1,1,1]') AS dis FROM vector ORDER BY 2 LIMIT 3;
返回結果:
+-------+--------------+ | xid | dis | +-------+--------------+ | 1 | 0.0 | +-------+--------------+ | 2 | 4.0 | +-------+--------------+ | 0 | 16.0 | +-------+--------------+
查詢xid為5且cid為4,short_feature與向量
'[1,1,1,1]'
距離最近的4條記錄,按距離排序:SELECT uid, l2_distance(short_feature, '[1,1,1,1]') AS dis FROM vector WHERE xid = 5 AND cid = 4 ORDER BY 2 LIMIT 4;
返回結果:
+-------+--------------+ | uid | dis | +-------+--------------+ | s | 20.0 | +-------+--------------+ | x | 31.0 | +-------+--------------+ | j | 36.0 | +-------+--------------+ | j | 68.0 | +-------+--------------+
查詢short_feature與向量
'[1,1,1,1]'
距離最近的3條記錄,按距離排序,且距離不能超過50:SELECT uid, l2_distance(short_feature, '[1,1,1,1]') AS dis FROM vector WHERE l2_distance(short_feature, '[1,1,1,1]') < 50.0 AND xid = 5 ORDER BY 2 LIMIT 3;
返回結果:
+-------+---------------+ | uid | dis | +-------+---------------+ | s | 20.0 | +-------+---------------+ | x | 31.0 | +-------+---------------+ | j | 36.0 | +-------+---------------+