Skip to content
vector

vector

pgvector : vector data type and ivfflat and hnsw access methods

Overview

ID Extension Package Version Category License Language
1800
vector
pgvector
0.8.4
RAG
PostgreSQL
C
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--s-d-r
No
Yes
No
Yes
yes
no
Relationships
Need By
documentdb
pgmnemo
vchord
vectorize
vectorscale
See Also
pg_bestmatch
pg_summarize
pg_tiktoken
pg4ml
pgml
pg_similarity
smlar
pg_search

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PGDG
0.8.4
18
17
16
15
14
pgvector -
RPM
PGDG
0.8.4
18
17
16
15
14
pgvector_$v -
DEB
PGDG
0.8.4
18
17
16
15
14
postgresql-$v-pgvector -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
el8.aarch64
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
el9.x86_64
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
el9.aarch64
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
el10.x86_64
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
el10.aarch64
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
PIGSTY 0.8.4
d12.x86_64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
d12.aarch64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
d13.x86_64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
d13.aarch64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
u22.x86_64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
u22.aarch64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
u24.x86_64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
u24.aarch64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
u26.x86_64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
u26.aarch64
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
PGDG 0.8.4
Package Version OS ORG SIZE File URL
pgvector_18 0.8.4 el8.x86_64 pigsty 115.1 KiB pgvector_18-0.8.4-1PIGSTY.el8.x86_64.rpm
pgvector_18 0.8.4 el8.x86_64 pgdg 109.3 KiB pgvector_18-0.8.4-1PGDG.rhel8.10.x86_64.rpm
pgvector_18 0.8.3 el8.x86_64 pgdg 108.2 KiB pgvector_18-0.8.3-1PGDG.rhel8.10.x86_64.rpm
pgvector_18 0.8.2 el8.x86_64 pgdg 107.3 KiB pgvector_18-0.8.2-1PGDG.rhel8.10.x86_64.rpm
pgvector_18 0.8.1 el8.x86_64 pgdg 106.9 KiB pgvector_18-0.8.1-1PGDG.rhel8.x86_64.rpm
pgvector_18 0.8.4 el8.aarch64 pigsty 106.7 KiB pgvector_18-0.8.4-1PIGSTY.el8.aarch64.rpm
pgvector_18 0.8.4 el8.aarch64 pgdg 98.8 KiB pgvector_18-0.8.4-1PGDG.rhel8.10.aarch64.rpm
pgvector_18 0.8.3 el8.aarch64 pgdg 97.9 KiB pgvector_18-0.8.3-1PGDG.rhel8.10.aarch64.rpm
pgvector_18 0.8.2 el8.aarch64 pgdg 97.4 KiB pgvector_18-0.8.2-1PGDG.rhel8.10.aarch64.rpm
pgvector_18 0.8.1 el8.aarch64 pgdg 96.7 KiB pgvector_18-0.8.1-1PGDG.rhel8.aarch64.rpm
pgvector_18 0.8.4 el9.x86_64 pigsty 108.2 KiB pgvector_18-0.8.4-1PIGSTY.el9.x86_64.rpm
pgvector_18 0.8.4 el9.x86_64 pgdg 109.6 KiB pgvector_18-0.8.4-1PGDG.rhel9.8.x86_64.rpm
pgvector_18 0.8.3 el9.x86_64 pgdg 108.9 KiB pgvector_18-0.8.3-1PGDG.rhel9.8.x86_64.rpm
pgvector_18 0.8.2 el9.x86_64 pgdg 108.7 KiB pgvector_18-0.8.2-1PGDG.rhel9.8.x86_64.rpm
pgvector_18 0.8.2 el9.x86_64 pgdg 108.7 KiB pgvector_18-0.8.2-1PGDG.rhel9.7.x86_64.rpm
pgvector_18 0.8.2 el9.x86_64 pgdg 108.8 KiB pgvector_18-0.8.2-1PGDG.rhel9.6.x86_64.rpm
pgvector_18 0.8.1 el9.x86_64 pgdg 108.5 KiB pgvector_18-0.8.1-1PGDG.rhel9.x86_64.rpm
pgvector_18 0.8.4 el9.aarch64 pigsty 98.0 KiB pgvector_18-0.8.4-1PIGSTY.el9.aarch64.rpm
pgvector_18 0.8.4 el9.aarch64 pgdg 95.3 KiB pgvector_18-0.8.4-1PGDG.rhel9.8.aarch64.rpm
pgvector_18 0.8.3 el9.aarch64 pgdg 94.8 KiB pgvector_18-0.8.3-1PGDG.rhel9.8.aarch64.rpm
pgvector_18 0.8.2 el9.aarch64 pgdg 94.7 KiB pgvector_18-0.8.2-1PGDG.rhel9.8.aarch64.rpm
pgvector_18 0.8.2 el9.aarch64 pgdg 94.8 KiB pgvector_18-0.8.2-1PGDG.rhel9.7.aarch64.rpm
pgvector_18 0.8.2 el9.aarch64 pgdg 94.9 KiB pgvector_18-0.8.2-1PGDG.rhel9.6.aarch64.rpm
pgvector_18 0.8.1 el9.aarch64 pgdg 94.2 KiB pgvector_18-0.8.1-1PGDG.rhel9.aarch64.rpm
pgvector_18 0.8.4 el10.x86_64 pigsty 109.2 KiB pgvector_18-0.8.4-1PIGSTY.el10.x86_64.rpm
pgvector_18 0.8.4 el10.x86_64 pgdg 105.9 KiB pgvector_18-0.8.4-1PGDG.rhel10.2.x86_64.rpm
pgvector_18 0.8.3 el10.x86_64 pgdg 105.0 KiB pgvector_18-0.8.3-1PGDG.rhel10.2.x86_64.rpm
pgvector_18 0.8.2 el10.x86_64 pgdg 105.1 KiB pgvector_18-0.8.2-1PGDG.rhel10.2.x86_64.rpm
pgvector_18 0.8.2 el10.x86_64 pgdg 105.1 KiB pgvector_18-0.8.2-1PGDG.rhel10.1.x86_64.rpm
pgvector_18 0.8.2 el10.x86_64 pgdg 105.7 KiB pgvector_18-0.8.2-1PGDG.rhel10.0.x86_64.rpm
pgvector_18 0.8.1 el10.x86_64 pgdg 104.9 KiB pgvector_18-0.8.1-1PGDG.rhel10.x86_64.rpm
pgvector_18 0.8.4 el10.aarch64 pigsty 100.3 KiB pgvector_18-0.8.4-1PIGSTY.el10.aarch64.rpm
pgvector_18 0.8.4 el10.aarch64 pgdg 97.7 KiB pgvector_18-0.8.4-1PGDG.rhel10.2.aarch64.rpm
pgvector_18 0.8.3 el10.aarch64 pgdg 96.9 KiB pgvector_18-0.8.3-1PGDG.rhel10.2.aarch64.rpm
pgvector_18 0.8.2 el10.aarch64 pgdg 96.9 KiB pgvector_18-0.8.2-1PGDG.rhel10.2.aarch64.rpm
pgvector_18 0.8.2 el10.aarch64 pgdg 96.9 KiB pgvector_18-0.8.2-1PGDG.rhel10.1.aarch64.rpm
pgvector_18 0.8.2 el10.aarch64 pgdg 96.9 KiB pgvector_18-0.8.2-1PGDG.rhel10.0.aarch64.rpm
pgvector_18 0.8.1 el10.aarch64 pgdg 96.8 KiB pgvector_18-0.8.1-1PGDG.rhel10.aarch64.rpm
postgresql-18-pgvector 0.8.4 d12.x86_64 pgdg 261.0 KiB postgresql-18-pgvector_0.8.4-1.pgdg12+1_amd64.deb
postgresql-18-pgvector 0.8.4 d12.x86_64 pigsty 254.5 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~bookworm_amd64.deb
postgresql-18-pgvector 0.8.3 d12.x86_64 pgdg 258.4 KiB postgresql-18-pgvector_0.8.3-1.pgdg12+1_amd64.deb
postgresql-18-pgvector 0.8.2 d12.x86_64 pgdg 256.3 KiB postgresql-18-pgvector_0.8.2-1.pgdg12+1_amd64.deb
postgresql-18-pgvector 0.8.4 d12.aarch64 pgdg 231.0 KiB postgresql-18-pgvector_0.8.4-1.pgdg12+1_arm64.deb
postgresql-18-pgvector 0.8.4 d12.aarch64 pigsty 229.2 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~bookworm_arm64.deb
postgresql-18-pgvector 0.8.3 d12.aarch64 pgdg 228.9 KiB postgresql-18-pgvector_0.8.3-1.pgdg12+1_arm64.deb
postgresql-18-pgvector 0.8.2 d12.aarch64 pgdg 226.9 KiB postgresql-18-pgvector_0.8.2-1.pgdg12+1_arm64.deb
postgresql-18-pgvector 0.8.4 d13.x86_64 pgdg 261.9 KiB postgresql-18-pgvector_0.8.4-1.pgdg13+1_amd64.deb
postgresql-18-pgvector 0.8.4 d13.x86_64 pigsty 254.8 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~trixie_amd64.deb
postgresql-18-pgvector 0.8.3 d13.x86_64 pgdg 259.3 KiB postgresql-18-pgvector_0.8.3-1.pgdg13+1_amd64.deb
postgresql-18-pgvector 0.8.2 d13.x86_64 pgdg 257.1 KiB postgresql-18-pgvector_0.8.2-1.pgdg13+1_amd64.deb
postgresql-18-pgvector 0.8.4 d13.aarch64 pgdg 232.3 KiB postgresql-18-pgvector_0.8.4-1.pgdg13+1_arm64.deb
postgresql-18-pgvector 0.8.4 d13.aarch64 pigsty 230.3 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~trixie_arm64.deb
postgresql-18-pgvector 0.8.3 d13.aarch64 pgdg 229.9 KiB postgresql-18-pgvector_0.8.3-1.pgdg13+1_arm64.deb
postgresql-18-pgvector 0.8.2 d13.aarch64 pgdg 228.3 KiB postgresql-18-pgvector_0.8.2-1.pgdg13+1_arm64.deb
postgresql-18-pgvector 0.8.4 u22.x86_64 pgdg 264.0 KiB postgresql-18-pgvector_0.8.4-1.pgdg22.04+1_amd64.deb
postgresql-18-pgvector 0.8.4 u22.x86_64 pigsty 272.5 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~jammy_amd64.deb
postgresql-18-pgvector 0.8.3 u22.x86_64 pgdg 262.0 KiB postgresql-18-pgvector_0.8.3-1.pgdg22.04+1_amd64.deb
postgresql-18-pgvector 0.8.2 u22.x86_64 pgdg 259.5 KiB postgresql-18-pgvector_0.8.2-1.pgdg22.04+1_amd64.deb
postgresql-18-pgvector 0.8.4 u22.aarch64 pgdg 231.7 KiB postgresql-18-pgvector_0.8.4-1.pgdg22.04+1_arm64.deb
postgresql-18-pgvector 0.8.4 u22.aarch64 pigsty 246.4 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~jammy_arm64.deb
postgresql-18-pgvector 0.8.3 u22.aarch64 pgdg 230.0 KiB postgresql-18-pgvector_0.8.3-1.pgdg22.04+1_arm64.deb
postgresql-18-pgvector 0.8.2 u22.aarch64 pgdg 227.7 KiB postgresql-18-pgvector_0.8.2-1.pgdg22.04+1_arm64.deb
postgresql-18-pgvector 0.8.4 u24.x86_64 pgdg 257.7 KiB postgresql-18-pgvector_0.8.4-1.pgdg24.04+1_amd64.deb
postgresql-18-pgvector 0.8.4 u24.x86_64 pigsty 261.9 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~noble_amd64.deb
postgresql-18-pgvector 0.8.3 u24.x86_64 pgdg 255.2 KiB postgresql-18-pgvector_0.8.3-1.pgdg24.04+1_amd64.deb
postgresql-18-pgvector 0.8.2 u24.x86_64 pgdg 252.9 KiB postgresql-18-pgvector_0.8.2-1.pgdg24.04+1_amd64.deb
postgresql-18-pgvector 0.8.4 u24.aarch64 pgdg 227.6 KiB postgresql-18-pgvector_0.8.4-1.pgdg24.04+1_arm64.deb
postgresql-18-pgvector 0.8.4 u24.aarch64 pigsty 239.8 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~noble_arm64.deb
postgresql-18-pgvector 0.8.3 u24.aarch64 pgdg 225.4 KiB postgresql-18-pgvector_0.8.3-1.pgdg24.04+1_arm64.deb
postgresql-18-pgvector 0.8.2 u24.aarch64 pgdg 223.7 KiB postgresql-18-pgvector_0.8.2-1.pgdg24.04+1_arm64.deb
postgresql-18-pgvector 0.8.4 u26.x86_64 pgdg 255.9 KiB postgresql-18-pgvector_0.8.4-1.pgdg26.04+1_amd64.deb
postgresql-18-pgvector 0.8.4 u26.x86_64 pigsty 261.2 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~resolute_amd64.deb
postgresql-18-pgvector 0.8.3 u26.x86_64 pgdg 253.6 KiB postgresql-18-pgvector_0.8.3-1.pgdg26.04+1_amd64.deb
postgresql-18-pgvector 0.8.2 u26.x86_64 pgdg 251.4 KiB postgresql-18-pgvector_0.8.2-1.pgdg26.04+1_amd64.deb
postgresql-18-pgvector 0.8.4 u26.aarch64 pgdg 226.6 KiB postgresql-18-pgvector_0.8.4-1.pgdg26.04+1_arm64.deb
postgresql-18-pgvector 0.8.4 u26.aarch64 pigsty 238.8 KiB postgresql-18-pgvector_0.8.4-1PIGSTY~resolute_arm64.deb
postgresql-18-pgvector 0.8.3 u26.aarch64 pgdg 224.4 KiB postgresql-18-pgvector_0.8.3-1.pgdg26.04+1_arm64.deb
postgresql-18-pgvector 0.8.2 u26.aarch64 pgdg 222.7 KiB postgresql-18-pgvector_0.8.2-1.pgdg26.04+1_arm64.deb

