Advancements in image search and nearest neighbor algorithms from 2021 to 2026
The picture above is the whole idea. Points are pictures, lines mean "these two look alike", and the travelling highlight is a search finding its answer without looking at almost anything. The rest of this is how that got fast, cheap and multilingual in five years.
TL;DR
In 2021 image search meant one embedding per picture and a graph index held in memory. In 2026 it means foundation-model embeddings, compressed to a fraction of their original size, searched by a graph that has compression built into it, living on object storage, with a vision-language model re-ranking the shortlist.
The single biggest change is not an algorithm. It is that the thing being optimised stopped being queries per second and became bytes per vector. Everything expensive about search at scale turned out to be storage, and once compression acquired error bounds you could prove, the whole stack reorganised around it.
What this post is
A synthesis of published research. Unlike most posts here, I did not run any of these benchmarks myself, so there are no numbers of mine in it. Everything quantified is attributed, and figures from a vendor describing its own product are labelled vendor-reported rather than presented as settled fact. The moving diagrams are illustrative geometry, generated from a fixed seed, and are labelled as such. Where a claim rests on something I could not verify in a full paper, I have left it out.
The one-line version
Searching images is two problems wearing one coat. First, turn a picture into numbers in a way that puts similar pictures near each other. Second, given a new set of numbers, find the nearest ones among a billion without comparing against all billion.
Between 2021 and 2026 both halves changed, and a third thing changed underneath them that almost nobody planned for: the price of keeping the numbers anywhere at all.
If you only remember one sentence: the field spent five years discovering that the expensive part was never the search, it was the storage, and then reorganising everything around that.
Five years, briefly
-
2021
What you embedCLIP makes text a query for images
Contrastive image-text pretraining puts pictures and sentences in one space, so you can search photos by describing them. It also creates the mismatch problem that takes until 2024 to name.
Radford et al., Learning Transferable Visual Models From Natural Language Supervision, ICML 2021How you search itSPANN puts billions of vectors on disk
A memory and disk hybrid index, showing that billion-scale search does not require holding everything in RAM.
Chen et al., SPANN, NeurIPS 2021 -
2022
What you embedMatryoshka embeddings become truncatable
Train so the most important information sits in the leading dimensions. Then you can cut the vector short and keep most of the quality.
Kusupati et al., Matryoshka Representation Learning, NeurIPS 2022 -
2023
What you embedDINOv2 wins image-to-image retrieval
Self-supervised features beat both earlier self-supervised and weakly supervised models at recognising a specific object again.
Oquab et al., DINOv2, TMLR 2024How you search itIndexes learn to accept updates
SPFresh introduces in-place incremental update, attacking the assumption that a vector index is built once and then frozen.
Xu et al., SPFresh, SOSP 2023 -
2024
How you search itRaBitQ gives compression a proof
Squeeze each dimension to a single bit with a provable error bound. Elasticsearch and Lucene ship it as BBQ.
Gao and Long, RaBitQ, SIGMOD 2024How you search itThe cross-modal mismatch gets named
Text queries sit somewhere else in the space than the images they search. RoarGraph builds the index around the queries instead of only the data.
Chen et al., RoarGraph, VLDB 2024What you embedColPali skips OCR entirely
Embed the page as an image, keep one vector per patch, and match query words against picture regions. Document search stops needing a text pipeline.
Faysse et al., ColPali, ICLR 2025 -
2025
What you embedILIAS shows the scale gap
1,000 objects hidden among 100 million distractors. Domain-tuned models collapse, and old-fashioned local-feature reranking still earns its place.
Kordopatis-Zilos et al., ILIAS, CVPR 2025How you search itCompression moves inside the graph
SymphonyQG stops treating quantization as a separate layer and folds it into graph traversal, dropping the rerank step entirely.
Gou et al., SymphonyQG, SIGMOD 2025What you embedDINOv3 widens the instance-retrieval lead
Large gains on hard domains: museum artworks and historical street photography, not just landmarks.
Siméoni et al., DINOv3, arXiv technical report, 2025 -
2026
How you search itThe benchmark confirms it: everyone quantizes
Across 22 implementations and 19 datasets, every top graph and clustering method uses quantization somewhere, and quantized HNSW beats full-precision HNSW.
Jaasaari et al., VIBE: Vector Index Benchmark for Embeddings, arXiv 2026
How image search actually works
A model reads a photo and produces a list of numbers. Not a caption, not tags: just a long list, typically a few hundred to a few thousand of them. That list is called an embedding, and the useful property is that pictures which look alike, or mean alike, produce lists that are numerically close together.
Treat each list as coordinates. Two numbers give you a point on a page; a thousand numbers give you a point in a thousand-dimensional space that you cannot picture but can absolutely do arithmetic in. Every photo in the library becomes a point. Searching is then embarrassingly simple to state: turn the query into a point too, and find the points nearest to it.
The trouble is the word "find". Checking the distance to every stored point is exact and hopeless: at a billion images it is a billion distance calculations for every single search. So instead you build a map in advance. Connect each point to a few of its nearest neighbours, and you get a graph you can walk. Start anywhere, look at your neighbours, step to whichever one is closer to the query, repeat until no neighbour is an improvement.
Check every vector
Walk the graph
That is the core trick, and the family of methods built on it, of which HNSW is the one you will meet most often, has dominated the field for the entire period. Watch the counters above and you can see why: roughly a dozen comparisons instead of all 120. At a billion points the gap is the difference between impossible and instant.
You also get the catch for free. Greedy walking can stop at a point that is closer than all its neighbours but is not the closest point overall. It gets the right answer most of the time, not every time. That is what "approximate" means, and it is why every paper in this field reports a recall number: the fraction of the time the search found what an exhaustive scan would have found. The entire discipline is a negotiation between recall, speed and size.
That negotiation has a knob, and it is worth turning yourself.
What you embed
In January 2021 you searched images with images. By March you could search them with sentences. CLIP trained a pair of models on hundreds of millions of image and caption pairs with one instruction: put a picture and its caption in the same place. The result was a shared space where "a dog on a skateboard" lands near photos of dogs on skateboards, with no tags, no labels and no training for that specific query.
That is the single most consequential thing in this whole story, because it turned image search into something ordinary people could use with words. It also quietly created a problem that took three years to name, which we will come back to.
The rest of the representation story is a split that has stayed remarkably stable. Two different jobs, two different winners:
Image in, images out
Find this exact object again
DINO family
Self-supervised features trained on images alone. Strongest by a wide margin on hard domains like artworks and historical photography, not just landmarks.
Siméoni et al., DINOv3, arXiv technical report, 2025Text in, images out
Find pictures matching this sentence
SigLIP / CLIP family
Language-aligned training puts captions and pictures in one space. Nothing trained on images alone has closed this gap.
Tschannen et al., SigLIP 2, arXiv 2025Three developments matter beyond that split, and the first is the cheapest lever anyone has found. Matryoshka embeddings (2022) train the important information into the leading numbers, so you can simply cut the list short.
Shading is illustrative: it shows where the training concentrates information, not a measured per-dimension contribution.
The second is ColPali (2024), which went the other way: instead of squeezing a document page into one vector, keep one for every patch of the image.
1,024 vectors
per document page
ColPali keeps one embedding per image patch instead of pooling the page into a single vector, which is why it can match a query word to a spot on the page.
Faysse et al., ColPali, ICLR 2025And third, a corrective. In 2025 the ILIAS benchmark hid 1,000 specific objects among 100 million unrelated photographs and found that models fine-tuned on one domain fall apart outside it, and that old-fashioned local feature matching, the pre-deep-learning technique everyone assumed was retired, still earns its place when the picture is cluttered. Big general embeddings did not make the careful second pass unnecessary. They just moved it later in the pipeline.
How you search it
HNSW was already the default in 2021 and is still the thing most systems ship. The diagram above showed a single graph, which is most of the idea but not all of it. The "hierarchical" part is a stack of graphs.
That structure has barely changed since 2018. What changed is everything around it.
Compression got a proof, then moved inside the graph
Storing a 1,536-number embedding as full-precision decimals costs about 6 kilobytes per image. Shrink each number and everything gets cheaper: less memory, less disk, and faster comparisons because you are moving fewer bytes. People had been doing this for years by feel. In 2024 RaBitQ showed how to squeeze each number down to a single bit with a mathematical bound on how wrong the result can be. A guarantee rather than a hope, which is what let it move from papers into products: Elasticsearch and Lucene ship it under the name BBQ.
Baseline.
Storage reduced to roughly 16% of the full-size vector.
Index size 4% of the 1536-dim float32 baseline.
Bar length is index cost relative to the full-size baseline. Source, a preprint rather than a refereed paper, and a team reporting on its own production system: Ling et al., Scaling Multilingual Semantic Search in Uber Eats Delivery, arXiv 2026, Table 2.
The follow-on was structural. If compression is that good, why keep it as a separate step? SymphonyQG (2025) folded it into the graph traversal itself and dropped the traditional "re-check the shortlist at full precision" pass entirely.
1.5x to 4.5x
more queries per second at 95% recall
SymphonyQG against the strongest prior baselines, by folding quantization into graph traversal and dropping the rerank pass.
Gou et al., SymphonyQG, SIGMOD 2025An independent 2026 benchmark across 22 implementations and 19 datasets settled the argument: every top-performing method now uses compression somewhere, and a compressed HNSW beats a full-precision HNSW outright. Storing your vectors uncompressed is no longer the safe conservative choice. It is just the expensive one.
Compression stopped being how you saved money and became how you went fast.
The question CLIP created
Here is the problem that took three years to name. Every graph index is built on an assumption nobody wrote down: that queries look like the data. You build the map out of your stored images, so the map is shaped for journeys that start where images live.
Every index was built assuming the question would look like the answer.
A text query does not start there. It is a sentence embedding, aimed at an image collection. The two are comparable by construction, but they are not co-located, and the images that genuinely answer a text query turn out to sit far apart from each other rather than in a tidy cluster.
RoarGraph (2024) diagnosed this and attacked it the obvious way once you see it: build the graph using the query distribution as a guide, not the stored vectors alone. It reports a substantial speedup over general-purpose indexes on cross-modal workloads.
The honest postscript is that the problem is better named than solved. The 2026 VIBE benchmark ran the specialists against the generalists and found that on text and text-to-image workloads the best general-purpose methods still won, Glass, NGT-QG and SymphonyQG among them, even though those same methods degrade sharply on out-of-distribution queries. The specialists did win on a different class of workload. So this is a live argument, not a closed one, and possibly more a story about how much engineering has gone into the mature implementations than about the underlying idea.
up to 3.56x
faster cross-modal search
RoarGraph, by building the graph around the query distribution rather than the stored vectors alone.
Chen et al., RoarGraph, VLDB 2024The problems that replaced raw speed
The clearest signal of the field growing up is what the 2023 Big-ANN competition chose to measure. Not "who is fastest". Four tracks: search with filters, because nobody searches an unfiltered catalogue; search over sparse vectors; search over a changing index, because real collections gain and lose items; and search with out-of-distribution queries, the text-against- images problem above.
Those are all boring production concerns, which is precisely the point. Filtering in particular went from an afterthought to a research area of its own, because "find similar shoes, in stock, under fifty pounds, ships to the UK" defeats a naive graph walk in a way that pure similarity never does.
Two more worth knowing. MUVERA (2024) found a way to compress a whole set of vectors, the ColPali-style representation, into a single vector whose comparisons approximate the expensive set comparison, with a proof attached. And LEANN (2026) went the other direction entirely: throw the stored embeddings away and recompute them on demand, which sounds absurd until you see the number.
90% lower latency
for multi-vector retrieval
MUVERA compresses a set of vectors into one, averaging 10% better recall than the prior system across BEIR. It did not beat PLAID on MS MARCO.
Dhulipala et al., MUVERA, arXiv 2024under 5%
of raw data size, for the whole index
LEANN recomputes embeddings on demand instead of storing them, keeping over 90% top-3 recall. Aimed at search on personal devices.
Wang et al., LEANN, MLSys 2026Where it lives
This is the part with no famous paper attached, and it may have decided more architectures than any algorithm in this post.
In 2021, serious vector search meant holding everything in memory, because that is where the speed was. Memory is the most expensive storage there is. Three things then lined up: solid-state drives got fast enough to be only a few times slower than memory while costing a fraction, and cloud object storage picked up the consistency guarantees that let you treat it as a real database rather than a filing cabinet.
The 2021 default.
Drop the memory tier.
The 2026 default.
Cold, untouched.
Vendor-reported, not independently reproduced: turbopuffer, "fast search on object storage". Treat the shape as the argument and the exact dollars as a claim.
The consequence shows up in what people build rather than what they publish. Search engines became stateless things sitting in front of object storage, with local disk used purely as a cache. Collections that were previously unaffordable to keep online became nearly free to leave sitting there, and workloads with many rarely-touched datasets, a per-customer index that gets opened once a week, went from the worst case to the ideal one. Amazon shipped a native vector layer on top of S3 in 2025, which is the clearest sign that the argument is over.
What you actually see
All of the above surfaced in one visible change: pointing your phone at something stopped returning a page of visually similar pictures and started answering questions about it.
The mechanism Google describes is worth understanding, because it explains why modern visual search feels different rather than just better. A photo is no longer one query. A model identifies the individual objects in the scene and how they relate to each other, then issues many searches at once, about the whole image and about each object in it, and composes the answers. Google calls it query fan-out, and by 2026 the visual version had reached the point where you can photograph an outfit and get every item in it looked up simultaneously rather than circling them one at a time.
One photo
- the jacket similar jackets, in stock
- the chair this chair, who makes it
- the lamp lamps in this style
- the rug rug, matching palette
One answer
So the retrieval step stopped being the product. It became one move inside a longer reasoning loop, which is also why the newest research direction is agents that decide what to search for, and re-run the search when the first answer is not good enough.
The six shifts that mattered
- 01
Language became the interface. CLIP made a sentence a valid query for a picture. It also created the mismatch problem that took until 2024 to name, and that is still being argued about.
- 02
Compression stopped being a compromise. RaBitQ gave it error bounds you can prove, which is what let it into production systems, and SymphonyQG then folded it into the search itself.
- 03
Boring problems became the frontier. Filters, updates and awkward queries replaced raw throughput as the thing worth publishing about.
- 04
Multi-vector went from too expensive to routine. ColPali proved keeping one vector per region was worth it. MUVERA made it affordable.
- 05
Storage moved from memory prices to object-storage prices. This changed what is buildable more than any single algorithm did.
- 06
Retrieval became a step, not an answer. A search result is now the input to a model that reasons about it, and often searches again.
A 2026 default stack
If you were building image search today, the uncontroversial choices, in order:
My recommendation, not a research finding
- 01 Encode
DINO for image queries, SigLIP for text. Both if you need both.
- 02 Truncate
Cut the vector short. Nearly free if the model was trained for it.
- 03 Quantize
Fewer bits per number. This is where the cost goes.
- 04 Index
A graph that knows it is compressed, not the two bolted together.
- 05 Store
Object storage with a local disk cache.
- 06 Rerank
Local features if cluttered, a vision-language model if the query was a question.
One thing that is not in the diagram because it depends on your traffic: if text-to-image is your main path, build the index with your query distribution in mind rather than from the stored vectors alone. It is the step most people skip, and the section above is why.
The GPU question is the one genuinely open choice. Building indexes on a GPU is dramatically faster, but the dataset has to fit in GPU memory, so the common production answer is to build on GPU and serve on CPU.
33x to 77x
throughput over CPU HNSW on a GPU
NVIDIA’s own figure for CAGRA at 90 to 95% recall. The catch: the dataset must fit in GPU memory, so production systems typically build on GPU and serve on CPU.
Vendor-reported
NVIDIA, Optimizing Vector Search with cuVSStill open
- Compressed graphs that accept fast updates. The layouts that make compressed search fast are the same layouts that make insertion painful.
- Filtering on compressed graphs. Papers optimise these two axes separately and they do not compose cleanly.
- Region-level retrieval. ColPali can point at a spot on a page, but the benchmarks still score whole pages.
- Out-of-distribution queries. Named in 2024, still not settled: purpose-built indexes lose to well-engineered general ones on exactly the text-to-image workload they were designed for.
- Better measurement. A 2026 paper argues recall is the wrong target, because it can drop a long way without the user noticing, and proposes measuring the quality of what you retrieved instead of its overlap with a perfect answer.
- Multi-vector indexes that fit ordinary databases. Right now they need specialist support.
Sources
Split by how much weight each deserves. "Peer-reviewed" here means I checked the venue record rather than assuming it from an arXiv link, and several papers moved into the preprint group when that check came back empty. A preprint is not a worse paper. It is an unrefereed one, and the quantization figures this post leans on hardest come from exactly there.
What you embed
Peer-reviewed, acceptance checked
How you search it
Peer-reviewed, acceptance checked
- Malkov and Yashunin, HNSW, TPAMI 2018
- Chen et al., SPANN, NeurIPS 2021
- Xu et al., SPFresh, SOSP 2023
- Gao and Long, RaBitQ, SIGMOD 2024
- Patel et al., ACORN, SIGMOD 2024
- Chen et al., RoarGraph, VLDB 2024
- Gao et al., Extended RaBitQ, SIGMOD 2025
- Gou et al., SymphonyQG, SIGMOD 2025
- Wang et al., LEANN, MLSys 2026
Preprints and technical reports
Preprint or technical report, not refereed
- Tschannen et al., SigLIP 2, arXiv 2025
- Simeoni et al., DINOv3, arXiv technical report, 2025
- Dhulipala et al., MUVERA, arXiv 2024
- Simhadri et al., Big-ANN NeurIPS 23 competition results, arXiv 2024
- Jaasaari et al., VIBE benchmark, arXiv 2026
- Ling et al., Scaling Multilingual Semantic Search in Uber Eats Delivery, arXiv 2026
Vendor and product sources
Vendor-reported, not independently reproduced