HNSW, for your size. Reasons:
- IVFFlat builds its clusters from the data present at index time. Built on an early or empty table, the clusters are poor and recall drops, which is the "missing matches" you see. You'd have to rebuild it as data changes.
- HNSW has better recall at the same speed and doesn't need rebuilding.
create index on chunks using hnsw (embedding vector_cosine_ops);Match the operator class to the operator you query with (<=> is cosine). Building it on 50k rows needs some maintenance_work_mem; on a small compute it can take a few minutes, run it outside peak hours.