Source

pig build pkg pgvector;		# build rpm

Install

Make sure PGDG repo available:

pig repo add pgdg -u    # add pgdg repo and update cache

Install this extension with pig:

pig install pgvector;		# install via package name, for the active PG version
pig install vector;		# install by extension name, for the current active PG version

pig install vector -v 18;   # install for PG 18
pig install vector -v 17;   # install for PG 17
pig install vector -v 16;   # install for PG 16
pig install vector -v 15;   # install for PG 15
pig install vector -v 14;   # install for PG 14

Create this extension with:

CREATE EXTENSION vector;

Usage

Sources:

pgvector provides vector similarity search inside PostgreSQL. The extension name is vector, while Pigsty packages it as pgvector. It supports exact search, approximate nearest-neighbor search with HNSW and IVFFlat indexes, and multiple vector representations for dense, half-precision, binary, and sparse embeddings.

v0.8.4 is a maintenance release after the 0.8.x HNSW/vacuum fixes. Use it instead of older 0.8.x builds when maintaining HNSW indexes under write-heavy workloads.

Create and Query Vectors

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE items (
  id bigserial PRIMARY KEY,
  embedding vector(3)
);

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

SELECT *
FROM items
ORDER BY embedding <-> '[3,1,2]'
LIMIT 5;

