Skip to main content
About

About The Met Search Lab

Compare ways to search artworks in Elasticsearch using different embeddings and hybrid search strategies over a diverse Met 10k-object Open Access dataset.

About This Guide

LLMs helped build The Met Search Lab, including this guide, which draws on The Met's production code to explain key architectural decisions and implementation details for others to compare and adapt. LLMs will also be used periodically to help update the project as The Met's practices evolve. Treat it as technical guidance, not a universal recipe: the models, thresholds, infrastructure, and latency observations reflect The Met's needs and should be tested against each institution's collection and users.

Download Technical Guide For Agents (.md)

Overview

Each search variant can use keyword search, semantic search, or a hybrid of both.

Keyword

Keyword search over object catalog metadata. Use it when you know the words likely appear in the record and/or want interpretable results.

Semantic

Looks for artworks that are visually or conceptually similar to the meaning of your query. Use it for visual or descriptive queries or when exact words may not appear.

Hybrid

Combines keyword and semantic evidence so literal matches and broader recall work together. Use it when you want keyword evidence to anchor results while semantic search broadens recall.

From collection object to search result

Elasticsearch stores the Met object record, generated text such as visual descriptions, and embeddings derived from generated visual descriptions or images. The pipeline first prepares that evidence for the index, then combines it at search time to produce ranked results and navigable filter counts.

1 · Build and index collection evidence

Run when collection evidence is prepared.

Inputs

Collection record + image

A museum database or API supplies catalog metadata and an object image.

Prepare

Complementary evidence

Catalog: preserve the museum metadata as literal evidence.
Generated: image + selected metadata → VLM + prompt → visual description.
Direct image: carry the image forward for multimodal embedding.

Represent

Embedding models

Text model: visual description → text vector.
Multimodal model: image alone, or image + text or metadata → multimodal vector.

Catalog and generated text also remain searchable without embedding.

Index

Elasticsearch object document

One document stores catalog fields, generated searchable text, and multiple named vector fields.

Human editorial feedback loop

Human editors verify generated visual descriptions, identify recurring errors and omissions, and use those findings to refine the prompt before affected descriptions are generated again.

review → revise prompt → regenerate ↺

2 · Search and navigate the collection

Run for each visitor query.

Request

User query + filters

The same query text feeds literal and semantic retrieval, using the selected embedding strategy and filters.

Retrieve

Parallel evidence

Keyword: BM25 over catalog and optional generated text.
Semantic: query embedding compared with the selected vector field.

Rank

Execute + fuse

Keyword uses BM25. Semantic and Hybrid use exact script score; Hybrid combines saturated BM25 with thresholded semantic similarity.

Respond

Results + navigation

Ranked hits flow through the post-filter; disjunctive aggregations populate filter counts for collection navigation and comparison.
The upper lane happens while the collection is prepared and indexed, including an editorial feedback loop before generated descriptions become search evidence; the lower lane happens for each search. Ranking and aggregations share one script-score query context, so the returned hits and disjunctive counts describe the same threshold-defined universe.

Replicate The Met Approach

The live lab keeps The Met's script-score execution and 75 / 25 hybrid weights, but its selectable evidence is intentionally narrower. A Lab default badge marks the active Medium Visual Description recipe; changing one of its settings removes the badge.

1. Prepare complementary evidence

Keep concise catalog metadata as the primary literal signal. Generate an objective visual description for each artwork image, then embed that description as the semantic signal. The production pipeline currently uses Agentic Vision v4 visual descriptions and a 768-dimensional Gemini text embedding. This public lab instead defaults to the Medium field from its reproducible visual-description generator. V4 remains documented as the historical production-aligned baseline used to calibrate the completed study, but it is not an active search option or field in the current lab index.

Use the same embedding model, dimensions, normalization, and task conventions for indexed documents and live queries. Store the model and source-text version with each vector so a reindex cannot silently mix incompatible embeddings.

2. Map the vector field

Set index: false because script score reads stored vector values directly and does not need an HNSW graph. The lab indexer also excludes embeddings from _source to avoid retaining and returning large arrays there; scripts can still access the vector values.

