Skip to main content
The Rootprint search box accepts Lucene query syntax. Queries combine field-scoped clauses with boolean operators, and the same syntax works whether you type it in the UI or pass it to the search API.

Quick reference

Operator precedence: NOT / - > AND > OR. Use parentheses when you need a different order.

Field paths

Use dot notation to reach nested JSON fields:
If the field name itself contains a dot and the index has expand_dots: true (the default for the bundled OTel index), escape the literal dots with a backslash:

Default search fields

A query without a field name searches the index’s default_search_fields. The bundled otel-logs-v0_9 index searches body.message:
To search a different field, name it explicitly: attributes.exception.type:ValueError.

Tokenizers and case sensitivity

A field’s index-time tokenizer decides how queries against it match. The two tokenizers used in the bundled OTel index: This means severity_text:error will not match a document with "severity_text": "ERROR". The index stored ERROR as a single token. Match the case your shipper sends, or filter via the UI quick-filters which know each field’s casing.
If you query a custom index and exact-match terms are missing, the field is probably tokenized differently than you expect. Tokenizers are set in the index’s Quickwit configuration. See Create a custom index. The same value indexed with default and raw produces different match behavior.

Time ranges

The Rootprint UI exposes a time picker that bounds every query to a time window. You don’t write the timestamp clause yourself. If you call the log endpoint directly, pass startTs and endTs as seconds (regardless of the field’s precision). The index is part of the URL, and you authenticate with a query API key:

Common log search recipes

Pasting a bare trace ID — 32 hexadecimal characters, in any case — into the search box opens that trace directly instead of running a search. An all-zeros ID is exempt and searches as normal, since OTLP writes it on logs with no trace context. Wrap the ID in quotes to search for it as text instead. Use the trace_id: field query above when you want the logs for a trace rather than its spans. See Read a trace.

Escaping special characters

These characters are reserved by the query parser and must be backslash-escaped to appear in a value:
For example, to search for the literal string (test) in a phrase, wrap it in quotes. The inside of a phrase doesn’t need escaping. To search a single term containing parentheses, escape them: body.message:\(test\).

Limits

  • A wildcard cannot be the first character of a term (*timeout is not allowed). Use a phrase or full-text query against the body instead.
  • Phrase queries require the field to be indexed with record: position. The bundled body field meets this; most raw-tokenized fields do not.
  • IP fields accept individual addresses. CIDR ranges are not supported. Use a numeric range on a parsed component if you need them.