# `pgvector` compatibility

> pgvecto.rs is natively compatible with pgvector at:

---

LLMS index: [llms.txt](/llms.txt)

---

`pgvecto.rs` is natively compatible with `pgvector` at:
* `CREATE TABLE` commands, e.g. `CREATE TABLE t (val vector(3))`
* `INSERT INTO` commands, e.g. `INSERT INTO t (val) VALUES ('[0.6,0.6,0.6]')`

`pgvecto.rs` can be configured to be compatible with `pgvector` at: 
* Index options, which allows you to create index by `USING hnsw (val vector_ip_ops)`
* Query options, which can be set by `SET ivfflat.probes = 10`

This feature is named `pgvector` compatibility. 
It can be enabled by `SET vectors.pgvector_compatibility = on`.

## Index Options & Query Options

For index `ivfflat` and `hnsw` only the following options are available.

* Default value for index options is **different from pgvecto.rs original**, which keeps the same as in `pgvector`.
* Default value for query options is the same as in `pgvecto.rs`.

Index options for `ivfflat`:

| Key   | Type    | Range            | Default | Description                            |
| ----- | ------- | ---------------- | ------- | -------------------------------------- |
| nlist | integer | `[1, 1_000_000]` | `100`  | Number of cluster units.               |

Query options for `ivfflat`:

| Option         | Type    | Range    nn      | Default | Description                               |
| -------------- | ------- | ---------------- | ------- | ----------------------------------------- |
| ivfflat.probes | integer | `[1, 1_000_000]` | `10`    | Number of lists to scan.                  |

> [!WARNING]
> Default value of `ivfflat.probes` is `10` instead of `1` from pgvector.


Index options for `hnsw`:

| Key             | Type    | Range        | Default | Description                            |
| --------------- | ------- | ------------ | ------- | -------------------------------------- |
| m               | integer | `[4, 128]`   | `16`    | Maximum degree of the node.            |
| ef_construction | integer | `[10, 2000]` | `64`    | Search scope in building.              |

Query options for `hnsw`:

| Option         | Type    | Range          | Default | Description                               |
| -------------- | ------- | -------------- | ------- | ----------------------------------------- |
| hnsw.ef_search | integer | `[1, 65535]`   | `100`   | Search scope of HNSW.                     |

> [!WARNING]
> Default value for `hnsw.ef_search` is `100` instead of `40` from pgvector.


<a id="Examples"></a>
## Examples

It's easy to enable pgvector compatibility and start a vector query.
```sql
DROP TABLE IF EXISTS t;
SET vectors.pgvector_compatibility=on;
SET hnsw.ef_search=40;
CREATE TABLE t (val vector(3));
INSERT INTO t (val) SELECT ARRAY[random(), random(), random()]::real[] FROM generate_series(1, 1000);
CREATE INDEX hnsw_cos_index ON t USING hnsw (val vector_cosine_ops);
SELECT COUNT(1) FROM (SELECT 1 FROM t ORDER BY val <-> '[0.5,0.5,0.5]' limit 100) t2;
DROP INDEX hnsw_cos_index;
```

Multiply types of indexes are accepted:
```sql
SET vectors.pgvector_compatibility=on;
SET hnsw.ef_search=40;
-- [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);
SET ivfflat.probes=1;
-- [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)
```

---

Backlinks:

- [Migration](/docs/vectors/admin/migration/)
- [Search Options](/docs/vectors/reference/search_options/)
