Search that understands what shoppers mean.
Keyword search matches strings. Semvex matches intent — compare BM25, dense-vector, and hybrid ranking on one query. Fully open source
Meet the three-path ranking stack for product search.
Keyword, semantic, and hybrid — each with a real engine behind it, shown side by side so the difference between matching strings and matching meaning is impossible to miss.
Keyword search that keeps you honest
BM25 over Elasticsearch (or Postgres full-text as fallback) — the strawman every semantic system needs to beat. Title, brand, category, and description fields indexed for a fair lexical baseline.
Try keyword searchElasticsearch BM25
Optional ES engine with tsvector fallback when ES is unreachable.
Honest strawman
Curated catalog makes keyword misses visible — gaming mousepad for “laptop” queries.
Semantic search that catches intent
bge-small-en-v1.5 embeddings stored in pgvector. Cosine similarity ranks by meaning — synonyms, paraphrases, and shopper intent that BM25 never sees.
Try semantic search384-d vectors
Pretrained bge-small — no fine-tuning, HF Inference API for query-time embed on VPS.
pgvector kNN
HNSW index for sub-ms vector lookup; hashing fallback when no model is installed.
Hybrid fusion you can tune live
Reciprocal Rank Fusion blends keyword and semantic rankings. The α slider in the search UI lets you weight keyword vs semantic live — and watch NDCG shift in real time.
Try hybrid rankingRRF + tunable α
Default fusion with an interactive slider — recruiters see the tradeoff, not just the result.
Usually wins
+34% NDCG@5 lift vs keyword alone on the labeled eval set.
We support your stack.
Postgres + pgvector for vectors, Elasticsearch for BM25, and HuggingFace for query embeddings — env-driven and fully Dockerized.
Explore the engineBuilt to ship
Production ready.
Everything a real product-search stack needs — reranking, diversity, natural-language filters, secured accounts, and a live eval overlay.
Explore the engineTunable α blending
Slide keyword ↔ semantic weighting live and watch the ranking shift in real time.
Learn moreCross-encoder rerank
Two-stage retrieval: a reranker refines the top candidates for precision.
Learn moreLive NDCG / Recall / MRR
Labeled-query metrics overlaid in the UI — the winning path is starred, not asserted.
Learn moreSecured accounts
Email verification, TOTP 2FA, backup codes, Google OAuth, and rate limiting.
Learn moreAdmin dashboard with real query telemetry
Click tracking, query logs, mode breakdowns, and top-query tables — the same data that powers the offline eval harness, visible in the admin UI.
View admin dashboardClick + query logs
Every search and click recorded for relevance feedback and analytics.
Mode breakdown
See which retrieval path wins per query — hybrid, semantic, or keyword.
Stream ESCI at scale into pgvector + ES
The Amazon ESCI products parquet streams via pyarrow in 50k-row batches — embed with bge-small, upsert pgvector, bulk-index Elasticsearch. Idempotent and resumable.
See benchmark resultsLow-memory stream
pyarrow record batches — 1M+ rows without loading the full parquet into RAM.
Dual index
Vectors in Postgres, BM25 docs in ES — one ingest command keeps both in sync.
Headline numbers from the eval harness
Offline scores on the curated electronics + shoes catalog with human relevance labels.
Questions, answered.
How the three retrieval paths work, what runs the engine, and how the numbers are measured.
What's the difference between keyword, semantic, and hybrid?
Keyword (BM25) matches literal terms. Semantic embeds the query and ranks by meaning in pgvector. Hybrid fuses both with Reciprocal Rank Fusion and a tunable α — usually the best of the three.
Do I need a GPU to run the semantic search?
No. Semvex uses bge-small-en-v1.5 (384-d) via the HuggingFace Inference API for query-time embeddings, with a hashing fallback when no model is configured. Catalog vectors are precomputed and cached.
Is Elasticsearch required?
It's optional. The keyword engine runs on Elasticsearch BM25 when available and transparently falls back to Postgres tsvector full-text search when ES is unreachable.
Can I ingest my own product catalog?
Yes. The streaming ingester reads the Amazon ESCI parquet in 50k-row batches via pyarrow — embed, upsert to pgvector, and bulk-index to ES in one idempotent, resumable command. Point it at your own data the same way.
How are the NDCG / Recall / MRR numbers computed?
From a labeled query set with human relevance judgments, scored by the offline eval harness. The same data powers the live metrics overlay in the search UI, so the winning path is measured, not asserted.
What secures the accounts?
Email verification, TOTP two-factor with backup codes, Google OAuth, and rate limiting — backed by Postgres on Neon.
