SQL for Qdrant.

QQL is to Qdrant what SQL is to Postgres. One query for hybrid search, filters, and schema.

search.qql
QUERY TEXT 'chest pain'
FROM medical
USING dense
WHERE department = 'cardio'
SHARD 'hospital-east'
LIMIT 5;

Same query. Less JSON.

Switch REST JSON or the Python client. The QQL stays a few lines.

4 lines vs 22

Open in playground
QQL4 lines
QUERY TEXT 'distributed consensus' FROM docs
USING HYBRID DENSE dense_vec SPARSE bm25_vec FUSION RRF
WHERE status = 'active'
LIMIT 10;
REST JSON22 lines
{
"prefetch": [
{
"query": { "nearest": "dense_vec" },
"using": "dense_vec",
"filter": {
"must": [{ "key": "status", "match": { "value": "active" } }]
},
"limit": 100
},
{
"query": { "nearest": "bm25_vec" },
"using": "bm25_vec",
"filter": {
"must": [{ "key": "status", "match": { "value": "active" } }]
},
"limit": 100
}
],
"query": { "fusion": "rrf" },
"limit": 10
}

Full comparison in the docs →

What you stop writing.

  • Filter trees

    A WHERE clause instead of nested must/should JSON in every call.

  • Tenant copies

    inject_filter rewrites the AST before planning. Miss a path and it fails closed.

  • Three clients

    Plan once. REST, gRPC, and in-process edge share the same operation.

Questions

What is QQL?

A typed query language for Qdrant. One surface for retrieval, filtering, mutations, schema, and policy-safe AST rewriting.

Which runtimes ship today?

Rust crates, native Python and Node.js bindings, a ~1.3 MB WASM package, the qql CLI, and a VS Code extension with live diagnostics.

How does multitenancy work?

Parse untrusted QQL, then inject a trusted tenant filter into the AST before planning. SHARD routing is a separate locality concern and can run alongside the filter.

Does QQL replace Qdrant?

No. QQL plans operations for Qdrant and dispatches them over REST or gRPC, or evaluates the supported subset through the in-process edge backend.

Is it production-ready?

It is young: v0.3.0. Fail-closed defaults, OpenAPI contract tests, a conformance corpus, and a public gaps document. The API surface is stabilizing, not frozen.

Can I try it without a cluster?

Yes. The playground runs the real WASM parser in the browser. qql-edge runs the pipeline with local HNSW storage and ONNX embeddings.