{
  "mappings": {
    "_source": {
      "excludes": ["embeddings.*"]
    },
    "properties": {
      "embeddings": {
        "properties": {
          "agentic_vision": {
            "type": "dense_vector",
            "dims": 768,
            "index": false
          }
        }
      }
    }
  }
}

3. Build a complete match universe

The lexical clause saturates BM25 with score / (score + 8). The vector clause rejects documents below the similarity threshold, rescales the remaining cosine range to 0–1, and applies its weight. A bool.should union means a document can enter through either literal or semantic evidence.

bounded contribution1.0 ceiling — never reached_score 8 → 0.5 · half-saturation k = 8081624324000.51raw BM25 _scorekeyword clause = saturated score × 0.75
BM25 saturation with k = 8. Raw BM25 scores are unbounded, so one strong field match could otherwise drown out the semantic clause. score / (score + 8) maps any raw score into 0–1: a score of 8 lands at exactly 0.5, and further increases approach 1.0 with diminishing effect. The bounded value is then multiplied by the keyword weight (0.75).
{
  "query": {
    "bool": {
      "should": [
        {
          "script_score": {
            "query": { "multi_match": { "query": "<query>", "fields": ["title^4", "artist^3", "medium^1.5"] } },
            "script": {
              "source": "(_score / (_score + params.k)) * params.weight",
              "params": { "k": 8, "weight": 0.75 }
            }
          }
        },
        {
          "script_score": {
            "query": { "bool": { "filter": [{ "exists": { "field": "embeddings.agentic_vision" } }] } },
            "script": {
              "source": "double c = cosineSimilarity(params.vector, 'embeddings.agentic_vision'); if (c < params.threshold) return 0; return ((c - params.threshold) / (1 - params.threshold)) * params.weight;",
              "params": { "vector": "<query vector>", "threshold": 0.65, "weight": 0.25 }
            },
            "min_score": 0.000001
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

Elasticsearch documents the per-match scoring and linear vector scan behavior in its script-score query reference.

Put collection-wide hard constraints—rights, publication state, date bounds, or mandatory AND filters—inside both scoring clauses. Keep ordinary navigational facet selections out of the base query so aggregations can still calculate alternatives.

4. Add disjunctive facets

Elasticsearch calculates the scored query first, aggregations second, and post_filter last. Apply every selected facet to returned hits in the post-filter. For each facet aggregation, apply all selected facets except that facet itself. This is AND across facets and, in a multi-select interface, normally OR within one facet.

1 · Scored query — the match universehard constraints only, no facet selections2 · Aggregations → facet countsrun on the complete match setDepartment counts apply ClassificationClassification counts apply Departmenteach facet skips its own selection3 · post_filter → hitsapplies every selected facetruns after counts are computedhits narrow — counts do not moveFilter dropdown countsdisjunctive — alternatives stay visibleResult listonly objects matching every selection
One request, two outputs. Aggregations and post_filter both start from the same scored match universe, but aggregations run first: each facet count applies the other selected facets and skips its own, so the Department dropdown keeps showing alternatives even while a Department is selected. The post filter then narrows only the visible hits, without changing any counts. Example selections: Department = European Paintings, Classification = Paintings.
{
  "aggs": {
    "department": {
      "filter": {
        "bool": {
          "filter": [
            { "term": { "classification.keyword": "Paintings" } },
            { "term": { "isHighlight": true } }
          ]
        }
      },
      "aggs": {
        "values": {
          "terms": {
            "field": "department.keyword",
            "size": 50,
            "show_term_doc_count_error": true
          }
        }
      }
    }
  },
  "post_filter": {
    "bool": {
      "filter": [
        { "term": { "department.keyword": "European Paintings" } },
        { "term": { "classification.keyword": "Paintings" } },
        { "term": { "isHighlight": true } }
      ]
    }
  }
}

Repeat that filtered aggregation for every facet. Preserve selected values with an explicit filter bucket when they may fall outside the top terms. In a multi-shard index, inspect doc_count_error_upper_bound; script score gives a complete query match universe, but a distributed terms aggregation can still report bounded bucket-count error. The lab index uses one shard, so its local terms counts report an error bound of zero. See Elasticsearch’s post-filter guide and terms aggregation count-error guidance.

5. Benchmark before production

Vector functions in script score linearly scan the documents admitted by each clause. Disjunctive facets deliberately keep navigational filters out of the scored query, so they can cost more than a query that pushes every selected facet into the vector filter. Measure empty, broad, and narrow queries against the full collection, with production shard counts and concurrent traffic.

Start with similarity-threshold and relevance evaluation, then measure latency. If your institution prototypes kNN separately, compare it only after the exact script-score baseline is stable: its bounded candidate window is not a substitute for complete collection-navigation counts.

Keyword Search

Keyword search is lexical search: it ranks documents by matching the words in your query against indexed text fields. Elasticsearch scores those matches with BM25, a relevance formula that rewards query words appearing in a document while accounting for field length and term frequency.

Multi-word queries use a minimum-match rule: two terms must both match, three to five terms may miss one term, and longer queries must match 75% of terms. Adjacent phrase matches still get a smaller boost, so phrases like pink textile are treated as phrase intent without overwhelming the term match.

Optional fuzzy keyword matching is conservative: one-to-five-character terms get no edits, six-to-ten get one edit, and longer terms get two edits. That keeps short-name searches like monet from drifting into broad typo expansions.

Queries that look like accession numbers, such as 1979.486, are boosted heavily for exact accession matches and can also match by prefix.

Keyword Fields And Weights

The list below is sorted by effective boost, not by source-code declaration order.

  1. title^4
  2. artistDisplayName^3
  3. objectName^2.5
  4. constituents.name^2
  5. classification^2
  6. medium^1.5
  7. tags.term^1.5
  8. culture^1.25
  9. period, dynasty, reign, artistNationality, and portfolio
  10. department^0.75, country^0.75
  11. region^0.5, city^0.5
  12. creditLine^0.25

The ^ number is a boost. Higher numbers make a match in that field count more. For example, a title match matters much more than a credit-line match.

Each metadata field searches both a stemmed English-analyzed version, such as title.en, and a lower-weight raw text version, such as title.

Fuzzy keyword matching is on by default for minor spelling mistakes. It uses a conservative prefix and edit-distance window so a query like qumrat can recover a close spelling such as qumran without drifting into broader neighbors like quart. Turn it off when you want stricter keyword comparisons.

Visual descriptions

medium_description^0.5

Generated-field boosts are intentionally modest. Generated visual descriptions help recall visual subjects that are missing from museum metadata, but concise museum fields should still anchor keyword ranking.

Semantic Search

Semantic search turns your query into an embedding and compares it with stored artwork embeddings. Instead of requiring the same words to appear in the object record, it looks for objects that are close to the meaning or visual idea of the query.

This is useful for descriptive searches like person looking into a mirror, mood searches like quiet interior, or subject searches where catalog metadata may not use the words you typed.

The semantic side depends on the selected embedding strategy, which controls whether the search uses generated text vectors, image vectors, or image-plus-text vectors. Min similarity controls how strict the semantic match must be before a result is shown.

Min similarity 0 — cutoff at 0Min similarity 0.5threshold 0.5remaining range rescales to 0–100.250.50.751cosine similarity between query and document← less relevantmore relevant →counted in hits and facet countsscored 0 — excluded
The same ten positive-cosine vector matches under two Min similarity settings. With the cutoff at 0, all ten illustrated matches enter the results. At 0.5, matches below the line are scored 0 and drop out of hits and facet counts, while the surviving range is rescaled to 0–1 before the semantic weight applies.

Semantic variants always use script score, evaluating the similarity threshold across the complete eligible vector-bearing query scope. Their variants can still compare embeddings, thresholds, filters, generated evidence, and other settings within that exact execution model.

Embeddings can also support cross-language searches because the query and indexed artwork evidence are compared by meaning rather than by shared words. That is why queries such as floresor can retrieve visually relevant objects even when the catalog text is in English.

Hybrid Search

Hybrid search combines keyword and semantic retrieval. It is useful when you want literal catalog evidence to anchor the ranking while still allowing semantic search to find visually or conceptually relevant objects that use different words.

Hybrid variants always use a plain script-score query that combines a saturated BM25 keyword clause with a thresholded cosine-similarity clause. It is more expensive than approximate retrieval, but it gives Elasticsearch a complete hybrid match set for collection navigation.

How script score differs from other fusion approaches

The lab implements only script score, but Linear and RRF are useful reference points when evaluating another architecture. Script score combines fixed transformed scores across the complete query scope. Linear generally combines scores normalized relative to bounded keyword and kNN windows; RRF combines rank positions instead of raw scores. A 75 / 25Linear sum therefore is not equivalent to this project's fixed 75 / 25 script-score formula.

Script score

Fixed score scales

Met default

Keyword evidence

Saturate every BM25 match with score / (score + 8).

Semantic evidence

Keep cosine similarity ≥ 0.65, then rescale the surviving range to 0–1.
0.75K + 0.25S

What matters: match strength across the complete query scope.

Linear retriever

Window-relative score scales

Keyword evidence

Retrieve the keyword window, then Min-Max normalize its BM25 scores.

Semantic evidence

Retrieve the kNN window, then Min-Max normalize its similarity scores.
0.75K + 0.25S

What matters: match strength relative to each bounded result window.

RRF retriever

Rank positions, not score scales

Keyword evidence

Record each document's rank in the keyword window.

Semantic evidence

Record each document's rank in the kNN window.
Σ 1 / (60 + rank)
Ranked #2 in both lists: 2/62
Ranked #1 in one list: 1/61

What matters: agreement across the two lists; their raw score scales are ignored.

Only the script-score path is implemented in this project. Linear and RRF are shown as architectural reference points: they fuse bounded keyword and kNN result windows instead of combining fixed score transforms across the complete threshold-defined query scope.

Elasticsearch describes Linear as a weighted sum of normalized child-retriever scores and RRF as a sum of reciprocal-rank contributions. See the Linear retriever reference and RRF retriever reference. For the broader execution tradeoff, see Elastic's guide to exact and approximate kNN.

kNN-backed retrievers work from a bounded candidate set, and Elasticsearch caps num_candidates at 10000 per shard. That means Linear and RRF cannot produce exact facets for the full embedded collection once the matching set is larger than the candidate window. A separate keyword aggregation cannot repair that gap because it cannot count semantic-only matches. Script score evaluates the semantic threshold in the query itself, so aggregations can count keyword matches plus semantic matches in one query context.

The primary variant's hits and shared filter counts therefore come from the same script-score or keyword request. There is no secondary aggregation query, candidate-window count, or cross-variant bucket merge.

The tradeoff is that script score scans matching vector-bearing documents instead of using the approximate nearest-neighbor index. This is reasonable for the default 768-dimensional embedding strategy, but higher dimensional strategies should be treated as benchmark targets before relying on them for broad script-score comparisons.

Script score compared with kNN

Neither execution strategy is universally better. Script score buys a complete, threshold-defined search universe for navigation; kNN buys efficient top-neighbor retrieval. Choose against the product requirement, then benchmark with the institution's own index, filters, traffic, and hardware.

Script score — exact100% of vector documents scoredkNN retriever — approximatenum_candidates examined → top k returnedbounded candidates scored; cutoff still appliesscored, countedscored, below thresholdnever examined
The same eligible vector-bearing collection under both execution strategies. Script score computes every document's cosine similarity, so the threshold-defined match set is complete. A kNN retriever uses HNSW to form a bounded candidate pool, applies the similarity cutoff within that pool, and returns the top k; documents outside the pool are never examined, so kNN aggregations cannot count them.
Comparison of script-score and kNN semantic search execution
ConsiderationScript scorekNN / HNSW
Search scopeEvaluates every eligible vector-bearing document in the query scope, alongside the keyword matches in hybrid search.Uses the HNSW index to find a bounded set of approximate nearest-neighbor candidates.
Facet countsAggregations run over the complete threshold-defined match set, enabling disjunctive collection navigation.Aggregations describe the retrieved candidate window, not every document that could pass a semantic threshold.
Latency and computeDoes per-document vector scoring, so cost grows with eligible vector documents, vector dimensions, and concurrent traffic.Usually much faster for top-neighbor retrieval; k and num_candidates control the quality and latency tradeoff.
Vector indexReads non-indexed dense vectors and does not require the memory, storage, or indexing cost of an HNSW graph.Requires indexed vectors and pays the associated HNSW memory, storage, and indexing costs.
Hybrid rankingMakes the lexical saturation, cosine threshold, and weights explicit in one scored query.Works well with Linear or RRF fusion, but the result depends on candidate windows and fusion settings.
Good fitCollection discovery where complete, navigable facet counts matter and the measured response time meets the product requirement.Large-scale or high-throughput retrieval where low latency and the best top results matter more than a complete semantic facet universe.

Use hybrid for searches like pink textile, woman and child, or ship in a storm, where catalog metadata and visible description can both carry useful evidence.

Embeddings

An embedding is a numeric representation of text, an image, or both. Similar meanings or visual patterns end up near each other in vector space, which lets semantic search retrieve objects even when the query and catalog record do not share exact words.

1 dimensiondarklightdifferent artworkscollide on one value2 dimensionssceneportraitlighta second attributeseparates them3 dimensionslightsubjectcoloreach new axis capturesanother attribute768 dimensions[0.12, −0.44, 0.83, …]room for subject, palette,mood, style, setting…similar meaning lands nearby — cosine similarity measures that closeness
Why hundreds of dimensions? Follow the two blue artworks — say, a dark seascape and a dark portrait. With one dimension there is a single number per artwork, so they collide on the same value. A second dimension separates them, and every added dimension makes room for another distinction. At 768 dimensions there is room to encode subject, composition, palette, mood, and style at once. Real embedding dimensions are learned by the model rather than hand-labeled — these named axes are an analogy — but the geometry is the point: similar meaning lands close together, and cosine similarity measures that closeness.

Semantic and hybrid variants search one stored vector field at a time in Elasticsearch.

Google's published dimension results show why 768 is a practical default: its MTEB score is 67.99, only 0.18 points below the best listed score, while using one-quarter as many raw vector values as 3072 dimensions. See the official Gemini Embeddings documentation.

Gemini Embedding 001 MTEB scores and relative raw vector sizes by dimension
DimensionsMTEB scoreRaw vector values vs. 3072
204868.1667%
153668.1750%
76867.9925%
51267.5517%
25666.198%
12863.314%

The percentages compare raw vector length, not total Elasticsearch index storage, which also includes document and mapping overhead; an approximate-search design would add HNSW overhead as well. MTEB is a broad text-embedding benchmark rather than a museum-search relevance test, and Google's dimension table does not report a separate 3072 score; institutions should still evaluate dimensions with their own collections and queries.

Text Embeddings

Text embeddings represent generated visual descriptions or composed metadata as vectors. They are useful when generated text captures visible subjects, style, composition, or context that users may search for.

The three active text strategies use Gemini Embedding 001 for Short, Medium, and Long descriptions. The generation call, embedding model, 768 dimensions, normalization, and query vectors are held constant so the embedded information budget is the intended variable.

Short Visual Description

Embeds only the 15–35-word output.short_description from the shared Long-to-Medium-to-Short response.

Medium Visual Description

Embeds only the 50–150-word output.medium_description. This is also the one generated field shared by all three variants on the hybrid keyword side.

Long Visual Description

Embeds only the detailed 150–300-word output.long_description from the same Gemini response.

Image Embeddings

Image embeddings represent object images directly. They can help with visual queries where the best evidence is in the image rather than the written record.

The multimodal model used here is Gemini Embedding 2, which maps text and images into a shared embedding space. The app indexes the same image-only input at 768 and 3072 dimensions. Live text queries use the model's search-query prompt formatting, and hybrid keyword evidence still comes from the shared Medium description.

Image Only (Gemini 2 768)

Embeds the object image only, preferring primaryImageSmall when available. No generated text or catalog metadata is included.

Image Only (Gemini 2 3072)

Uses the same image-only input as the 768-dimensional version, but stores the full 3072-dimensional Gemini Embedding 2 vector.

AI Generation

The Met Search Lab uses AI-generated text to make parts of the collection searchable in ways that catalog metadata alone may not support. For selected Open Access objects, the pipeline generates structured descriptions from object images and metadata, then stores that generated text alongside the original Met object record.

The generated visual descriptions in this lab are produced by vision-language models. The current prompts use Agentic Vision in Gemini 3 Flash, a capability that combines visual reasoning with code execution so the model can zoom, inspect, and ground answers in visual evidence.

Description Principles

Each description is the result of a prompt that asks the model to look carefully and report what it sees. We strive for objective, useful visual description while recognizing that every description involves choices about what to notice, name, order, and omit. The prompts try to make those choices explicit and conservative rather than pretending that generated language is neutral.

Visible Evidence First

The model is asked to describe what is visibly present: form, subject matter, composition, materials, colors, decoration, surface, condition, and distinctive details. Metadata may help disambiguate visible features, but it should not add unseen history, biography, maker knowledge, or symbolic meaning.

Structured Looking

Descriptions start with the object type or main visual form, then move through important visible content and details in a consistent spatial order. This follows the same general discipline encouraged by museum image-description practice: begin with what matters most, then branch outward without creating spatial confusion.

Plain, Searchable Language

Concrete nouns and visually justified terms are preferred over broad summaries or specialist language. The descriptions include enough detail to support search queries such as materials, objects, figures, settings, colors, and spatial relationships, while avoiding prose that reads like interpretation or evaluation.

Responsible Limits

Prompts discourage subjective judgment, emotional diagnosis, social assumptions, and claims about race, ethnicity, nationality, religion, identity, or narrative significance unless they are visually clear or explicitly supported. When something is uncertain, the description should use broader, qualified language.

Human Review And Prompt Refinement

Human editors verify the generated visual descriptions before they are treated as approved search evidence. Review looks for unsupported claims, missed visible details, inconsistent terminology, overconfident identification, and patterns that could distort retrieval across the collection.

Findings feed back into the versioned generator prompt: editors refine the instructions, affected descriptions are generated again, and the new output is reviewed. This loop improves the shared method rather than relying only on one-off corrections to individual records.

This approach is informed by image-description guidance such as the Cooper Hewitt Guidelines for Image Description, which treats description as an accessibility practice and emphasizes visible content, structure, spatial relationships, color, medium, and context-sensitive language. The Met Search Lab adapts those principles for search: the descriptions are not replacement catalog records, but generated visual evidence that can make visually present features easier to find.

Generated text is treated as search evidence, not museum catalog data. It feeds the keyword query alongside catalog fields and serves as source text for selected embedding strategies. The controls let you compare variants with generated keyword content on or off, and generated content panels in results help show what the model contributed.

Controlled Description-Length Study

The public visual-description prompt asks one pinned Gemini model to create Long, then Medium, then Short descriptions in a single structured response. The three fields are embedded separately with the same Gemini Embedding 001 model at 768 dimensions. Only description length changes; all three hybrid variants share Medium as their generated keyword field.

The outputs are correlated compressions of one visual reading, not independent prompt samples. Each embedding needs its own calibrated similarity threshold: the evaluation matches median result breadth to the historical V4 baseline at 0.65 on a fixed calibration split, then freezes thresholds before the held-out test. On this 10,000-object lab dataset, that procedure selected 0.655 for Short and 0.650 for both Medium and Long. These values are study results, not transferable defaults. Medium is the active lab default; the pending human evaluation still determines whether one description length is more relevant than another.

The public reference prompt lives in a versioned Markdown file. Historical Agentic Vision artifacts remain in repository history and the frozen evaluation record, but they are not indexed or exposed by the live lab and their exact production prompts are not distributed in the current tree.

Generator Reference

The executable public reference prompt below is loaded from its versioned generator Markdown file. It is a simplified, reproducible experiment inspired by The Met's production principles, not the exact production prompt.

Search Controls

These controls are the main levers for changing retrieval behavior. Use them to decide which evidence is searched, how strict the result set should be, and how keyword and semantic signals are combined.

Core controls

Keyword / Semantic Balance

One control defines the search behavior. 100 / 0 runs ordinary Keyword search, 0 / 100runs Semantic script score, and intermediate values run Hybrid script score. New variants start at The Met's 75 / 25 balance.

Between the endpoints, the percentages weight saturated BM25 and thresholded cosine similarity. This keeps both signals bounded per document so strong semantic matches can interleave with weaker keyword matches.

Embedding Strategy

Chooses whether semantic and hybrid search use the Short, Medium, or Long generated-description vector, or an image-only Gemini 2 vector at 768 or 3072 dimensions. New variants default to Medium Visual Description.

Tuning

Min Similarity

The Met default is 0.65. This threshold was calibrated for Agentic Vision v4 descriptions embedded with Gemini Embedding 001 at 768 dimensions. The active Medium and Long Visual Description strategies independently calibrated to the same numeric value, while Short selected 0.655. Neither value is universal: higher thresholds are stricter and lower thresholds allow broader matches.

In Script score, this value also controls which semantic-only objects are included in facet counts. Tune it conservatively when using script-score facets for drill-down decisions.

Fusion Min Score

Accepts 0–1 and defaults to 0, matching the bounded composite score range. Prefer Min similarity for defining the semantic set that facets count. This top-level cutoff excludes lower-scoring documents from both hits and aggregations, so a nonzero value is recorded as part of the facet-count definition.

Toggles

Generated Keyword Content

On by default. When enabled, the shared Medium visual description participates in the same keyword query as museum metadata. Turn it off to test whether generated text helped or introduced noise.

Fuzzy Keyword Matching

On by default. Allows conservative spelling tolerance on the keyword side. Turn it off when you want stricter lexical comparisons.

Result Set

Filters

Department, Classification, Object Type, Tag, and Highlight are shared across variants. They narrow hits without changing scores. Counts come from the primary variant's exact disjunctive facet query, and each facet excludes its own current selection while applying the other selected facets.

Reset

The Reset button clears the querystring, resets shared filters, returns to one default variant, and runs the default browse search again.

Object Pages

Result cards link to an object detail page that keeps the search context in the URL, including the query, variant, rank, and score. The page is meant for inspecting why an object appeared in a result set, not only for viewing the artwork record.

Object Record

Shows the primary image, title, date, artist or constituent lines, collection metadata, tags, measurements, and a link back to the object on metmuseum.org.

Generated Content

Displays indexed generated visual descriptions by generator version, including provider, model, schema, prompt file, and run metadata when available.

Similar Objects

Uses the current object's stored vector as the query vector, then runs an exact script-score cosine search for each selected embedding strategy, matching the production execution pattern. This is object-to-object similarity, not a rerun of the text query.

Source Data

Provides expandable field summaries and raw indexed JSON so search behavior can be traced back to the exact ES document.

Similar Objects is useful for comparing embedding strategies directly. Text-description embeddings often group works by depicted subjects and visual language, while image-only and image-plus-text embeddings can emphasize composition, medium, or visual appearance. Results are filtered to objects with images and should be read as model neighborhoods rather than curated related works. Object-page similarity scans the eligible vector-bearing documents with script_score, using the same exact execution approach as semantic collection search.

Example Test Queries

These queries are useful for checking whether a search change improves the right behavior without causing regressions elsewhere.

Good For Keyword Search

These depend on exact words, names, titles, credit lines, or multi-word catalog phrases.

Good For Semantic Search

These describe visual ideas, cross-language concepts, or subjects that may not appear literally in catalog metadata.

Good For Hybrid Search

These mix literal catalog evidence with visual or conceptual intent, so both signals can help.

Mixed Literal And Visual Queries

Use these when tuning keyword/semantic balance.

Compact Smoke Test

Run this set first when changing keyword/semantic weights, keyword fields, generated fields, or embeddings.

Comparison Examples