PostgreSQL向量检索之pgvector入门实战指南

 更新时间:2026年01月29日 16:57:50   作者:神的孩子都在歌唱  
pgvector是PostgreSQL的开源扩展,用于在数据库中存储和处理向量数据,特别是高维嵌入向量(embedding),本文介绍PostgreSQL向量检索:pgvector入门指南,感兴趣的朋友一起看看吧

一. 什么是 pgvector?

pgvector 是 PostgreSQL 的开源扩展,用于在数据库中存储和处理向量数据,特别是高维嵌入向量(embedding)。

功能与特点

  1. 向量存储:可将向量数据直接存入表中。
  2. 距离计算:支持 L2(欧氏距离)、Inner Product(内积)、Cosine(余弦相似度)等。
  3. 最近邻搜索:支持精确搜索和近似搜索(IVFFlat / HNSW)。
  4. 兼容 SQL:可以直接与表中的其他列一起做查询、过滤和排序。
  5. 可扩展性:适合中小规模向量存储,也能应对大数据量场景。

二. 为什么选择 PostgreSQL + pgvector?

  1. 数据整合:向量与原始数据存放在同一数据库,无需单独部署向量数据库。
  2. 事务和安全:继承 PostgreSQL 的事务、权限控制、备份与复制机制。
  3. 易于扩展:可以直接使用 SQL 做 JOIN、过滤条件,实现混合检索。
  4. 降低维护成本:只需要维护一个数据库系统,减少运维复杂度。
  5. 可视化和监控:可以使用 PostgreSQL 现有工具进行监控和分析。

三. 安装与启用

  1. 确保 PostgreSQL 支持扩展(通常 PostgreSQL 13+)
  2. 安装 pgvector

启用扩展:

CREATE EXTENSION IF NOT EXISTS vector;

验证安装:

SELECT * FROM pg_extension WHERE extname='vector';

成功后即可在表中创建向量列。

四. 基本数据结构

  • 向量列类型:vectorvector(n),其中 n 是向量维度。
  • 示例表结构:
CREATE TABLE documents (
    id BIGSERIAL PRIMARY KEY,
    embedding VECTOR(3) -- 假设嵌入向量是 3 维
);

小贴士:向量列的维度必须固定,查询和索引时保持一致。

五. 基本操作

5.1 插入向量

