向量检索
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集群提供高效的向量检索功能,可应用于图片检索、声纹匹配、人脸识别、文本检索等场景中。
产品架构
产品优势
向量数据的高维度、高性能和高召回率。
以人脸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 | +-------+---------------+