# 向量计算
DWS的9.1.1.200及以上集群版本支持通过集成pgvector插件（有关详细的规格和语法请参考[pgvector](https://github.com/pgvector/pgvector)），提供向量存储和检索能力。
#### 注意事项
- **该功能9.1.1.200集群版本中为Beta特性，如需使用请联系技术支持；9.1.1.300及以上集群版本中已正式商用** ；如需使用，请联系技术支持设置GUC参数**feature_support_options** 为**enable_pgvector**。
- 在存算分离架构下，pgvector扩展功能（CREATE EXTENSION语句）仅支持在主VW上执行。
 
#### pgvector插件能力
- 支持向量数据类型：可在表中建立 vector(n) 列，用于存储高维向量。
- 向量相似度计算：支持多种距离或相似度运算符，包括 L2（欧氏距离）、Inner Product、Cosine 距离、L1（曼哈顿距离）、甚至 Hamming/Jaccard 等。
- 支持最近邻搜索（Nearest Neighbour Search, NNS），包括准确搜索和近似搜索（ANN）。
- 支持向量索引： IVFFlat、HNSW 索引结构，用于加速大规模向量检索。
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
pgvector插件功能当前版本仅支持行存表。
#### 向量数据类型
| **数据类型**     | 精度                      | **支持维度**        | **典型用途**                        |
|:---|:---|:---|:---|
| vector      | 单精度浮点，4 字节。            | \<=16000        | 传统 embedding。                  |
| halfvec   | 半精度浮点（16 位浮点数，每元素 2 字节）。 | \<=16000       | 高维 embedding、内存敏感场景。           |
| bit      | 二进制向量类型（bit 向量）。           | \<= 64000       | 二进制哈希、图像／特征布尔表示。            |
| sparsevec | 稀疏向量类型。                | \<=16000非0维度 | 文本TF-IDF稀疏特征、超高维稀疏 embedding。 |
   
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
以上向量支持的维度为数据类型本身支持的维度限制，ivfflat及hnsw索引对向量维度有额外支持维度范围：
- vector：\<=2000
- halfvec：\<=4000
- bit：\<=64000
- sparsevec：\<=1000非0维度（仅hnsw索引支持）
 
#### 向量距离/相似度函数
| **操作符** | **距离／相似度类型**             | **说明**                     |
|:---|:---|:---|
| \<-\>     | Euclidean距离 (L2)      | 欧氏距离。                    |
| \<#\>    | （负）内积 (Inner Product) | 内积。                      |
| \<=\>     | Cosine距离              | 向量方向差异。                   |
| \<+\>    | L1距离 (Taxicab)          | 向量坐标绝对差之和。                |
| \<\~\>  | Hamming距离              | 用于二进制bit向量，计算位不同数目。      |
| \<%\>    | Jaccard距离              | 用于二进制bit向量/集合表示，衡量交集/并集差异。 |
   
#### 索引类型
| **索引类型**     | **原理**                              | **构建成本**   | **查询速度 / 召回 (speed‑recall)**   | **主要调优参数**                                                                                                |
|:---|:---|:---|:---|:---|
| **IVFFlat** | 将向量分成若干"lists"（簇/桶），查询时只扫描部分 lists | 构建快、内存使用低。   | 查询速度中等；召回率略低。扫描范围受"probes"参数影响。 | lists（簇数）、probes（扫描簇数）、maxProbes（最大扫描簇数）。                                                                 |
| **HNSW**    | 基于图结构（多层可导航小世界图），通过跳跃访问近邻点         | 构建较慢、内存占用较高。 | 查询速度快、召回率高；尤其适合高维、低延迟场景。        | m（每层最大连接数）、ef_construction（构建候选数）、ef_search（查询候选数）、max_scan_tuples（最大扫描节点数）、mem_scan_multiplier（内存动态扩张率）。 |
   
#### pgvector插件使用
1. 初始化插件。
   ```
   CREATE EXTENSION pgvector;
   ```
   
2. 创建一个维度为3的向量列。
   ```
   CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
   ```
   
3. 插入向量数据。
   ```
   INSERT INTO items (embedding) VALUES
   ('[1, 2, 3]'),
   ('[0.5, 0.1, 0.9]'),
   ('[3, 2, 1]'),
   ('[0, 0, 1]'),
   ('[1.1, 2.2, 3.3]');
   ```
   
4. L2距离查询最近相邻向量。
   ```
   SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;
    id |   embedding   
   ----+---------------
     3 | [3,2,1]
     1 | [1,2,3]
     5 | [1.1,2.2,3.3]
     2 | [0.5,0.1,0.9]
     4 | [0,0,1]
   (5 rows)
   ```
   
5. 查询距离。
   ```
   SELECT embedding <-> '[3,1,2]' AS distance FROM items; 
        distance     
   ------------------
    2.44948974278318
    2.87576084849969
     1.4142135623731
     3.3166247903554
    2.59615095306844
   (5 rows)
   ```
   ![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
   对于内积（inner product），用 -1 \* inner product来获取实际距离：
   ```
   SELECT (embedding <#> ’[3,1,2]’) * -1 AS inner_product FROM items;
   ```
   对于余弦距离（cosine distance）， 用1 - cosine distance来获取实际距离：
   ```
   SELECT 1 - (embedding <=> '[3,1,2]') AS cosine_similarity FROM items;
   ```
   
6. 聚合计算。
   ```
   SELECT AVG(embedding) FROM items;
          avg        
   ------------------
    [1.12,1.26,1.84]
   (1 row)
   SELECT SUM(embedding) FROM items;
         sum      
   ---------------
    [5.6,6.3,9.2]
   (1 row)
   ```
   
 
#### 索引使用
pgvector默认使用精确近邻搜索，提供百分之百召回率但查询速度较慢。可以按需使用近似相邻搜索索引来牺牲部分召回率以提高查询速度。不同于传统索引，近似搜索索引可能会返回不同的查询结果。pgvector目前支持的索引类型包括HNSW和IVFFlat。
- **HNSW**
  1. 添加索引。
     ```
     -- L2 distance
     CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);
     -- Inner product
     CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);
     -- Cosine distance
     CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);
     -- L1 distance
     CREATE INDEX ON items USING hnsw (embedding vector_l1_ops);
     -- Hamming distance
     CREATE INDEX ON items USING hnsw (embedding bit_hamming_ops);
     -- Jaccard distance
     CREATE INDEX ON items USING hnsw (embedding bit_jaccard_ops);
     ```
     ![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
     根据使用向量类型使用对应的距离函数，例如：halfvec向量L2距离使用halfvec_l2_ops，sparsevec向量类型使用 sparsevec_l2_ops。
     
  
  2. 构建参数。 m - 图层最大连接数 (默认值16)。
     ef_construction - 索引构建候选数 (默认值64)。
     ```
     CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);
     ```
     ![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
     更大的构建选项值能够提供更高的召回率，但索引的构建以及数据插入时间会增加。
     
   

- **IVFFlat**
  1. 添加索引
     ```
     -- L2 distance
     CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
     -- Inner product
     CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops) WITH (lists = 100);
     -- Cosine distance
     CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
     -- Hamming distance
     CREATE INDEX ON items USING ivfflat (embedding bit_hamming_ops) WITH (lists = 100);
     ```
     
  
  2. 构建参数 lists - 构建索引时计算的聚簇的数量，值越大召回率越高，索引构建时间越长。
     ![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
     - 建议在导入数据后再创建IVFFlat索引。
     
     - 选择合适的lists值，推荐1M以下数据量使用**行数 /1000** ，1M以上数据量采用**sqrt**（行数）。
       
   
- **索引参数**
  - 迭代扫描模式 HNSW和IVFFlat索引都支持迭代扫描模式，自动扫描更多索引来获取足够的数据量。
    通过参数hnsw_iterative_scan和ivfflat_iterative_scan控制开关。
    参数取值：off（默认值）、relaxed_order、strict_order（仅HNSW索引支持strict_order）。
    
  
  - HNSW查询选项 hnsw_options：包含三个数值，控制查询参数ef_search（查询候选数）、max_scan_tuples（最大扫描节点数）及mem_scan_multiplier（内存动态扩张率）。
    默认值：'40, 20000, 1.0'
    
  
  - IVFFlat查询选项 ivfflat_options：包含两个数值，控制probes（扫描簇数）和maxProbes（最大扫描簇数）。
    默认值：'1, 32768'
    
   
 
