Skip to content

Backend compatibility

Most QQL statements are transport-neutral. Differences come from backend capability, not a separate language dialect.

The REST and gRPC transports target Qdrant 1.19.x (the bundled OpenAPI schema and public protobuf definitions are pinned to v1.19.0). Older servers may reject plan fields introduced in that generation; the edge backend is an in-process engine and does not depend on a server version.

CapabilityRESTgRPCEdge
Parse, validate, inject, explainyesyesyes
Dense nearest searchyesyesyes
Sparse and hybrid retrievalyesyesyes
Payload filters (including MATCH PREFIX, SLICE)yesyesyes
Per-query sparse IDF (PARAMS idf = …)yesyesyes
Memory placement / payload_memory / dense datatypeyesyespartial
Keyword index prefix = trueyesyesyes
Text index stemmer / stopwordsyesyesyes (qdrant-edge 0.8+)
MMR, recommend, formula, order-by, sample, context/discoveryesyesyes
Quantization rescore / oversampling (PARAMS quantization = {...})yesyesyes
Cross-encoder reranking (CROSS RERANK)yesyesyes (client-side)
Exact count (COUNT ... WITH (exact = true))yesyesyes
UPSERT with auto-embeddingyesyesyes (local embedder)
Query/update batchingyes (BATCH { ... })yes (BATCH { ... })fan-out
SHOW QUOTAS / SET QUOTAyesnono
Route affinity (X-Qdrant-Route-Affinity)yesyesn/a
Grouped searchyesyesyes (no LOOKUP FROM)
Custom SHARD routingyesyesno
Shard-key administrationyesyesno
ALTER COLLECTIONyesyespartial (HNSW/optimizers)
Collection PARAMS (replication, sharding)yesyespartial (on_disk_payload only)
Point-ID query inputsyesyesno
ACORN search parameteryesyesyes (qdrant-edge 0.8+)
Cluster consistency/timeout fieldsyesyesno

Notes:

  • Batching on edge fans out BATCH { ... } into one operation per request; there is no native batch endpoint. Remote Qdrant sends one native batch RPC.
  • Grouped search on edge runs qdrant-edge's grouping driver with typed group keys and hydrated hits; cross-collection GROUP BY … LOOKUP FROM is rejected with QQL-EDGE-UNSUPPORTED-GROUP-LOOKUP.
  • ALTER COLLECTION on edge applies HNSW and optimizer config through the engine's persisted setters; WITH PARAMS, QUANTIZATION, and the optimizer keys the engine excludes fail per field.
  • Cross-rerank is always executed client-side: the runtime fetches the prefetched candidates, scores (query, document text) pairs with a pair-scoring embedder, and reorders. It is not a Qdrant search variant on any backend.
  • Point-ID query inputs (QUERY POINT, RECOMMEND POSITIVE (id)) need materialized vectors; offline, use TEXT or VECTOR inputs instead.
  • Timeouts and consistency are request-level REST/gRPC fields and are rejected offline with QQL-EDGE-UNSUPPORTED-TIMEOUT and QQL-EDGE-UNSUPPORTED-CONSISTENCY.
  • Quotas are cluster REST only (GET|PUT /quotas). Upstream Qdrant exposes no public gRPC quota service: the only quota RPC (GetQuotaUsage) lives in the internal cluster service on the peer-to-peer port and reports utilization, not the configured limits, and there is no RPC to set limits. gRPC therefore fails with QQL-GRPC-QUOTA; edge fails with QQL-EDGE-UNSUPPORTED-QUOTA.
  • Route affinity is transport metadata configured on the client — Rust RestQdrant / GrpcQdrant (with_route_affinity), pyqql.Client( route_affinity=…), nqql new Client({ routeAffinity }), or WASM client.setRouteAffinity(key) — not a QQL statement or request body. Edge is single-node so it has no route affinity.
  • Memory placement on edge may not honor every memory / payload_memory value on the underlying engine; prefer remote Qdrant when placement must match cluster semantics.

The exact edge surface evolves with qql-edge; treat a plan or execution capability error as authoritative.

QQLRemote search controlsTry in playground
QUERY 'search'
FROM docs
USING dense
PARAMS (hnsw_ef = 64, acorn = true, max_selectivity = 0.4, timeout = 30, consistency = majority)
LIMIT 10;
QQLSparse IDF corpus (search-body param)Try in playground
QUERY 'search'
FROM docs
USING sparse
PARAMS (idf = 'global')
LIMIT 10;
QUERY 'search'
FROM docs
USING sparse
WHERE tenant_id = 'acme'
PARAMS (idf = WHERE tenant_id = 'acme')
LIMIT 10;

timeout and consistency map to request-level REST/gRPC fields. HNSW, ACORN, and sparse idf options are search-body parameters.