
# 使用pgvector插件
#### 简介
RDS for PostgreSQL支持pgvector插件，提供支持vector数据类型和向量相似性搜索。该插件提供以下支持：
- 精确的和近似的最近邻搜索
- L2距离，内积和余弦距离
- Postgres客户端的任何语言
更多信息，请参见[pgvector官方文档](https://github.com/pgvector/pgvector)。
#### 支持的版本
PostgreSQL 12及以上版本的最新小版本支持该插件。可通过以下SQL语句查询当前实例是否支持该插件：
```
SELECT * FROM pg_available_extension_versions WHERE name = 'vector';
```
如果不支持，可通过[升级内核小版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0003.html)或者[使用转储与还原升级大版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0053.html)使用该插件。
RDS for PostgreSQL实例支持的插件，具体请参见[支持的插件列表](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0045.html)。
#### 插件安装/卸载
- 安装插件
  ```
  SELECT control_extension ('create', 'vector');
  ```
  
- 删除插件
  ```
  SELECT control_extension ('drop', 'vector');
  ```
  
更多信息，请参见[通过界面安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0070.html)和[通过SQL命令安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0043.html)。
#### 基本使用
- 创建具有3维的向量列
  ```
  CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
  ```
  
- 插入向量
  ```
  INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');
  ```
  
- 通过L2距离得到最近邻
  ```
  SELECT * FROM items ORDER BY embedding <-> '[3,1,2]';
  ```
  
- 通过余弦距离得到最近邻
  ```
  SELECT * FROM items ORDER BY embedding <=> '[3,1,2]';
  ```
  
- 通过内积得到最近邻 \<#\>返回的是负内积，因为Postgres只支持运算符上的ASC顺序索引扫描
  ```
  SELECT * FROM items ORDER BY embedding <#> '[3,1,2]';
  ```
  
 
#### 进阶使用
- 计算距离
  ```
  SELECT embedding <-> '[3,1,2]' AS distance FROM items;
  SELECT (embedding <#> '[3,1,2]') * -1 AS inner_product FROM items;
  SELECT 1 - (embedding <=> '[3,1,2]') AS cosine_similarity FROM items;
  ```
  

- 聚合函数
  ```
  SELECT AVG(embedding) FROM items;
  ```
  
- 精确搜索是有完美召回率的 可以添加索引使用近似最近邻搜索，牺牲一些召回率来换取性能
  ```
  CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 1);
  INSERT INTO items (embedding) VALUES ('[1,2,4]');
  SELECT * FROM items ORDER BY embedding <-> '[3,3,3]';
  ```
  
 
