组件 | 版本要求 |
云数据库 PostgreSQL | |
pgvector 扩展 | 0.8.2及以上 |
pgvectorscale 扩展 | 0.9.0及以上 |
-- 第一步:安装 pgvector 扩展(如已安装可跳过)CREATE EXTENSION IF NOT EXISTS vector;-- 第二步:安装 pgvectorscale 扩展CREATE EXTENSION IF NOT EXISTS vectorscale;
SELECT extname, extversion FROM pg_extensionWHERE extname IN ('vector', 'vectorscale');
-- 创建包含128维向量的文档表CREATE TABLE documents (id SERIAL PRIMARY KEY,title TEXT NOT NULL,content TEXT,embedding vector(128) -- 向量维度根据实际模型调整);
-- 余弦距离(最常用,适合语义搜索)CREATE INDEX idx_doc_cosine ON documentsUSING diskann (embedding vector_cosine_ops);-- 欧氏距离(L2)CREATE INDEX idx_doc_l2 ON documentsUSING diskann (embedding vector_l2_ops);-- 内积距离CREATE INDEX idx_doc_ip ON documentsUSING diskann (embedding vector_ip_ops);
-- 插入单条数据INSERT INTO documents (title, content, embedding)VALUES ('云数据库 PostgreSQL 简介','PostgreSQL 是功能强大的开源关系数据库...','[0.1, 0.2, -0.3, ...]'::vector);-- 批量插入(推荐使用 COPY 或多行 INSERT)INSERT INTO documents (title, content, embedding) VALUES('文档1', '内容1', '[0.1, 0.2, ...]'::vector),('文档2', '内容2', '[0.3, 0.4, ...]'::vector);
-- 余弦距离查询 Top 5最相似文档SELECT id, title, embedding <=> '[0.1, 0.2, ...]'::vector AS distanceFROM documentsORDER BY embedding <=> '[0.1, 0.2, ...]'::vectorLIMIT 5;-- L2距离查询SELECT id, title, embedding <-> '[0.1, 0.2, ...]'::vector AS distanceFROM documentsORDER BY embedding <-> '[0.1, 0.2, ...]'::vectorLIMIT 5;-- 内积查询SELECT id, title, embedding <#> '[0.1, 0.2, ...]'::vector AS distanceFROM documentsORDER BY embedding <#> '[0.1, 0.2, ...]'::vectorLIMIT 5;
操作符 | 距离类型 | 适用场景 |
<=> | 余弦距离 | 语义相似度搜索(推荐) |
<-> | 欧氏距离(L2) | 坐标空间中的距离计算 |
<#> | 负内积 | 点积相似度 |
参数 | 默认值 | 说明 |
num_neighbors | 32 | 图中每个节点的邻居数量。增大可提高 Recall,但会增加索引大小和构建时间。 |
search_list_size | 100 | 搜索时的候选列表大小。增大可提高 Recall,但会增加查询延迟。 |
-- 高 Recall 配置(适合对准确率要求高的场景)CREATE INDEX idx_high_recall ON documentsUSING diskann (embedding vector_cosine_ops)WITH (num_neighbors = 64, search_list_size = 200);-- 高吞吐配置(适合对延迟要求高的场景)CREATE INDEX idx_low_latency ON documentsUSING diskann (embedding vector_cosine_ops)WITH (num_neighbors = 32, search_list_size = 80);-- 大数据集配置(百万级以上)CREATE INDEX idx_large_scale ON documentsUSING diskann (embedding vector_cosine_ops)WITH (num_neighbors = 50, search_list_size = 150);
数据规模 | num_neighbors | search_list_size | 预期 Recall |
< 10万 | 32 | 100 | ≥ 95% |
10万 - 100万 | 50 | 150 | ≥ 90% |
> 100万 | 64 | 200 | ≥ 85% |
场景 | 推荐索引 | 理由 |
数据量 < 100万,对延迟敏感 | HNSW | 构建快,查询延迟低 |
数据量 > 100万 | DiskANN | 内存占用低,磁盘友好 |
内存资源受限 | DiskANN | 存储占用约为 HNSW 的60% |
数据频繁更新 | DiskANN | 支持并发插入和混合读写 |
对 Recall 要求极高(>99%) | HNSW | 精确度略优 |
-- 创建知识库表CREATE TABLE knowledge_base (id SERIAL PRIMARY KEY,doc_title TEXT,chunk_text TEXT,embedding vector(1024), -- 以 BGE-M3模型为例metadata JSONB);-- 创建 DiskANN 索引CREATE INDEX idx_kb_diskann ON knowledge_baseUSING diskann (embedding vector_cosine_ops)WITH (num_neighbors = 50, search_list_size = 150);-- 检索与问题最相关的5个文档片段SELECT chunk_text, metadata,embedding <=> $1::vector AS distanceFROM knowledge_baseORDER BY embedding <=> $1::vectorLIMIT 5;
-- 商品向量表CREATE TABLE product_embeddings (product_id BIGINT PRIMARY KEY,product_name TEXT,category TEXT,embedding vector(256));-- 按类别过滤的相似商品搜索SELECT product_id, product_name,embedding <=> $1::vector AS distanceFROM product_embeddingsWHERE category = '电子产品'ORDER BY embedding <=> $1::vectorLIMIT 20;
-- 图片向量表CREATE TABLE image_vectors (image_id BIGINT PRIMARY KEY,image_url TEXT,description TEXT,embedding vector(512) -- CLIP 模型输出);CREATE INDEX idx_img_diskann ON image_vectorsUSING diskann (embedding vector_cosine_ops);-- 以图搜图SELECT image_id, image_url, description,embedding <=> $1::vector AS distanceFROM image_vectorsORDER BY embedding <=> $1::vectorLIMIT 10;
-- 重建索引REINDEX INDEX idx_doc_cosine;-- 或并发重建(不阻塞查询)REINDEX INDEX CONCURRENTLY idx_doc_cosine;
-- 查看索引大小SELECT pg_size_pretty(pg_relation_size('idx_doc_cosine')) AS index_size;-- 查看索引使用情况SELECT indexrelname, idx_scan, idx_tup_read, idx_tup_fetchFROM pg_stat_user_indexesWHERE indexrelname LIKE '%diskann%';
距离类型 | 操作符 | 索引操作类 | 适用函数 |
余弦距离 | <=> | vector_cosine_ops | cosine_distance() |
欧氏距离 | <-> | vector_l2_ops | l2_distance() |
负内积 | <#> | vector_ip_ops | inner_product() |
文档反馈