INSERT INTO documents (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'),('[4,0,5]');

5.2 查询向量最近邻

-- 使用 L2 距离
SELECT id,embedding <-> '[1,2,3]' as score,embedding FROM documents ORDER BY embedding <-> '[1,2,3]' LIMIT 5;

根据score的得分,就能查询出相近的向量,值越小代表越相似,算法如下
公式

5.3 常用距离运算符

操作符相似度度量说明推荐场景值越小代表
<->欧氏距离 (L2 Distance)计算两个向量之间的几何距离图像、音频、地理数据检索越相似
<#>负内积 (- Inner Product)取负号后的内积,用于最大内积搜索推荐系统、模型打分越相似
<=>余弦距离 (Cosine Distance)1 - 余弦相似度,对向量长度不敏感文本语义检索、跨语言向量匹配越相似

后面会出一篇关于这些运算符计算使用的文章

5.4 其他操作

# 向现有表中添加向量列
ALTER TABLE items ADD COLUMN embedding vector(3);
# 更新向量
UPDATE items SET embedding = '[1,2,3]' WHERE id = 1;
# 删除向量
UPDATE items SET embedding = '[1,2,3]' WHERE id = 1;

六. Python 示例

使用 pgvector-pythonpsycopg2 处理向量:

import numpy as np
import psycopg2
from pgvector.psycopg2 import register_vector
# 连接数据库
conn = psycopg2.connect(host='192.168.1.101', dbname='test-agent', user='postgres', password='123456', port=5433)
register_vector(conn)  # 注册 vector 类型
cur = conn.cursor()
# 插入示例向量
embedding = np.random.rand(3).astype('float32')
print(embedding)
cur.execute(
    "INSERT INTO documents (embedding) VALUES (%s)",
    (embedding,)  # 注意这里的逗号,确保是元组格式
)
conn.commit()
# 查询最近邻
query_embedding = np.random.rand(3).astype('float32')
print(query_embedding)
cur.execute(
    "SELECT id, embedding,embedding <-> %s as score  FROM documents ORDER BY embedding <-> %s LIMIT 5",
    (query_embedding, query_embedding,)
)
rows = cur.fetchall()
for r in rows:
    print(r)
cur.close()
conn.close()

七. 小结

  • pgvector 是 PostgreSQL 的向量扩展,支持高维嵌入向量存储与检索。
  • 提供精确与近似最近邻查询,并可与 SQL 完美结合。
  • 基础操作包括创建表、插入向量、查询最近邻以及选择合适的距离运算符。

到此这篇关于PostgreSQL向量检索之pgvector入门实战指南的文章就介绍到这了,更多相关postgresql向量检索pgvector内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PostgreSQL 模式(SCHEMA)操作指南数据库对象的命名空间管理

    PostgreSQL 模式(SCHEMA)操作指南数据库对象的命名空间管理

    文章详细介绍了PostgreSQL中模式(Schema)的概念、应用场景、操作指南、搜索路径机制以及最佳实践,模式是数据库对象的命名空间,提供逻辑隔离、权限控制和组织管理,文章还解答了常见问题,并总结了模式在数据库管理中的重要性,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • PostgreSQL教程(三):表的继承和分区表详解

    PostgreSQL教程(三):表的继承和分区表详解

    这篇文章主要介绍了PostgreSQL教程(三):表的继承和分区表详解,本文讲解了多表继承、 继承和权限、什么是分区表、分区表实现、分区和约束排除等内容,需要的朋友可以参考下
    2015-05-05
  • Mysql 8.0.33 如何迁移至 Postgresql 16.2

    Mysql 8.0.33 如何迁移至 Postgresql 16.2

    由于云平台需要改造,将Mysql替换成Postgresql,话说回来,Postgresql和Mysql语法有些差异,如何稳妥的进行迁移,下面给大家分享Mysql 8.0.33 如何迁移至 Postgresql 16.2,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • PostgreSQL分区表的实现示例

    PostgreSQL分区表的实现示例

    分区表是一种数据库优化技术,本文主要介绍了PostgreSQL分区表的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • postgresql 中的参数查看和修改方式

    postgresql 中的参数查看和修改方式

    这篇文章主要介绍了postgresql 中的参数查看和修改方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • pgpool复制和负载均衡操作

    pgpool复制和负载均衡操作

    这篇文章主要介绍了pgpool复制和负载均衡操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL的整型、浮点型、固定精度数值和序列等数字类型

    PostgreSQL的整型、浮点型、固定精度数值和序列等数字类型

    PostgreSQL(简称PGSQL)是一种开源关系型数据库管理系统,广泛应用于企业级应用,文章详细介绍了PostgreSQL的数字类型,包括整型、浮点型、固定精度数值型和序列类型,强调了选择合适的数字类型对于数据库的存储效率、查询性能和数据准确性的重要性
    2024-09-09
  • 基于PostgreSQL的时序数据库TimescaleDB的基本用法和概念

    基于PostgreSQL的时序数据库TimescaleDB的基本用法和概念

    时序数据是指按照时间顺序存储的数据,TimescaleDB是一个开源的、扩展了PostgreSQL的时序数据库扩展,本文就给大家详细的介绍一下基于PostgreSQL的时序数据库TimescaleDB的基本用法和概念,需要的朋友可以参考下
    2023-06-06
  • PostgreSQL中insert_username的扩展使用

    PostgreSQL中insert_username的扩展使用

    insert_username 是 PostgreSQL 的一个实用扩展,用于自动记录数据行的创建者和最后修改者信息,本文就来详细的介绍一下insert_username扩展,感兴趣的可以了解一下
    2025-06-06
  • PostgreSQL中JSONB的使用与踩坑指南

    PostgreSQL中JSONB的使用与踩坑指南

    文章介绍了PostgreSQL中JSONB的使用,包括JSONB的基础操作、索引策略、数组操作和批量更新,文章通过实例详细讲解了JSONB的使用方法,帮助读者解决实际工作中的问题,感兴趣的朋友跟随小编一起看看吧
    2025-12-12

最新评论