Common distance operators:

  • <-> for L2 distance
  • <#> for negative inner product
  • <=> for cosine distance
  • <+> for L1 distance
  • <~> for Hamming distance on binary vectors
  • <%> for Jaccard distance on binary vectors

Because PostgreSQL indexes scan in ascending order, <#> returns the negative inner product; multiply by -1 when displaying the actual inner product.

Vector Types

CREATE TABLE embeddings (
  id bigserial PRIMARY KEY,
  dense      vector(768),
  half_dense halfvec(768),
  binary_sig bit(1024),
  sparse     sparsevec(100000)
);

vector is the standard single-precision type. Use halfvec to reduce storage and memory pressure, bit for binary signatures, and sparsevec for high-dimensional sparse vectors.

Aggregates such as avg() and sum() can be used with vector columns:

SELECT avg(embedding) FROM items;

HNSW Indexes

HNSW gives strong speed/recall tradeoffs and does not require a training step.

CREATE INDEX items_embedding_hnsw
ON items USING hnsw (embedding vector_l2_ops);

SET hnsw.ef_search = 100;

SELECT *
FROM items
ORDER BY embedding <-> '[3,1,2]'
LIMIT 10;

Choose the operator class that matches the distance:

CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);
CREATE INDEX ON items USING hnsw (embedding vector_l1_ops);
CREATE INDEX ON embeddings USING hnsw (half_dense halfvec_l2_ops);
CREATE INDEX ON embeddings USING hnsw (sparse sparsevec_l2_ops);
CREATE INDEX ON embeddings USING hnsw (binary_sig bit_hamming_ops);

