Troubleshooting
Most View problems come down to a field name that does not match the index, a property type that was never mapped, or a configuration that saved but cannot execute. This page lists the common cases.
A facet is empty
A terms facet returns no values.
- Wrong field path. The
fieldmust match the indexed path exactly, for exampleproperties.status. Inspect real values before configuring a facet — the Studio editor's preview and Studio Assistant'sinspect_view_databoth show actual buckets. - Not a keyword field. Facets aggregate on keyword-typed fields. Property strings are keywords by default, but a
field that was mapped as
text(or is numeric) will not aggregate as a term facet. - Nothing in scope matches. The View's
scope(or an active navigation selection) may exclude every document that has the property. Widen the scope or clear other selections to confirm.
A numeric range or date facet does nothing
A range facet or a numeric/date sort has no effect.
This is almost always a typed indexing problem. Property strings map to keyword, and date-looking strings stay
keywords — so a range or date control over them cannot work until the field is mapped with a numeric or date type
and the project is reindexed. Store numbers as JSON numbers, declare explicit types in
indexing.property_mappings, and run a full reindex. See
Typed property indexing.
Remember: changing property_mappings does not rewrite the active index. The new type only applies after a full
reindex.
Validation returns HTTP 400 for a query
Creating, updating, previewing, or executing a View returns a 400 that names an unsupported query clause.
The most common cause is a scope.fixed_filter that uses an Elasticsearch query type outside the supported
allowlist. Simplify it to supported clauses (bool, term, terms, range, match, exists, prefix, and
similar), or move the constraint into scope.type_ids, scope.collection_ids, or scope.locations. Agentic plans
go through the same query validator before they can reach Elasticsearch.
A 400 can also come from an out-of-range execution input (for example a non-numeric limit); the returned path and
message identify the invalid value.
An old View cannot be saved
Editing an existing View returns a 400 complaining that description is required.
Persisted Views require a non-empty description. Current Studio deployments backfill older records from the View
name, but a mixed-version deployment or record that has not yet been migrated can still surface this error. Supply a
description in the update payload (or in the Studio editor) and save again.
Agentic search fell back to deterministic
The response search block reports applied_mode: 'deterministic' and a warning even though the View is configured as
agentic.
The runtime falls back to deterministic search when query planning times out, fails validation, or does not
meet minimum_confidence. Check the warning code in the response. To reduce fallbacks: give the planner a clearer
search.fields catalog with good description text, raise timeout_ms, lower minimum_confidence if it is too
strict, or refine search.agentic.instructions. The fallback is safe by design — it never runs fuzzy queries outside
the validated field catalog.
Full-text search does not match extracted property text
A query that should match text inside a property returns nothing.
Property strings are indexed as keyword, which is exact-match only. For a property whose value is meaningful prose
(for example extracted instructions), map the path as text in indexing.property_mappings, reindex, and list it in
search.fields with mode: 'full_text'. See
Typed property indexing.
Nothing loads / "Elasticsearch is not enabled"
View execution requires Elasticsearch. Enable it for the project and ensure the scoped content is indexed. See Search Configuration.
A custom renderer is not used
You passed a renderers registry but the built-in renderer still shows.
The renderer name on the search, navigation item, or display must match a key in the registry exactly. When a name
is missing — including on the generic /view/<id> route, which has no application registry — the component falls back
to the built-in renderer for that section. See
Custom renderers.
