本节将通过具体示例,介绍如何在建表时创建向量列、创建向量索引。当前使用的相关语法均符合标准的SQL98语法。

创建向量检索插件

使用以下语句创建向量检索插件。执行一次即可,不用每次执行。

CREATE EXTENSION IF NOT EXISTS fastann;

创建表时创建向量索引

语法:

CREATE TABLE [TABLE_NAME]
(  
    C1 DATATYPE,  
    C2 DATATYPE,  
    ......,  
    CN REAL[], 
    PRIMARY KEY(一列或者多列)
);
说明 表名需在同一模式中的其它表、 序列、索引、视图或外部表名字中唯一。执行该操作将在当前数据库中创建一个新的空白表,该表将由执行此命令的用户所拥有。

示例:在TEST空间下创建FACE_TABLE表,C2为向量列,C1为主键。NOT NULL表示字段不允许出现空值。

CREATE TABLE FACE_TABLE (  
    C1 INT,  
    C2 REAL[] NOT NULL,  
    C3 TIMESTAMP NOT NULL,  
    C4 VARCHAR(20) NOT NULL,  
    PRIMARY KEY (C1)
);
说明 对于向量列,使用的是AnalyticDB PostgreSQL版中自带的数组类型来做向量列的存储。在本案例中,REAL[]定义的是存储REAL类型的数组。

创建向量索引

索引是加速数据检索的一种特殊表查询,向量索引是一个指向表中数据的指针,通过对图中各个节点的遍历,找到与输入向量相似的向量。索引有助于加快向量检索中的SELECT中的WHERE子句,但是可能会降低使用INSERTUPDATE语句写入或更新数据的效率。

语法:

CREATE INDEX [INDEX_NAME]
ON [SCHEMA_NAME].[TABLE_NAME]   
USING ANN(COLUMN_NAME) 
WITH (DIM=$DIMENSION);

每个字段的含义:

  • INDEX_NAME:索引名
  • SCHEMA_NAME:模式(命名空间)名
  • TABLE_NAME:表名
  • COLUMN_NAME:向量索引列名
  • DIMENSION:特征向量⻓度。要求不低于64,且不超过8192。该参数主要用于向量插入时候的检测,当维度不匹配的时候,系统将提示相关错误信息。

示例

假设有一个商品库,其中商品表products包含如下字段:

字段 类型 说明
Id serial 编号
Name varchar(256) 商品名称
Price real 价格
InTime timestamp 入库时间
Url varchar(256) 图片链接
Feature real[] 图片特征

建表DDL如下:

CREATE TABLE products (
    Id serial primary key, 
    Name varchar(256), 
    Price real, 
    InTime timestamp, 
    Url varchar(256),
    Feature real[]
);

为了对向量查询进行加速,还需要建立一个向量索引:

CREATE INDEX ON products USING ann(feature) WITH (dim=512);

其中要指定使用 “ann” Access Method,它是FastANN插件提供的。创建向量索引时,需要通过with子句指定一些参数,其中必须指定的是“dim”,即向量的维度。

说明 向量索引目前仅支持欧氏距离(L2 Distance),其他的距离类型需要预先转换成欧氏距离才能使用向量索引。

对于其他类型的距离,仅提供对应的距离计算UDF供暴力计算使用。目前提供的距离计算UDF列表如下:

  • 点积距离:dp_distance
  • 汉明距离:hm_distance
  • 欧氏距离:l2_distance

为了对向量结构化融合查询提供加速,可以为常用的结构化列建立索引。如果某些条件经常一起出现,则可以建立组合索引:

CREATE INDEX ON products(price, intime);