Top
Best
New

Posted by jascha_eng 9 hours ago

Pg_vectorsearch: An index that is faster than pgvector's IVFFlat and HNSW(github.com)
177 points | 47 comments
devy 7 hours ago|
A couple preliminary findings if you are considering adopting this extension to replace your previous pgvector's HNSW indexing.

- pg_vectorsearch uses a quantized IVF index called PRISM. PRISM caps at 1968 dimensions for vectors. If your previous HNSW index has more dimensions than that, you're SOL (at least for now until they fix that).

- pg_vectorsearch requires Postgres version 18 or above. If you run PG versions below that you need to migrate your database first. Many legacy PG production environment are way dated on PG 14 or 15, migration is prohibitively high cost to just try this out.

- pg_vectorsearch shipped yesterday and it's obviously alpha. Hasn't been battle tested in production environments outside of Timescale's. Also since it's so new, it isn't on Azure's allowed-extension list or any other Hyperscale's managed PG instances' allowed extension list. It takes time to graduate from alpha and mature. So if you run managaed PG instances from hyperscaler's cloud, you're SOL (at least for now until this matures into those ecosystems) or you have to migrate to a PG 18 self-hosted.

Arch485 5 hours ago||
Re: Max dimensions: You can truncate your input vector specifically for the index, and then when querying, you can query the index via a truncated vector and perform an additional full-length comparison as well.

For example: (taken from a project I'm currently working on)

```

SELECT *

FROM report_embeddings a

INNER JOIN report_embeddings b

    ON (

        subvector(a.embedding, 1, 768)::vector(768) <-> 
subvector(b.embedding, 1, 768)::vector(768)

    ) < $1

    AND b.id != a.id
WHERE a.id = $2

    AND a.embedding <-> b.embedding < $1
```

In this example, I truncate the embedding to 768 dimensions for the index and the lookup, (see the INNER JOIN) but do an additional full vector comparison as well. (in the WHERE clause)

This performs a fast but less accurate lookup into the index, and then only does the non-indexed full vector check for the matched results.

sroussey 5 hours ago||
That’s only going to work on an MRL embedding.
curious_cat_163 7 hours ago|||
I have used pgvector on an Azure DB. It did a "reasonable" job. I am not an expert on HNSW vs PRISM but because it is all backward compatible, I am curious why they didn't just send a PR to the pgvector folks?

Like, I would love to learn more about the design process that led to a whole new thing. I am sure the decision was not taken lightly, but the README is very thin on the details for why anyone should go through the troubles above, at least in the making of it.

mfreed 7 hours ago|||
Fair question. When we built our first vector extension, pgvectorscale, we actually reached out to pgvector's author to see if they'd be interested in supporting additional index types (at the time, DiskANN-based), so we could contribute our work directly to pgvector. At the time, their preference seemed to be to focus on the existing index types rather than expand the project in that direction. We respected that decision and went ahead with a separate extension.

But one of the great things about open source and PostgreSQL's extension architecture is that these projects can coexist! pg_vectorsearch can work directly with pgvector's existing data types, so developers can use either index.

enordstr 7 hours ago||||
Main pg_vectorsearch contributor here. There are multiple reasons why simply “sending a PR” is more difficult than it sounds.

As a company, we want to move at a different pace and try things that a project like pgvector wouldn’t necessarily allow (and rightfully so). pg_vectorsearch is alpha-level software, while pgvector is stable. Releasing early is a way to make it available to the community sooner and getting feedback.

Then there are all kinds of technical reasons: different architectures, different implementation choices, etc. There's also the freedom to try new things and going in completely different directions.

surister 7 hours ago||||
"Just sending a PR" is not that easy
pushtocar 6 hours ago|||
[flagged]
vovavili 2 hours ago|||
Points 2 and 3 would probably apply to every interesting bleeding-edge Postgres extension out there.
ltononro 6 hours ago||
so basically you should use Qdrant anyway lmao :p
mfreed 2 hours ago||
[Tiger Data CTO here]

A lot of great questions, feedback, and already some PR contributions today about pg_vectorsearch. I've written a short technical deep dive into the architecture of its PRISM index to answer some, thought I'd share:

https://www.linkedin.com/pulse/inside-pgvectorsearch-archite...

EgregiousCube 8 hours ago||
I'm currently running VectorChord and I love it - with a fast backing disk, it's cut my postgres cost in half. Excited to see competition in low-RAM vector index tools. RAMageddon seems to be creating incentives to find more ways to take advantage of how fast modern nvme drives are!
enordstr 8 hours ago|
I am the main contributor of pg_vectorsearch. If you try both, let us know about your experience and how we can improve.
trnvll 1 hour ago||
Can’t wait to try this. Have a project where speed matters and still want to have a nice and simple DX with everything in postgres
Rapzid 9 hours ago||
Does it support filtering though?

Edit: post filtering only

I don't understand how people are efficiently implementing tenant/user/permission scopes with these indexes.

3abiton 8 hours ago||
Checks notes, one dayabase per client, per user, per project ... etc
qeternity 8 hours ago|||
Partitioning is the easy bit I think, and falls out naturally from Postgres.

But how are people doing recency biasing with vector databases?

All of our approaches are either expensive or super hacky.

enordstr 8 hours ago|||
Multi-column indexes for multi-tenant tables is planned for a future release.
esafak 8 hours ago||
LanceDB supports push down and list/array membership through DataFusion.
arunmu 5 hours ago||
Didn't these guys also write pgvectorscale which seems to be unmaintained now ? Why a new index instead of adding onto or improving pgvectorscale?
cevian 4 hours ago|
(pgvectorscale author here)

We address that directly in the blog post: https://www.tigerdata.com/blog/announcing-pg_vectorsearch-sc...

Summary: We weren't happy with the unpredictable recall performance of pgvectorscale (and couldn't find a way to fix that in the literature) and decided that moving away from graph-algorithms to partition-based ones was a better long-term approach.

ilumanty 7 hours ago||
It would be so awesome if SQLite supported anything along these lines.
vikrantrathore 7 hours ago||
You can check two projects on top of sqlite using paxos and implement reciprocal rank fusion (RRF) and distribution-based fusion score (DBSF) on top of sqlite with sqlite's FTS and sqlite-vec extensions.

Project zaxonlite: https://github.com/insanai/zaxonlite

Project sqlodin: https://github.com/insanai/sqlodin

Just you need to remember sqlite support single writer at a time so both needs to work with that limitation. PostgreSQL uses MVCC, so performance for concurrent writes from multiple clients might be better. Did not do benchmark against it so cannot say.

ethagnawl 7 hours ago|||
For what it's worth, DuckDB does. See: https://duckdb.org/docs/current/core_extensions/vss
veonik 6 hours ago||
There's a few, even an official extension called Vec1.
potomushto 4 hours ago||
Interesting, I see no mention of support for bit precision and hammer distance operator which supposed to be much faster and storage efficient
alexpadula 8 hours ago||
Dark side of the PRISM! The image on the repo 100% inspired by Dark Side of The Moon by Pink Floyd.
skim 3 hours ago|
SynthID reports it being generated by AI
swe_dima 8 hours ago|
Sadly if cloud providers don't offer it on managed postgres then not many people can use it...
jascha_eng 8 hours ago|
Well you can always move to tiger cloud if you want it managed :) And this is PostgreSQL licensed just like our pg_textsearch which has been adopted to Googles AlloyDB and microsofts HorizonDB already, so there is hope!
More comments...