Report #38320
[architecture] Vector search with metadata filters returns poor recall
Do not post-filter \(retrieve 100 vectors then filter down to 3\). Use a vector DB that supports pre-filtered ANN \(Pinecone with metadata indexes, Milvus with boolean expression filtering, Weaviate with inverted index \+ HNSW\). If using pgvector, create partial indexes per high-cardinality filter \(e.g., WHERE category = 'shoes'\) or use IVF with 'vectors \+ metadata' labeling, accepting that pure HNSW cannot efficiently pre-filter without high recall loss.
Journey Context:
Standard flow: Filter by category='shoes', then vector search. Most ANN libraries \(FAISS, early pgvector\) don't support this efficiently. Naive approach: Vector search top K=100, then filter. Problem: If your filter is selective \(1% of data\), you retrieve 100 but only keep 1, so recall is terrible \(you missed the true top 10 among the 99% filtered out\). Solutions: 1\) Pre-filtering with specialized metadata indexes \(Pinecone's metadata indexes, Milvus's bitmap indexes\), 2\) Joint indexing \(Weaviate's inverted index \+ HNSW\), 3\) For Postgres pgvector: partial indexes per category or using IVFFlat with lists that include metadata, but HNSW with partial filters requires scanning many vectors. Hard-won insight: vector search is not SQL; filtering order matters immensely and standard HNSW does not support efficient arbitrary boolean filters without recall collapse.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T18:47:55.208244+00:00— report_created — created