PostgreSQL向量檢索之pgvector入門(mén)實(shí)戰(zhàn)指南
一. 什么是 pgvector?
pgvector 是 PostgreSQL 的開(kāi)源擴(kuò)展,用于在數(shù)據(jù)庫(kù)中存儲(chǔ)和處理向量數(shù)據(jù),特別是高維嵌入向量(embedding)。
功能與特點(diǎn)
- 向量存儲(chǔ):可將向量數(shù)據(jù)直接存入表中。
- 距離計(jì)算:支持 L2(歐氏距離)、Inner Product(內(nèi)積)、Cosine(余弦相似度)等。
- 最近鄰搜索:支持精確搜索和近似搜索(IVFFlat / HNSW)。
- 兼容 SQL:可以直接與表中的其他列一起做查詢、過(guò)濾和排序。
- 可擴(kuò)展性:適合中小規(guī)模向量存儲(chǔ),也能應(yīng)對(duì)大數(shù)據(jù)量場(chǎng)景。
二. 為什么選擇 PostgreSQL + pgvector?
- 數(shù)據(jù)整合:向量與原始數(shù)據(jù)存放在同一數(shù)據(jù)庫(kù),無(wú)需單獨(dú)部署向量數(shù)據(jù)庫(kù)。
- 事務(wù)和安全:繼承 PostgreSQL 的事務(wù)、權(quán)限控制、備份與復(fù)制機(jī)制。
- 易于擴(kuò)展:可以直接使用 SQL 做 JOIN、過(guò)濾條件,實(shí)現(xiàn)混合檢索。
- 降低維護(hù)成本:只需要維護(hù)一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),減少運(yùn)維復(fù)雜度。
- 可視化和監(jiān)控:可以使用 PostgreSQL 現(xiàn)有工具進(jìn)行監(jiān)控和分析。
三. 安裝與啟用
- 確保 PostgreSQL 支持?jǐn)U展(通常 PostgreSQL 13+)
- 安裝 pgvector
啟用擴(kuò)展:
CREATE EXTENSION IF NOT EXISTS vector;
驗(yàn)證安裝:
SELECT * FROM pg_extension WHERE extname='vector';
成功后即可在表中創(chuàng)建向量列。

四. 基本數(shù)據(jù)結(jié)構(gòu)
- 向量列類(lèi)型:
vector或vector(n),其中n是向量維度。 - 示例表結(jié)構(gòu):
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
embedding VECTOR(3) -- 假設(shè)嵌入向量是 3 維
);
小貼士:向量列的維度必須固定,查詢和索引時(shí)保持一致。
五. 基本操作
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;

根據(jù)score的得分,就能查詢出相近的向量,值越小代表越相似,算法如下
公式

5.3 常用距離運(yùn)算符
| 操作符 | 相似度度量 | 說(shuō)明 | 推薦場(chǎng)景 | 值越小代表 |
|---|---|---|---|---|
<-> | 歐氏距離 (L2 Distance) | 計(jì)算兩個(gè)向量之間的幾何距離 | 圖像、音頻、地理數(shù)據(jù)檢索 | 越相似 |
<#> | 負(fù)內(nèi)積 (- Inner Product) | 取負(fù)號(hào)后的內(nèi)積,用于最大內(nèi)積搜索 | 推薦系統(tǒng)、模型打分 | 越相似 |
<=> | 余弦距離 (Cosine Distance) | 1 - 余弦相似度,對(duì)向量長(zhǎng)度不敏感 | 文本語(yǔ)義檢索、跨語(yǔ)言向量匹配 | 越相似 |
后面會(huì)出一篇關(guān)于這些運(yùn)算符計(jì)算使用的文章
5.4 其他操作
# 向現(xiàn)有表中添加向量列 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-python 或 psycopg2 處理向量:
import numpy as np
import psycopg2
from pgvector.psycopg2 import register_vector
# 連接數(shù)據(jù)庫(kù)
conn = psycopg2.connect(host='192.168.1.101', dbname='test-agent', user='postgres', password='123456', port=5433)
register_vector(conn) # 注冊(cè) vector 類(lèi)型
cur = conn.cursor()
# 插入示例向量
embedding = np.random.rand(3).astype('float32')
print(embedding)
cur.execute(
"INSERT INTO documents (embedding) VALUES (%s)",
(embedding,) # 注意這里的逗號(hào),確保是元組格式
)
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()
七. 小結(jié)
- pgvector 是 PostgreSQL 的向量擴(kuò)展,支持高維嵌入向量存儲(chǔ)與檢索。
- 提供精確與近似最近鄰查詢,并可與 SQL 完美結(jié)合。
- 基礎(chǔ)操作包括創(chuàng)建表、插入向量、查詢最近鄰以及選擇合適的距離運(yùn)算符。
到此這篇關(guān)于PostgreSQL向量檢索之pgvector入門(mén)實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)postgresql向量檢索pgvector內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫(kù)解決方案
ShardingSphere-Proxy?作為透明數(shù)據(jù)庫(kù)代理,用戶無(wú)需關(guān)心?Proxy?如何協(xié)調(diào)背后的數(shù)據(jù)庫(kù)。今天通過(guò)本文給大家介紹基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫(kù)解決方案,感興趣的朋友跟隨小編一起看看吧2021-12-12
PostgreSQL 打印日志信息所在的源文件和行數(shù)的實(shí)例
這篇文章主要介紹了PostgreSQL 打印日志信息所在的源文件和行數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
如何在PostgreSQL中查看有哪些用戶和用戶權(quán)限
對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),用戶以及權(quán)限管理非常重要,讓不用的用戶具有不同的權(quán)限集合,將會(huì)顯著的避免誤操作,這篇文章主要介紹了在PostgreSQL中查看有哪些用戶和用戶權(quán)限的相關(guān)資料,需要的朋友可以參考下2025-10-10
PostgreSQL中數(shù)據(jù)批量導(dǎo)入導(dǎo)出的錯(cuò)誤處理
在 PostgreSQL 中進(jìn)行數(shù)據(jù)的批量導(dǎo)入導(dǎo)出是常見(jiàn)的操作,但有時(shí)可能會(huì)遇到各種錯(cuò)誤,下面將詳細(xì)探討可能出現(xiàn)的錯(cuò)誤類(lèi)型、原因及相應(yīng)的解決方案,并提供具體的示例來(lái)幫助您更好地理解和處理這些問(wèn)題,需要的朋友可以參考下2024-07-07
PostgreSQL Public 模式的風(fēng)險(xiǎn)及安全遷移問(wèn)題小結(jié)
本文主要討論了PostgreSQL中public模式的問(wèn)題和解決方案,public模式默認(rèn)對(duì)所有用戶開(kāi)放訪問(wèn)權(quán)限,容易發(fā)生命名沖突,且難以維護(hù)和隔離,修改或刪除它可能導(dǎo)致擴(kuò)展無(wú)法正常工作,為解決這問(wèn)題,建議新建模式,將public模式下的所有業(yè)務(wù)對(duì)象遷移過(guò)去2024-10-10
PostgreSQL數(shù)據(jù)庫(kù)的基本查詢操作
這篇文章采用詳細(xì)的代碼示例為大家介紹了PostgreSQL數(shù)據(jù)庫(kù)的基本查詢操作使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
PostgreSQL標(biāo)準(zhǔn)建表語(yǔ)句分享
這篇文章主要介紹了PostgreSQL標(biāo)準(zhǔn)建表語(yǔ)句分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

