Retail Product Search: A Practical Approach at Target
Darshan Sonagara, Qujiaheng Zhang, Ankit Singh, Alex Li
cs.IR, cs.LG
2026-09-26
Target runs Solr plus a fine-tuned e5-small dual encoder, merged by weighted interleaving; vs lexical-only, CTR +0.97%, conversion +0.98%, demand/visitor +1.10%.
Retail queries run from exact specs ("organic milk 1/2 gallon") to open browsing ("cocktail party supplies"). Lexical search is precise on brands and sizes and fails when shoppers use synonyms, typos, or natural language that the catalog never wrote. Dense retrieval fills that gap and then retrieves near-neighbors with the wrong attributes, such as pet food for a food query. BM25 scores and cosine similarities are not on the same scale, so adding them is not a merge strategy.
Walmart, Taobao, and JD have all shipped hybrid retrieval. This paper is Target's engineering record of three choices: how engagement logs become training labels, how the vector channel is filtered for precision, and how two largely disjoint lists are merged. The system serves web and app search at millions of queries per day.
Both channels run on every query. Lexical retrieval is Solr, with spelling, rewrites, and facets. The vector channel encodes the query with a dual encoder and searches product vectors in AlloyDB via ScaNN. The encoder is e5-small-v2 fine-tuned (33M parameters, 384-d). Product text concatenates title, brand, itemtype, and category, each prefixed with a marker token; fields are randomly dropped in training so the model cannot cling to one metadata column.
Positives come from a weekly blend of conversion, add-to-cart, and CTR, kept only when the score stays above a threshold across weeks. Weights are withheld. Negatives come from two mines: items with enough impressions and zero engagement, and frequent top-K near-misses that are not positives. The loss is a bidirectional improved contrastive objective that also pushes apart query–query and item–item pairs in the batch. The corpus is about 20 million query–product pairs, trained first on random negatives then on hard ones.
Precision control runs NER for gender, brand, and size, plus a query classifier for item type and category, and applies five filters before ranking. Merge compared reciprocal rank fusion with weighted interleaving. The two lists overlap little, so RRF's "appears in both" bonus is weak; interleaving draws the next unused item from a channel with probability equal to its weight, and won online. The embedding service is TorchServe on CPU, p99 under 50 ms, p75/p95 around 25–30 ms.
On a 5,000-query human benchmark with 200 candidates each, zero-shot NDCG is 0.7825 for e5-large-v2 and 0.7757 for e5-small-v2. The 0.0068 gap was not worth the latency, so the small model was fine-tuned.
On a separate engagement-labeled golden set (5,000 queries), growing data from 7M to 20M pairs lifts NDCG@5 from 0.8200 to 0.8661; hard negatives take it to 0.8794 and MRR to 0.9822. Precision filters raise vector-channel P@1 from 0.890 with no filters to 0.929 with NER plus behavior filters.
Four-week online A/B tests against lexical-only search, all p<0.05:
| Variant | CTR | order conversion | demand / visitor |
| Zero-shot e5 | −4.20% | −6.57% | −7.14% |
| Finetuned v1 + RRF | −0.85% | −1.20% | +0.49% |
| Finetuned v1 + interleaving | +0.40% | +0.74% | +1.11% |
| Finetuned v2 + interleaving | +0.97% | +0.98% | +1.10% |
Finetuned v2 cut zero-result searches by about half. Channel weights and filter thresholds are withheld.
Domain fine-tuning beat a bigger encoder. Zero-shot e5 lost clicks, carts, and conversions on live traffic; the same small model trained on engagement labels turned conversion positive. RRF hurt CTR and conversion when the lists barely overlapped; interleaving was the merge that shipped. A 33M model on CPU inside a 50 ms p99 budget is a copyable serving shape.
This is deployable incremental engineering, not a new retrieval paradigm. Personalization is still absent at retrieval time.
Only relative lifts are reported, no absolute CTR or conversion. Offline ranking is inside a 200-candidate pool, not full-catalog recall; the authors treat the online results as the check on that leap. Precision filters can wipe the vector candidate set, so empty pages remain. The same query still returns the same candidates for every shopper. Weights were chosen by a sequence of explore-then-commit A/B tests, with the multiple-testing risk that implies. The control is lexical search, not another production hybrid.