Visor

Visor is ZVN's own search engine, and the fourth engine Headband runs beside Meilisearch, Typesense and Elasticsearch. One Visor index answers in two ranking modes, picked per request: instant for typo-tolerant, as-you-type search, and retrieval (BM25F) for longer queries. The same REST API, keys and dashboard work on it as on the other engines.

Headband runs Visor for you on dedicated engines. There is no bring-your-own Visor.

Choose Visor

Pick Visor wherever you pick an engine:

  • In the dashboard: New index, Create engine on the Engines page, or the default engine of a new project.
  • In the API: "engine": "visor" on POST /v1/indexes, POST /v1/instances and POST /v1/projects.
  • In the CLI, as below.
terminal
headband instances create visor --lane serverless
headband indexes create products --engine visor
headband projects create shop --engine visor

An index created with no instanceId goes on your default Visor engine. Headband creates it on first use, serverless at 512 MB, as it does for Meilisearch.

Where Visor Runs

Visor is offered in a region where a dedicated engine host runs it. The dashboard lists it there, and only there. In a region where no host runs it, creating a Visor engine or a Visor index answers 503 engine_not_available with the message Visor is not available in ewr1 yet. (naming the region). Nothing is created.

Visor
LanesServerless (parks when idle, wakes on the next request) and always on
Sizes (memory)512 MB to 32 GB
Serverless idle timeout300 seconds by default, 60 seconds to 24 hours
Bring your own engineNo. engineConfig with visor answers 400 invalid_engine_config
Managed SyncNot yet. Sync writes to Meilisearch, Typesense and Elasticsearch engines

Documents and Tasks

Writes are synchronous. A write is searchable when it returns, so its task has taskUid 0 and status succeeded, and there is nothing to poll.

A batch is one atomic write: a bad document fails the whole request. A bulk import (POST /v1/bulk) is split into batches that fit the engine's request size, and a batch the engine still refuses is halved and sent again. A single POST /v1/documents is never split, so one that is too large answers 413 payload_too_large.

Listing documents by offset on GET /v1/documents pages within the first 1000 documents. A walk by cursor reads every document, in primary key order, and the dashboard's Documents tab walks that way. Search reaches every document either way.

A search counts its hits within the first 1000 too. Past them, an empty query with no filter answers the index's document count in estimatedTotalHits, and any other search answers 1000 with "totalHitsExact": false: at least that many hits match.

Visor makes an index's primary key filterable and sortable as soon as the key is known (when the index is created with it, or on the first write when Visor infers it), and a settings update keeps the key in both lists. An index from before that may lack them: a walk past 1000 documents then answers 400 feature_not_supported naming the settings to add, and adding them rebuilds the index once.

Settings

These settings apply to a live Visor index: searchableAttributes, filterableAttributes, sortableAttributes, displayedAttributes, rankingRules (the built-in rules), typoTolerance, synonyms and stopWords. Sending null resets one to Visor's default.

Visor refuses distinctAttribute, faceting, pagination, separatorTokens, nonSeparatorTokens, dictionary, proximityPrecision, searchCutoffMs and embedders with 400 feature_not_supported, so a setting never looks applied when it is not.

Errors

StatusCodeWhen
404index_not_foundThe index does not exist.
400invalid_search_filterA malformed filter, or a filter on a field that is not filterable.
400feature_not_supportedA setting or search parameter Visor does not have, such as vector search.
413payload_too_largeOne write request is larger than the engine accepts.
503storage_unavailable, search_queue_fullBusy or briefly unavailable. Retryable: the answer has Retry-After.
503engine_not_availableNo dedicated engine host in the region runs Visor yet.

See also

The engine compatibility matrix compares Visor with the other engines feature by feature, and Errors has the full error shape.