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.
| Capability | REST | gRPC | Edge |
|---|---|---|---|
| Parse, validate, inject, explain | yes | yes | yes |
| Dense nearest search | yes | yes | yes |
| Sparse and hybrid retrieval | yes | yes | yes |
Payload filters (including MATCH PREFIX, SLICE) | yes | yes | yes |
Per-query sparse IDF (PARAMS idf = …) | yes | yes | yes |
Memory placement / payload_memory / dense datatype | yes | yes | partial |
Keyword index prefix = true | yes | yes | yes |
Text index stemmer / stopwords | yes | yes | yes (qdrant-edge 0.8+) |
| MMR, recommend, formula, order-by, sample, context/discover | yes | yes | yes |
Quantization rescore / oversampling (PARAMS quantization = {...}) | yes | yes | yes |
Cross-encoder reranking (CROSS RERANK) | yes | yes | yes (client-side) |
Exact count (COUNT ... WITH (exact = true)) | yes | yes | yes |
| UPSERT with auto-embedding | yes | yes | yes (local embedder) |
| Query/update batching | yes (BATCH { ... }) | yes (BATCH { ... }) | fan-out |
SHOW QUOTAS / SET QUOTA | yes | no | no |
Route affinity (X-Qdrant-Route-Affinity) | yes | yes | n/a |
| Grouped search | yes | yes | yes (no LOOKUP FROM) |
Custom SHARD routing | yes | yes | no |
| Shard-key administration | yes | yes | no |
ALTER COLLECTION | yes | yes | partial (HNSW/optimizers) |
Collection PARAMS (replication, sharding) | yes | yes | partial (on_disk_payload only) |
| Point-ID query inputs | yes | yes | no |
| ACORN search parameter | yes | yes | yes (qdrant-edge 0.8+) |
| Cluster consistency/timeout fields | yes | yes | no |
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 FROMis rejected withQQL-EDGE-UNSUPPORTED-GROUP-LOOKUP. ALTER COLLECTIONon 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, useTEXTorVECTORinputs instead. - Timeouts and consistency are request-level REST/gRPC fields and are rejected offline with
QQL-EDGE-UNSUPPORTED-TIMEOUTandQQL-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 withQQL-GRPC-QUOTA; edge fails withQQL-EDGE-UNSUPPORTED-QUOTA. - Route affinity is transport metadata configured on the client — Rust
RestQdrant/GrpcQdrant(with_route_affinity),pyqql.Client( route_affinity=…),nqqlnew Client({ routeAffinity }), or WASMclient.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_memoryvalue 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.
Request-level parameters
Section titled “Request-level parameters”QUERY 'search'FROM docsUSING densePARAMS (hnsw_ef = 64, acorn = true, max_selectivity = 0.4, timeout = 30, consistency = majority)LIMIT 10;QUERY 'search'FROM docsUSING sparsePARAMS (idf = 'global')LIMIT 10;
QUERY 'search'FROM docsUSING sparseWHERE 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.