Skip to content

Pgvector compatibility

Pgvecto.rs is natively compatible with pgvector at:

  • Create table
  • Search vectors

Pgvecto.rs can be configured to be compatible with pgvector at:

  • Create vector indexes

This feature is called compatibility mode.

It can be enabled with SET vectors.pgvector_compatibility=on;.

Examples

It's easy to enable compatibility mode and start a vector search.

sql
DROP TABLE IF EXISTS t;
SET vectors.pgvector_compat=on;
CREATE TABLE t (val vector(3));
INSERT INTO t (val) SELECT ARRAY[random(), random(), random()]::real[] FROM generate_series(1, 1000);
CREATE INDEX hnsw_l2_index ON t USING hnsw (val vector_l2_ops);
SELECT COUNT(1) FROM (SELECT 1 FROM t ORDER BY val <-> '[0.5,0.5,0.5]' limit 100) t2;
DROP INDEX hnsw_l2_index;

Multiply types of indexes are accepted:

sql
SET vectors.pgvector_compat=on;
-- [hnsw + vector_l2_ops] index with default options
CREATE INDEX hnsw_l2_index ON t USING hnsw (val vector_l2_ops);
-- [hnsw + vector_cosine_ops] index with single ef_construction option
CREATE INDEX hnsw_cosine_index ON t USING hnsw (val vector_cosine_ops) WITH (ef_construction = 80);
-- anonymous [hnsw + vector_ip_ops] with all options
CREATE INDEX ON t USING hnsw (val vector_ip_ops) WITH (ef_construction = 80, m = 12);
-- [ivfflat + vector_l2_ops] index with default options
CREATE INDEX ivfflat_l2_index ON t USING ivfflat (val vector_l2_ops);
-- [ivfflat + vector_ip_ops] index with all options
CREATE INDEX ivfflat_ip_index ON t USING ivfflat (val vector_cosine_ops) WITH (nlist = 80);
-- anonymous [ivf + vector_ip_ops] with all options
CREATE INDEX ON t USING ivfflat (val vector_ip_ops) WITH (lists = 80)

Limitation

For compatibility, we strive to maintain a consistent user experience, but there are still some limitations in two aspects:

  • Some features of pgvector.rs are not available in `compatibility mode'.
  • Some features of pgvector are different in `compatibility mode

Inaccessible features of pgvecto.rs

When executing SQL statements in `compatibility mode', some features of pgvecto.rs are not accessible:

  • flat index
  • Quantization, including scalar quantization and product quantization
  • prefilter and vbase

And for index ivfflat and hnsw only the following options are available. Their default value is different from pgvecto.rs original, which keeps the same from pgvector.

Options for `ivfflat

KeyTypeDefaultDescription
listsinteger100Number of cluster units.

Options for hnsw.

keytypedefaultdescription
minteger16Maximum degree of the node.
ef_constructioninteger64Search extent in construction.

Difference from pgvector

Although in `compatibility mode', there are still differences from pgvector.

Known problems are not limited to:

  • bree index
  • Query Options ivfflat.probes need to be vectors.ivf_nprobe, and hnsw.ef_search need to be vectors.hnsw_ef_search
  • Create vector indexes is asynchronous at pgvecto.rs, instead of synchronous at pgvector
  • All other modules except index are not supported