Useful tuning settings include hnsw.ef_search, hnsw.iterative_scan, hnsw.max_scan_tuples, and hnsw.scan_mem_multiplier.

IVFFlat Indexes

IVFFlat requires representative data before index creation because it trains cluster lists at build time.

CREATE INDEX items_embedding_ivfflat
ON items USING ivfflat (embedding vector_l2_ops)
WITH (lists = 100);

SET ivfflat.probes = 10;

SELECT *
FROM items
ORDER BY embedding <-> '[3,1,2]'
LIMIT 10;

Increase lists for larger tables and increase ivfflat.probes for higher recall. For filtered queries, test whether an exact btree filter, a partial vector index, or partitioning gives better plans.

Filtering and Hybrid Search

Normal PostgreSQL filters can be combined with vector ordering:

CREATE INDEX ON items (tenant_id);

SELECT *
FROM items
WHERE tenant_id = 42
ORDER BY embedding <=> '[0.1,0.2,0.3]'
LIMIT 20;

For hybrid search, combine pgvector with PostgreSQL full text search, trigram search, or an external ranking expression:

SELECT id,
       ts_rank_cd(text_tsv, plainto_tsquery('database')) AS text_score,
       1 - (embedding <=> '[0.1,0.2,0.3]') AS vector_score
FROM docs
WHERE text_tsv @@ plainto_tsquery('database')
ORDER BY vector_score DESC
LIMIT 20;

Maintenance

VACUUM items;
REINDEX INDEX CONCURRENTLY items_embedding_hnsw;
ANALYZE items;

HNSW indexes can be large and expensive to build. Use maintenance_work_mem for builds, monitor build notices, and schedule REINDEX when index bloat or recall drift matters.

Caveats

  • Pigsty local metadata may lag this upstream version; this stub tracks upstream pgvector 0.8.4 while the local package row may still show an older package version until the package catalog is refreshed.
  • Use the operator class that matches the query operator. A cosine index will not accelerate an L2 ORDER BY.
  • Approximate indexes trade exact recall for speed. Validate recall with representative data and query filters.
  • Build IVFFlat after loading data. If data distribution changes substantially, rebuild the index.
  • Keep pgvector updated when using HNSW with heavy writes and vacuum activity; v0.8.x includes important HNSW maintenance fixes.
Last updated on