Skip to content

Edge capabilities

Edge implements the same plan path as remote Qdrant and shares its response envelope, but it is a single-process engine. This page is the definitive boundary: what runs offline, what fails, and with which stable error code.

The rule is simple: unsupported is a loud, stable error, never a silent no-op. Every rejection carries a reason and, when applicable, a "use remote Qdrant" hint.

CapabilityEdgeNotes
Parser, planner, explainyesidentical to remote
Dense nearest searchyesHNSW, single-threaded per shard
Sparse search (BM25)yesdefault, Qdrant qdrant/bm25-compatible; real ONNX with sparse_model
Hybrid dense + sparseyesfront-form or tail-form USING HYBRID
Fusion RRF / DBSFyesplain FUSION RRF uses k = 2; parameterized form honors PARAMS (rrf_k, rrf_weights)
MMRyesdense only
Recommendpartialbest_score and sum_scores only
Context / Discoveryesrequires embeddable inputs
Formula scoringyesfull operator set including geo and decay
Relevance feedbackyesnaive strategy
QUERY POINTSyesintegers or UUIDs
Scrollyescursor via AFTER / next_page_offset
Countyesexact by default
Order-by queriesyesQUERY ORDER BY field ASC/DESC
Random sampleyesQUERY SAMPLE RANDOM
CTEs / prefetchyesWITH … PREFETCH
Cross rerankyesclient-side, host cross-encoder model
Score threshold, offset/limityes
PARAMS (hnsw_ef, exact, acorn, quantization, indexed_only, idf)yesincluding per-query sparse IDF corpora and ACORN filtered search
Payload filtersyescomparisons, IN, BETWEEN, MATCH / MATCH PREFIX, SLICE, geo, NESTED, …
UPSERT with auto-embeddingyesdense, sparse, multi, image
DELETE / payload / vector operationsyesby id or filter
CREATE/DROP COLLECTIONyes
Create-time per-vector engine configyesWITH VECTOR (storage/datatype), WITH HNSW, WITH QUANTIZATION, WITH SPARSE all lower onto the engine config; memory tiers map to the engine's RAM/mmap switch
Background optimizationnoqql edge optimize runs the blocking optimizer loop; prevent_unoptimized defers point visibility until it runs
Remote → edge snapshot seedyesqql edge bootstrap streams a server shard snapshot (config + built HNSW + quantized data); snapshot creation is remote-side only
WAL capacity tuningyesRust (LocalExecutorOptions::wal_segment_capacity), CLI (--wal-segment-mb), Python (wal_segment_mb), Node (walSegmentMb); qdrant-edge 0.8's own Python binding cannot set it
CREATE/DROP INDEXyeskeyword (incl. prefix), integer, float, bool, geo, text, datetime, uuid
SHOW COLLECTIONS / SHOW COLLECTIONyes
Query/update batchingpartialBATCH { ... } fans out, not a native batch RPC
GROUP BYyesqdrant-edge grouping driver; LIMIT/OFFSET map to groups/group_offset
GROUP BY … LOOKUP FROMnoQQL-EDGE-UNSUPPORTED-GROUP-LOOKUP (no lookup collection)
SHARD routing / custom shardingnoQQL-EDGE-UNSUPPORTED-SHARD
CREATE/DROP SHARD KEYnoQQL-EDGE-UNSUPPORTED-SHARD-KEY
ALTER COLLECTIONpartialHNSW + optimizer config apply; WITH PARAMS / QUANTIZATION reject per field
Collection WITH PARAMSpartialonly on_disk_payload; other keys → QQL-EDGE-UNSUPPORTED-COLLECTION-PARAMS
OPTIMIZERS (memmap_threshold, flush_interval_sec, max_optimization_threads)noQQL-EDGE-UNSUPPORTED-OPTIMIZER-KEY (engine excludes them)
SHOW QUOTAS / SET QUOTAnoQQL-EDGE-UNSUPPORTED-QUOTA (cluster REST only)
RECOMMEND STRATEGY average_vectornoQQL-EDGE-UNSUPPORTED-RECOMMEND-STRATEGY
Point-id query inputsnoQQL-EDGE-UNSUPPORTED-POINT-REF
String point IDs (non-UUID)noQQL-EDGE-INVALID-POINT-ID
gRPC transportnoedge has no protobuf dependency
PARAMS (timeout, consistency)noQQL-EDGE-UNSUPPORTED-TIMEOUT / QQL-EDGE-UNSUPPORTED-CONSISTENCY
Remote image URLspartiallocal ONNX embedder: local file paths only; the HTTP embedder forwards the source string verbatim, so endpoints that accept HTTP(S) image URLs can back CLIP vision
QQLCollections and indexesTry in playground
CREATE COLLECTION docs HYBRID;
CREATE INDEX ON COLLECTION docs FOR category TYPE keyword;
SHOW COLLECTIONS;
DROP COLLECTION docs;
QQLUpsert with auto-embeddingTry in playground
UPSERT INTO docs VALUES
{id: 1, text: 'runs locally', category: 'edge'},
{id: 2, text: 'shipped to production', category: 'qql'} USING HYBRID;

