Open source · MIT · v0.4.0

SQL for Qdrant. QQL vector-search language

One declarative statement for hybrid search, filters, mutations and schema. Runs everywhere Qdrant does.

curl -fsSL https://…/install.sh | sh

search.qqlQQL · MIT
QUERY 'chest pain' FROM medical
USING dense
WHERE department = 'cardio'
SHARD 'hospital-east'
LIMIT 5;
200 OKPOST /collections/medical/points/query1.2ms
Query forms
12
Conformance statements
276
Runtimes & tools
6
WASM parser, in-browser
2.5 MB

Same query. No boilerplate.

Pick REST JSON or any SDK client. The QQL stays a few lines.

Open in playground →
Target
REST JSONPOST /points/query28 lines
{
"prefetch": [
{
"query": { "nearest": [[-0.83, 0.32,, 0.83]] },
"using": "dense_vec",
"filter": {
"must": [{
"key": "status",
"match": { "value": "active" }
}]
},
"limit": 100
},
{
"query": { "nearest": { "indices": [3719, 12808, 41172], "values": [0.72, 1.34, 0.41] } },
"using": "bm25_vec",
"filter": {
"must": [{
"key": "status",
"match": { "value": "active" }
}]
},
"limit": 100
}
],
"query": { "fusion": "rrf" },
"limit": 10
}
Hand-built JSON · vectors inlined by hand
QQLuniversal query7 lines
QUERY 'distributed consensus' FROM docs
USING HYBRID
DENSE dense_vec
SPARSE bm25_vec
FUSION RRF
WHERE status = 'active'
LIMIT 10;
POST /collections/docs/points/query · 200 · 1.2msDense plus sparse fused in one statement−75%

Native panes inline precomputed vectors from an out-of-band embedding step the SDKs and REST API can't express; QQL resolves text in-process. All panes are truncated (…); line counts exclude that pipeline on both sides.

Declarative queries compile directly to optimized Qdrant REST and gRPC payloads with zero runtime overhead.

Full comparison in the docs →

How a statement runs.

One pass from source to dispatch. The plan is the contract between every runtime.

  1. 01

    Parse

    qql-core lexes and parses into a typed AST. Malformed clauses fail with a span, never a silent default.

  2. 02

    Validate

    Named vectors resolve against the collection schema. Unknown USING kinds fail closed.

  3. 03

    Plan

    plan() lowers the AST to one transport-neutral PlannedOperation.

  4. 04

    Dispatch

    The same plan projects to REST JSON, gRPC protobuf, or the in-process edge backend.

One grammar. The whole surface.

Hybrid retrieval, faceting, and formula scoring. Twelve query forms over one typed grammar.

HybridTry in playground →
QUERY TEXT 'vector database' FROM docs
USING HYBRID DENSE dense SPARSE bm25 FUSION RRF
LIMIT 10;
Dense and sparse in one statement. The engine fuses, not your client.
FormulaTry in playground →
QUERY FORMULA MAX(MIN($score * 2.0, 10.0), 0.0) + ACOSH(popularity + 1.0)
DEFAULTS (score = 0.0, popularity = 0)
FROM papers LIMIT 10;
Clamps and curves in one expression, no CASE boilerplate.
FacetTry in playground →
FACET room_type FROM stays WHERE price < 150 LIMIT 5 EXACT true;
Category counts stay in the database, no points pulled into memory.

Language reference →

One statement. Every runtime.

Same plan, six surfaces: CLI, Python, Node, Rust, WASM, and VS Code.

  • curl -fsSL https://…/install.sh | sh
  • Python

    Docs →
    pip install pyqql
  • Node.js

    Docs →
    npm i @veristamp/nqql
  • cargo add qql qql-core
  • npm i qql-wasm

    2.5 MB parser, in-browser

  • VS Code

    Docs →
    srimon12.qql-lang

Quickstart →

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 ~2.5 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.4.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?

The WASM parser runs fully offline in the browser. To execute, point the playground at Docker or your Qdrant URL, or run qql-edge for local HNSW storage.

WASM parser · MIT

Parse a query in the browser.

The playground runs the real WASM parser locally: tokens, AST, plan and wire JSON. Point it at Docker or your Qdrant URL to execute.

No cluster · no signup