R&D advanced 2 min read May 8, 2026
Public Preview Sign in free for the full digest →

Instacart Cuts Zero-Result Searches 6% With Postgres

“Instacart says one Postgres stack cuts zero-result searches by 6%.”

Instacart Cuts Zero-Result Searches 6% With Postgres
1 Views
0 Likes
0 Bookmarks
Source · blog.bytebytego.com

“"iterative scans are more of a bandaid for filtering than a solution" — tacoooooooo on Hacker News (https://news.ycombinator.com/item?id=45798479)”

You know that feeling when your search stack keeps exact matches in one system, meaning-based matches in another system, and live inventory in a third path that your app glues together at the end. You pay for that design every time a price changes, an item goes out of stock, or a query needs both keyword precision and intent matching. You fetch too much, filter too late, and debug drift between systems that should agree but do not. If your catalog changes all day, your search architecture starts fighting your data instead of serving it.

system-designpostgrespgvectorsearchecommercearchitectureelasticsearch

Think of two store clerks who used to work at different counters: one clerk matches exact words, and the other guesses intent. Instacart first runs those clerks separately with Postgres for text search and FAISS for vector search, then merges the answers in the app, but later moves both jobs into Postgres with pgvector. That shift lets the database join live inventory, pricing, discounts, and ML features before it returns results, so you stop overfetching items that you throw away later. Instacart also routes queries to retailer shards, which keeps index size under control and keeps mutable catalog data close to the search path.

01
One datastore for keyword and semantic search — you stop syncing Elasticsearch, FAISS, and app-layer merge code.
02
Pre-filtering on live inventory — you cut sold-out matches before semantic search runs instead of discarding them later.
03
Normalized writes in Postgres — you avoid full document rewrites when price or availability changes, which matters in high-churn catalogs.
04
SQL joins to ranking data and ML features — you keep retrieval inputs near the catalog instead of pulling them across the network.
05
Retailer-routed shards — you keep vector indexes within the cited 50 to 100 million range per index instead of building one giant index.
06
Measured production outcome — you get a real reference point: Instacart reports 2x faster search, 10x lower write load, and a 6% drop in zero-result searches.
Who it’s for

If you run search on a catalog where price, stock, and ranking data change all day, this article speaks to you. You should read it if your team already runs Postgres and you are tired of merging search results outside the database. It is not for you if you have a greenfield app, a mostly read-only corpus, or a small team that would rather buy hosted search than tune filtered ANN in Postgres.

Worth exploring

Yes, you should study this if your data already lives in Postgres and your catalog changes constantly, because Instacart reports production gains that matter and the trade-offs are clear. You should not copy it blindly, because both the article and community threads say the fit breaks down when index size grows too far or when your team cannot handle planner-level tuning. Treat it as a production-proven pattern for a narrow class of search problems, not as a default answer for all hybrid search.

Developer playbook
Tech stack, code snippet, sentiment, alternatives.
PM playbook
Adoption angles, user fit, positioning.
CEO playbook
Traction signals, ROI, build vs buy.
Deep-dive insight
Full long-form analysis, no fluff.
Easy mode
Core idea, fast — when you need the gist.
Pro mode
Technical nuance, edge cases, tradeoffs.
Read the full digest
Go beyond the preview

Deep-dive insight, Easy and Pro modes, plus action playbooks — the full breakdown is one tap away.

Underrated tools. Unfiltered takes.

Read the full digest in the Snaplyze app for deep-dive insight, Easy and Pro modes, and the playbooks you can actually use.

Install Snaplyze →