Skip to main content
The StarTree Pinot Elasticsearch Gateway exposes a read-only Elasticsearch-compatible API for Pinot tables. It lets tools such as Kibana and OpenSearch Dashboards discover Pinot tables as indexes, issue Elasticsearch Query DSL requests, and receive Elasticsearch-shaped JSON responses.
The gateway is a query translation layer. It does not copy data out of Pinot and it does not turn Pinot into a writable Elasticsearch cluster.

Architecture

The gateway is mounted under the StarTree proxy /es base path when enabled.

When to Use

Use the Elasticsearch Gateway when:
  • Observability or BI users already know Kibana or OpenSearch Dashboards.
  • You want to browse Pinot tables without exporting data into Elasticsearch.
  • Your dashboard uses common _search, _count, _msearch, field-caps, mapping, and single-level aggregation requests.
  • You want Pinot text indexes to back simple full-text Query DSL clauses.
Use Pinot SQL directly when you need joins, complex expressions, multi-stage query planning, or Query DSL features outside the gateway’s supported subset.

Enable the Gateway

The gateway is disabled by default. Enable it on the StarTree proxy:
Point Kibana or OpenSearch Dashboards at the proxy /es path. OpenSearch Dashboards:
Kibana:
Kibana saved objects require a writable .kibana index. Pinot is read-only through this gateway, so route .kibana* traffic to a real Elasticsearch or OpenSearch cluster if the UI needs to save index patterns, dashboards, or preferences.

Verify the Endpoint

Check the handshake:
Example response:
List Pinot tables as Elasticsearch indexes:
Resolve a table pattern:

Supported Endpoints

Write endpoints such as _doc, _bulk, and index creation are not supported and return an error.

Query Examples

Equivalent Pinot SQL shape:

Range Filter

Equivalent Pinot SQL shape:

Terms Aggregation

Equivalent Pinot SQL shape:

Query DSL Support

Supported leaf clauses: Supported compound clause: Supported aggregations:
  • One bucket aggregation level: date_histogram, terms, or histogram.
  • Metric sub-aggregations: avg, sum, min, max, value_count, and cardinality.
  • Metric-only aggregations.
Sorting, paging, field selection, _source, and track_total_hits are supported. Field names ending in .keyword are normalized to the underlying Pinot column. Full-text Query DSL clauses use Pinot’s Lucene-backed TEXT_MATCH only when the target column has a Pinot text index. Add a text index to searchable string columns:
Example match query:
Text-indexed translation:
On columns without a text index, the gateway falls back to exact-match or LIKE behavior. It does not reproduce Elasticsearch relevance scoring; results are unranked unless the request includes an explicit sort.

Create an Index Pattern

In Kibana or OpenSearch Dashboards:
  1. Open the index-pattern or data-view creation screen.
  2. Enter a Pinot table name such as baseballStats.
  3. Select an epoch-millis LONG or timestamp column as the time field if the table has one.
  4. Open Discover and query the table.
The UI gets field metadata from:

Limitations

  • Read/query path only. Writes, bulk ingest, and index creation are not supported.
  • Saved objects require a separate writable Elasticsearch/OpenSearch store.
  • Nested bucket aggregations are not supported.
  • date_histogram assumes an epoch-millis numeric or timestamp time column.
  • Offset paging with from > 0 is stable only when the request supplies a sort.
  • Query DSL support is intentionally partial and optimized for common dashboard/discovery workflows.

Troubleshooting