An animated diagram of a proximity graph. Around 90 points are scattered across the frame, each joined by lines to its 3 nearest neighbours. A query point appears at a random position and a highlight travels from an entry point along the lines, hopping to whichever connected point is closer to the query, until no neighbouring point is any closer. That final point is the search result. This is illustrative geometry, not measured data.

Research 29 August 2026 About 18 minutes AI-written

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.

2021
2026
One vector per image, from a single model
Foundation-model vectors, and one per region when the layout matters
Full-precision floats, or ad-hoc quantization by feel
Truncated, then quantized with provable error bounds
A graph, held entirely in memory
A graph with the compression built into its traversal
RAM, because that is where the speed was
Object storage, with local disk as a cache
Usually nothing
Local features, or a vision-language model that can answer questions
A summary of the sections below rather than a source in its own right; each row label links to the part of the post that does the citing. Read the right-hand column and you have the argument. The rest of this is why each row moved.

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

What you embed How you search it
  1. 2021

    What you embed

    CLIP 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 2021
    How you search it

    SPANN 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
  2. 2022

    What you embed

    Matryoshka 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
  3. 2023

    What you embed

    DINOv2 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 2024
    How you search it

    Indexes 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
  4. 2024

    How you search it

    RaBitQ 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 2024
    How you search it

    The 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 2024
    What you embed

    ColPali 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
  5. 2025

    What you embed

    ILIAS 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 2025
    How you search it

    Compression 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 2025
    What you embed

    DINOv3 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
  6. 2026

    How you search it

    The 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
Not a complete history. These are the moments where, reading back, something changed direction rather than just improved.

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.

A model reads a picture and emits a list of numbers. Treat the list as coordinates and every photo becomes a point in a space with hundreds of dimensions, which nobody can picture but everybody can do arithmetic in. Pictures that look alike land near each other. That is the whole trick, and every idea in this post is a way of making the last step, finding what is near, fast enough to be worth doing. Illustrative, not measured data.

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

The same 120 points and the same query, run two ways on one clock. In the first panel every point is compared to the query. In the second, the search starts anywhere and repeatedly steps to whichever connected point is closer, stopping when none of the neighbours improve. Watch the counters. Drag either panel to move the query. The ring turns red when the graph walk settles on the wrong point, which it will, and finding one yourself is the fastest way to understand the word "approximate". Illustrative geometry, not measured data.

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.

measuring…
Drag the slider, or focus it and use the arrow keys. Every point is measured live by running real searches over the seeded graph on screen and checking each answer against an exhaustive scan. Accuracy climbs fast, hits its ceiling, and then the work keeps growing for nothing: past the knee you are buying compute and receiving no better answers. Finding that knee for a specific corpus is a large part of what tuning a vector index actually is. Two dimensions are far kinder to graph search than the hundreds a real embedding has, so this toy reaches its ceiling at candidate counts a production index would consider tiny. The shape is the lesson; the numbers are not a benchmark for any real system.

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, 2025

Text 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 2025
At 100 million images, text-to-image performance for vision-language models turns out to be surprisingly close to their image-to-image performance. The split is a guide to which family to reach for, not a rule about what is possible. Kordopatis-Zilos et al., ILIAS, CVPR 2025.

Three 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.

1536
768
256
64

Shading is illustrative: it shows where the training concentrates information, not a measured per-dimension contribution.

An ordinary embedding is a bag of numbers with no order, so dropping any of them loses something unpredictable. Matryoshka training front-loads the vector instead, so the first 256 numbers are a usable embedding on their own. You truncate rather than re-encode, and one model serves every size. It is the cheapest lever in this entire post.

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.

ColPali keeps one embedding per image patch, 1,024 of them for a page, rather than averaging the page into a single vector. A query word is then matched against every patch and scored by its best match, so the system knows not just that the page is relevant but where on it the answer sits. That is what makes searching scanned documents work without an OCR pipeline in front of it, and it is the reason the storage cost of retrieval jumped, which is what MUVERA was later built to bring back down. Grid geometry is ColPali's; the scores are illustrative.

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 2025

And 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.

Where 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.

RAM cache + 3x SSD $1,600 / TB / month

The 2021 default.

3x replicated SSD $600 / TB / month

Drop the memory tier.

Object storage + SSD cache $70 / TB / month

The 2026 default.

Raw object storage $20 / TB / month

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.

Roughly 80x between the top and bottom of that chart. This is the change nobody wrote a paper about, and it decided more architectures than any of the algorithms did: once a vector could sit on object storage and still be searched in tens of milliseconds, keeping billions of them stopped being a budget question.

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

A photo stops being one query. The scene is broken into objects and the relationships between them, each object fires its own search in parallel, and the results are composed into a single reply. This is why the retrieval step stopped being the product: it became one move inside a longer loop.

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

  1. 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.

  2. 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.

  3. 03

    Boring problems became the frontier. Filters, updates and awkward queries replaced raw throughput as the thing worth publishing about.

  4. 04

    Multi-vector went from too expensive to routine. ColPali proved keeping one vector per region was worth it. MUVERA made it affordable.

  5. 05

    Storage moved from memory prices to object-storage prices. This changed what is buildable more than any single algorithm did.

  6. 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

  1. 01 Encode

    DINO for image queries, SigLIP for text. Both if you need both.

  2. 02 Truncate

    Cut the vector short. Nearly free if the model was trained for it.

  3. 03 Quantize

    Fewer bits per number. This is where the cost goes.

  4. 04 Index

    A graph that knows it is compressed, not the two bolted together.

  5. 05 Store

    Object storage with a local disk cache.

  6. 06 Rerank

    Local features if cluttered, a vision-language model if the query was a question.

Read left to right, then wrap. Every step here is something the post argued for, and the order matters: truncating before quantizing means you compress a smaller thing, and choosing the index after the compression is what SymphonyQG's whole result is about. The step most people skip is the last one.

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 cuVS

Still 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.