CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
tenant_id UUID NOT NULL,
embedding vector(1536)
);
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
text-embedding-ada-002. HNSW over IVFFlat — better recall, no training, grows with your dataset.tenant_id narrows the search before HNSW kicks in:
SELECT id, content,
1 - (embedding <=> $1) as similarity
FROM documents
WHERE tenant_id = $2
ORDER BY embedding <=> $1
LIMIT 10;
<=> operator is cosine distance. In your application code:
import { neon } from '@neondatabase/serverless';
const sql = neon(process.env.DATABASE_URL!);
const similar = await sql`
SELECT id, content,
1 - (embedding <=> ${embedding}) as similarity
FROM documents
WHERE tenant_id = ${tenantId}
ORDER BY embedding <=> ${embedding}
LIMIT 10
`;
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WHERE tenant_id = 'large-tenant-uuid';