Hybrid search, not one method alone
Contracts are full of exact terms — hotel names, clause numbers, dates — that pure semantic search blurs, while clients reword everything. Each query runs Postgres full-text search and pgvector similarity side by side, merged with reciprocal rank fusion. In a keyword-only eval run, just 40% of reworded questions found the right page in the top five; the production hybrid found all of them. If embeddings are unavailable, search degrades to keywords instead of failing.