Upserts embed text on-device (or via the configured HTTP endpoint) into the schema's dense and sparse vectors. Explicit vectors work too:

QQLExplicit dense vectorTry in playground
UPSERT INTO docs VALUES {id: 1, vector: {dense: [0.1, 0.2, 0.3]}, text: 'precomputed'};
QQLDelete and payload updatesTry in playground
DELETE FROM docs WHERE status = 'expired';
UPDATE docs SET PAYLOAD = {status: 'reviewed'} WHERE id = 42;
UPDATE docs SET VECTOR = [0.1, 0.2, 0.3] WHERE id = 42;
CLEAR PAYLOAD FROM docs WHERE status = 'archived';
DELETE PAYLOAD draft FROM docs WHERE id = 42;
DELETE VECTOR colbert FROM docs WHERE id = 42;
QQLDense, sparse, and hybrid searchTry in playground
QUERY 'edge vector search' FROM docs USING dense LIMIT 10;
QUERY 'keyword style' FROM docs USING sparse LIMIT 10;
QUERY HYBRID TEXT 'hybrid' FUSION RRF FROM docs LIMIT 10;
QUERY HYBRID TEXT 'hybrid' DENSE dense SPARSE sparse FUSION RRF
FROM docs
LIMIT 10;
QQLFusion, MMR, and recommendationTry in playground
WITH
candidates AS (QUERY 'x' USING dense LIMIT 100)
QUERY FUSION RRF
FROM docs
PREFETCH (candidates)
LIMIT 10;
QUERY MMR TEXT 'x' DIVERSITY 0.7 CANDIDATES 100 FROM docs USING dense LIMIT 10;
QUERY RECOMMEND POSITIVE (1, 2) NEGATIVE (3) STRATEGY best_score
FROM docs
USING dense
LIMIT 10;
QQLAdvanced query formsTry in playground
QUERY FORMULA $score * 0.8 DEFAULTS (score = 0.0) FROM docs LIMIT 10;
QUERY CONTEXT (POSITIVE 'good' NEGATIVE 'bad') FROM docs LIMIT 10;
QUERY SAMPLE RANDOM FROM docs LIMIT 10;
QUERY ORDER BY year DESC FROM docs LIMIT 10;
QQLGrouped searchTry in playground
QUERY 'x' FROM docs USING dense GROUP BY category LIMIT 5;
QUERY 'x' FROM docs USING dense GROUP BY category SIZE 3 LIMIT 10 OFFSET 5;

Group ids come back typed (keyword / unsigned / signed) with fully hydrated hits; SIZE maps to the per-group hit count and OFFSET trims groups client-side via group_offset.

Cross-encoder reranking runs client-side: candidate stages execute against local storage and the host cross-encoder model scores the pairs.

QQLSearch params, threshold, and offsetTry in playground
QUERY 'x'
FROM docs
USING dense
PARAMS (hnsw_ef = 64, exact = true)
SCORE THRESHOLD 0.5
LIMIT 10
OFFSET 20;

execute with a list of statements, a semicolon-delimited string, or a BATCH { ... } block is executed statement-by-statement against the edge backend. There is no native batch RPC — results are returned per operation with cardinality matching the input.

