1.拉取镜像
bash
# 或者已经编译了x86的postgis、pgvector的18.1
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:18.1
# arrch64架构
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_postgres-with-gis:18.1
2.创建一个 postgres 容器并启动
bash
docker run -d \
--name postgres-gis \
-e POSTGRES_PASSWORD='Yo5WYypu0mCCheOU' \
-p 5432:5432 \
-v /data/postgres:/var/lib/postgresql \
registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:18.1
3.执行PostGIS
bash
create extension postgis;
create extension postgis_topology;
create extension fuzzystrmatch;
create extension postgis_tiger_geocoder;
create extension address_standardizer;
4.执行pgvector扩展向量
bash
CREATE EXTENSION IF NOT EXISTS vector;
5.验证 PostGIS 安装:
bash
# 在 PostgreSQL 命令行中执行
SELECT PostGIS_Version();
SELECT PostGIS_Full_Version();
6.验证 pgvector安装:
bash
SELECT * FROM pg_extension WHERE extname = 'vector';
pgvector 扩展:向量数据库功能
什么是 pgvector?
pgvector 是一个 PostgreSQL 扩展,它让 PostgreSQL 能够存储、索引和查询向量数据(高维数组),主要用于:
核心功能
存储向量数据 - 存储多维浮点数数组
向量相似性搜索 - 查找最相似的向量
AI/ML 集成 - 与机器学习模型配合使用
主要用途
- AI 嵌入向量存储
bash
-- 存储 OpenAI、BERT 等模型的文本嵌入
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(1536), -- OpenAI 的维度
created_at TIMESTAMP
);
-- 插入向量数据
INSERT INTO documents (content, embedding) VALUES
('这是一个文档', '[0.1, 0.2, 0.3, ...]');
- 相似性搜索
bash
-- 查找最相似的文档
SELECT
id,
content,
embedding <=> '[0.1, 0.2, 0.3]' AS distance -- 余弦距离
FROM documents
ORDER BY distance
LIMIT 10;
- 推荐系统
bash
-- 基于向量相似性的产品推荐
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
features VECTOR(128), -- 产品特征向量
category TEXT
);
-- 查找相似产品
SELECT
p2.name,
p1.features <=> p2.features AS similarity
FROM products p1
CROSS JOIN products p2
WHERE p1.id = 123 AND p2.id != 123
ORDER BY similarity
LIMIT 5;
- 支持的距离度量
pgvector 支持多种距离计算:
bash
-- 1. 欧几里得距离(L2距离)
SELECT embedding <-> '[0.1, 0.2, 0.3]' FROM items;
-- 2. 余弦距离(1 - 余弦相似度)
SELECT embedding <=> '[0.1, 0.2, 0.3]' FROM items;
-- 3. 内积距离
SELECT embedding <#> '[0.1, 0.2, 0.3]' FROM items;
- 索引类型
IVFFlat 索引(推荐)
bash
-- 创建 IVFFlat 索引(适合大规模数据)
CREATE INDEX ON items
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100); -- 聚类数量
-- 用于不同距离度量
USING ivfflat (embedding vector_l2_ops) -- 欧几里得距离
USING ivfflat (embedding vector_cosine_ops) -- 余弦距离
USING ivfflat (embedding vector_ip_ops) -- 内积距离
- HNSW 索引(更精确,稍慢)
bash
-- 创建 HNSW 索引(精度更高)
CREATE INDEX ON items
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
实际应用场景
场景 1:语义搜索
python
# Python 示例:结合 OpenAI 嵌入
import openai
import psycopg2
from pgvector.psycopg2 import register_vector
# 生成文本嵌入
response = openai.Embedding.create(
model="text-embedding-ada-002",
input="如何学习 PostgreSQL"
)
embedding = response['data'][0]['embedding']
# 存储到 PostgreSQL
conn = psycopg2.connect("dbname=test user=postgres")
register_vector(conn)
cur = conn.cursor()
cur.execute(
"INSERT INTO documents (content, embedding) VALUES (%s, %s)",
("如何学习 PostgreSQL", embedding)
)
# 语义搜索
search_query = "PostgreSQL 教程"
search_embedding = get_embedding(search_query) # 获取查询的嵌入
cur.execute("""
SELECT content, embedding <=> %s AS distance
FROM documents
ORDER BY distance
LIMIT 5
""", (search_embedding,))
场景 2:图像相似性搜索
sql
-- 存储图像特征向量
CREATE TABLE images (
id SERIAL PRIMARY KEY,
image_path TEXT,
features VECTOR(512), -- ResNet/VGG 等模型提取的特征
tags TEXT[]
);
-- 查找相似图像
SELECT
image_path,
tags,
features <=> (SELECT features FROM images WHERE id = 123) AS similarity
FROM images
WHERE id != 123
ORDER BY similarity
LIMIT 10;
场景 3:用户画像匹配
bash
-- 基于用户行为向量的推荐
CREATE TABLE user_profiles (
user_id INT PRIMARY KEY,
behavior_vector VECTOR(256), -- 用户行为向量
preferences JSONB
);
-- 查找相似用户(用于协同过滤)
SELECT
u2.user_id,
u1.behavior_vector <=> u2.behavior_vector AS similarity
FROM user_profiles u1
JOIN user_profiles u2 ON u1.user_id != u2.user_id
WHERE u1.user_id = 1001
ORDER BY similarity
LIMIT 10;
性能优化技巧
bash
-- 1. 设置合适的索引参数
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 1000); -- 对于大数据集增加 lists 值
-- 2. 使用分区表
CREATE TABLE embeddings_partitioned (
id BIGINT,
embedding VECTOR(1536),
created_date DATE
) PARTITION BY RANGE (created_date);
-- 3. 调整搜索参数
SET ivfflat.probes = 10; -- 增加以提高准确性(默认 1)
SET hnsw.ef_search = 100; -- HNSW 搜索参数
与其他工具的集成
与 LangChain 集成 - 用于 AI 应用
与 OpenAI API 集成 - 存储和查询嵌入
与 Hugging Face 集成 - 使用开源模型
与 MLflow 集成 - 模型特征存储
优势
无需额外基础设施 - 直接在 PostgreSQL 中使用
ACID 保证 - 完整的数据库事务支持
SQL 接口 - 使用熟悉的 SQL 语法
与其他数据一起查询 - 向量 + 结构化数据联合查询
开源免费 - MIT 许可证
简单总结
pgvector = PostgreSQL + 向量数据库能力
把 PostgreSQL 变成了一个既能处理传统关系型数据,又能处理 AI 向量数据的多模数据库。特别适合需要同时处理结构化数据和 AI 嵌入的应用场景。