Late Interaction in OpenSearch

How Late Interaction models — ColBERT for text, ColPali for document images — are indexed, scored, and scaled inside OpenSearch. Native support landed in OpenSearch 3.3 (announced December 2025) via the lateInteractionScore scoring function, with a parallel Lucene-level path (LateInteractionField, Lucene 10.3+) feeding it. As in Elasticsearch, late interaction is positioned as a reranker over a fast single-vector first stage — see the parallel topic Late Interaction in Elasticsearch.


The Building Blocks

Multi-vector storage: object + float

Unlike Elastic’s dedicated rank_vectors field, OpenSearch stores token-level multi-vectors using a composite of the object and float field types — “storage and retrieval of token-level vector embeddings used in late interaction models.” Token vectors must share a consistent dimensionality, but documents may carry varying numbers of vectors.

lateInteractionScore (painless)

Scoring is a painless script function with the same MaxSim semantics as Elastic’s maxSimDotProduct: for each query vector, take the max similarity over all document vectors, then sum.

lateInteractionScore(params.query_vectors, 'my_vector', params._source, params.space_type)

Lucene path (LateInteractionField, 10.3+)

Since Lucene 10.3, LateInteractionField accepts float[][] multi-vector embeddings, encodes them as binary, and indexes them as BinaryDocValues. LateInteractionRescorer implements the default sum(max(vectorSimilarity)). An open k-NN proposal (issue #2934) tracks deeper Lucene-based rescoring.


The Pipeline

OpenSearch wires late interaction through two ML-inference processors:

ProcessorRole
ml-inference ingest processorAt ingest, generates both the single-vector (bi-encoder) embedding and the multi-vector late-interaction embedding
ml-inference search request processorRewrites the incoming query into a k-NN query plus a lateInteractionScore rescore

Two-Phase Retrieval

  1. Phase 1 — fast approximate k-NN over single-vector bi-encoder embeddings selects a small candidate set.
  2. Phase 2 — rerank those candidates with lateInteractionScore over the token-level multi-vectors.

The Cost

Storage requirements increase 10–100× versus single-vector retrieval — the same fundamental pressure late interaction creates everywhere. OpenSearch’s mitigation story is younger than Elastic’s: there is no built-in rank_vectors-style bit/average-vector toolkit yet; compression leans on the staged retrieve-then-rerank pattern and the underlying k-NN plugin (Faiss / nmslib / Lucene HNSW) for the cheap first stage.


OpenSearch vs Elasticsearch for Late Interaction

OpenSearch (3.3+)Elasticsearch (8.18+)
Multi-vector fieldobject + float compositerank_vectors (dedicated)
MaxSim scoringlateInteractionScore painless fnmaxSimDotProduct / maxSimInvHamming
Lucene primitiveLateInteractionField / LateInteractionRescorerrank_vectors codec
First-stage approxsingle-vector k-NNaverage vectors (+ BBQ)
Built-in compression(none yet)bit vectors, average vectors, Token Pooling
Two-stage mechanismml-inference search processorrescore retriever
Rolererankerreranker

Both converge on the same architecture; Elastic is further along on native multi-vector compression, OpenSearch has just reached parity on the core scoring primitive. See Elasticsearch vs OpenSearch for the broader engine comparison.


Where Late Interaction Fits

Bi-EncoderLate Interaction (ColBERT/ColPali)Cross-Encoder
Vectors compared1 vs 1many vs many (MaxSim)full transformer pass
StorageLowHigh (10–100×)None (stateless)
LatencyFastMediumSlow
Role in OpenSearchfirst-stage k-NNrerank top-krerank top-k

  • Late Interaction — the architecture (MaxSim over per-token/per-patch vectors)
  • ColBERT — text-domain late interaction
  • ColPali — visual late interaction (document page images)
  • HNSW — k-NN plugin index for first-stage candidates
  • Reranking — late interaction’s role in OpenSearch
  • Bi-Encoder · Cross-Encoder — the no/early-interaction endpoints

Source