qdrant-edge indexes nothing in the background. qql edge optimize <collection> calls the engine's blocking optimizer loop (merge, index, vacuum, config-mismatch) and qql --edge doctor / qql check --edge surface the indexed_vectors_count vs points_count lag with the same nudge. A segment below the collection's indexing_threshold (10 MB by default offline, versus 20 MB on a 1.19 server) stays brute-force by design.

For the initial load, qql edge bootstrap <collection> --from <url> seeds the local directory from a remote Qdrant shard snapshot (unpack_snapshot + load), preserving the source collection's config, built HNSW indexes and quantized data. A single-shard collection is auto-discovered; multi-shard collections require --shard-id and fail closed otherwise (QQL-SNAPSHOT-SHARD).

Every unsupported feature returns a stable error code. The message includes the feature, the reason, and a remediation hint.

CodeFeature
QQL-EDGE-UNSUPPORTED-SHARDSHARD routing or collection sharding options
QQL-EDGE-UNSUPPORTED-SHARD-KEYCREATE / DROP SHARD KEY
QQL-EDGE-UNSUPPORTED-GROUP-LOOKUPGROUP BY … LOOKUP FROM (no lookup collection)
QQL-EDGE-UNSUPPORTED-ALTER-PARAMSALTER COLLECTION … WITH PARAMS
QQL-EDGE-UNSUPPORTED-ALTER-QUANTIZATIONALTER COLLECTION … QUANTIZATION
QQL-EDGE-UNSUPPORTED-VECTOR-DIFFPer-vector ALTER COLLECTION … WITH VECTOR (<name>) fields other than hnsw_config (quantization_config / on_disk / memory); qdrant-edge exposes set_vector_hnsw_config only
QQL-EDGE-UNSUPPORTED-SPARSE-DIFFPer-sparse-vector ALTER COLLECTION … WITH SPARSE (<name>); qdrant-edge has no sparse vector config setter
QQL-EDGE-UNSUPPORTED-COLLECTION-PARAMScreate-time WITH PARAMS other than on_disk_payload
QQL-EDGE-UNSUPPORTED-OPTIMIZER-KEYOPTIMIZERS keys the engine excludes
QQL-EDGE-UNSUPPORTED-QUOTASHOW QUOTAS / SET QUOTA (cluster REST /quotas only)
QQL-EDGE-UNSUPPORTED-RECOMMEND-STRATEGYRECOMMEND STRATEGY average_vector
QQL-EDGE-UNSUPPORTED-POINT-REFpoint-id-only inputs (need materialized vectors)
QQL-EDGE-UNSUPPORTED-FORMULA-FUNCTIONMAX / MIN / ACOSH formula functions; qdrant-edge 0.8 has no such Expression variants
QQL-EDGE-UNSUPPORTED-ROUTEany other unmapped projection
QQL-EDGE-INVALID-POINT-IDnon-integer, non-UUID string point IDs

Example rejection:

GROUP BY … LOOKUP FROM is not supported offline: qdrant-edge groups the queried
shard only and has no lookup collection to hydrate hits from. Use remote Qdrant
(REST or gRPC) for this feature.

See the complete list of fixed codes in the error codes reference.

Recommendations and point reference inputs: QUERY POINT 42 FROM docs, QUERY RECOMMEND POSITIVE (1), and similar point-id inputs need the point's vector materialized. Text, vector, or image inputs that can be embedded by the configured model work; point-id-only inputs fail with QQL-EDGE-UNSUPPORTED-POINT-REF (or resolve to vectors first).

timeout and consistency are request-level fields for remote REST/gRPC transports and are rejected offline with QQL-EDGE-UNSUPPORTED-TIMEOUT and QQL-EDGE-UNSUPPORTED-CONSISTENCY. hnsw_ef, exact, acorn (with max_selectivity), quantization, and indexed_only are honored.

Edge has no gRPC and no protobuf dependency. The runtime executor always dispatches through the embedded QdrantOps backend. If your tooling needs gRPC, use the remote path.

For storage behavior across restarts and the data directory layout, continue to persistence.