参数
create index ivfsq_name on v using ivfsq(vec distance) with (lists=100,rs=RS_minmax,rs_arg=0, dtype='QT_8bit') ;
set ivfsq.probes = 2;
第一行为默认值,第一列的值不可以省略,其他的列可以进行省略。
参数内容
参数 | 可选值 | 说明 |
---|---|---|
vec |
vector , Halfvector |
向量的类型,分为vector或者Halfvec |
distance |
vector_l2_ops , vector_ip_ops , vector_cosine_ops |
不同的距离计算 |
lists |
1-32768 |
创建索引的时候,需要创建的聚类中心数 |
rs |
RS_minmax , RS_meanstd , RS_quantiles , RS_optim |
量化范围的统计方法。 |
rs_arg |
0 , 0.1-0.2 , 0.3-0.5 |
范围缩放因子,根据 rs 方法确定范围扩展比例。 |
dtype |
int8 , int4 , int6 , float16 |
数据类型,支持无符号量化;例如:int8 表示 8 位整型。 |
probes |
10 |
查询时会探测的倒排列表的数量。 |
vec
这两个结构体是 PostgreSQL pgvector 扩展(或类似向量存储扩展)中定义的向量数据结构,主要用于存储高维向量数据,并用于 相似性搜索(ANN, Approximate Nearest Neighbor) 计算。
vector
typedef struct Vector
{
int32 vl_len_; /* varlena header (do not touch directly!) */
int16 dim; /* number of dimensions */
int16 unused; /* reserved for future use, always zero */
float x[FLEXIBLE_ARRAY_MEMBER];
} Vector;
Vector 结构体用于 存储高精度(32-bit float 类型)浮点向量。
字段 | 类型 | 作用 |
---|---|---|
vl_len_ |
int32 |
PostgreSQL 的 varlena 变长存储头,用于管理变长数据结构 |
dim |
int16 |
向量的维度 |
unused |
int16 |
预留字段,目前始终为 0 |
x |
float[FLEXIBLE_ARRAY_MEMBER] |
实际存储的向量数据(浮点数数组) |
🔹 为什么需要这两个向量结构体?
1️⃣ Vector(标准 float 向量)
✅ 优点:
高精度计算,适用于需要精确计算 L2(欧几里得距离)、内积、余弦相似度 等任务。
适用于对计算精度要求较高的应用,如:
高精度图像特征匹配
语义搜索
精确的机器学习推理
❌ 缺点:
占用更多存储空间,对于高维度向量(如 512 维或 1024 维),存储成本较高。
Halfvector
typedef struct HalfVector
{
int32 vl_len_; /* varlena header (do not touch directly!) */
int16 dim; /* number of dimensions */
int16 unused; /* reserved for future use, always zero */
half x[FLEXIBLE_ARRAY_MEMBER];
} HalfVector;
HalfVector 结构体用于 存储 16-bit 半精度浮点数(half 类型)。
字段 | 类型 | 作用 |
---|---|---|
vl_len_ |
int32 |
变长存储头(PostgreSQL varlena 类型) |
dim |
int16 |
向量的维度 |
unused |
int16 |
预留字段,目前始终为 0 |
x |
half[FLEXIBLE_ARRAY_MEMBER] |
实际存储的向量数据(半精度浮点数数组) |
2️⃣ HalfVector(半精度 half 向量)
✅ 优点:
更少的存储空间(half 是 16-bit,而 float 是 32-bit,节省 50% 存储)。
适用于 近似计算、神经网络和深度学习,因为许多 AI 模型 只需要半精度浮点计算,减少存储成本和计算开销。
适用于 大规模向量索引存储(如 IVFPQ),减少存储占用,提高搜索速度。
❌ 缺点:
计算精度较低,可能导致搜索结果精度下降,不适用于严格要求高精度计算的任务。
两者对比
特性 | Vector (float) | HalfVector (half) |
---|---|---|
存储精度 | 32-bit 浮点数(高精度) | 16-bit 半精度浮点数(低精度) |
存储空间 | 需要更多存储 | 约 1/2 存储大小(节省 50% 空间) |
计算速度 | 高精度计算,但计算量更大 | 更快的计算速度,适用于 ANN 近似计算 |
适用场景 | 需要高精度计算,如图像搜索、精确相似度匹配 | 大规模数据存储,减少存储开销,如 ANN、深度学习 |
缺点 | 存储开销较大 | 精度较低,可能影响搜索准确度 |
distance
✅ 1. vector_l2_ops(L2 距离 / 欧几里得距离)
欧几里得距离(L2 距离)是衡量两个向量在空间中的距离,定义如下:
d L 2 ( a , b ) = ∥ a − b ∥ 2 = ∑ i = 1 d ( a i − b i ) 2 d_{\mathrm{L} 2}(\mathbf{a}, \mathbf{b})=\|\mathbf{a}-\mathbf{b}\|_{2}=\sqrt{\sum_{i=1}^{d}\left(a_{i}-b_{i}\right)^{2}} dL2(a,b)=∥a−b∥2=∑i=1d(ai−bi)2
其中:
a = ( a 1 , a 2 , … , a d ) \mathbf{a}=(a_1,a_2,…,a_d) a=(a1,a2,…,ad) 是向量 a \mathbf{a} a
b = ( b 1 , b 2 , … , b d ) \mathbf{b}=(b_1,b_2,…,b_d) b=(b1