Skip to Content
We are live but in Staging 🎉
Data EnginesVectorCLI Guidedodil data vsearch

dodil data vsearch

Vector KNN search over a table’s vector column, executed on the tables data plane through the typed TablesVector.QueryVectors gRPC facet — not over the Qdrant wire. Alias: dodil data knn.

A “collection” in tabled is a table with a vector column, so this command wants a table and a column, not a collection id:

dodil data vsearch -b BUCKET -t TABLE --column COLUMN \ (--vector "0.12,0.03,…" | --text "some query") [--metric M] [--top-k N]
FlagShortTypeDefaultDescription
--bucket-bstringRequired. Bucket to search in (it is also the plane’s db id)
--table-tstringRequired. Table holding the vector column
--collectionstringAlias for --table. There is no -c shorthand.
--columnstringRequired. The vector column to search
--vectorstringQuery vector as comma-separated floats
--textstringQuery text, embedded client-side via Ignite Models before the KNN
--modelstringarctic-embed-m-v2Embedding model for --text — must match the model that embedded the table
--metricstringcosinecosine · euclidean · dot (aliases: cos, l2, euclid, ip, dot_product, inner)
--top-kint10Number of results
--include-valuesboolfalseAlso return each match’s stored embedding

Exactly one of --vector or --text is required; with neither, the command errors. --metric is mandatory on the wire — the plane rejects METRIC_UNSPECIFIED — so the CLI always sends one, defaulting to cosine.

--text needs the unified dodil CLI. It embeds through Ignite Models via an injected hook; the standalone datak3 binary leaves that hook unset and --text errors with “embed yourself and pass --vector”.

# By text — one Ignite embed call, then the KNN dodil data vsearch -b kb-prod -t chunks --column embedding \ --text "refund policy" --top-k 10 # By vector — you already have the floats dodil data vsearch -b kb-prod -t chunks --column embedding \ --vector "0.12,0.03,…" --metric cosine --top-k 10

Output

Table output is id · score rows plus a hit count. -o json returns the CLI’s own envelope — not a Qdrant-wire response, and no payloads:

{ "matches": [ {"id": "chunk-41", "score": 0.1832}, {"id": "chunk-07", "score": 0.2114} ], "count": 2 }

With --include-values, each match also carries "values": [...].

score is a distance, not a similarity — lower is closer. VectorMatch.score on dodil.tables.v1 is the raw metric distance (dodil-tables/proto/api/tables.proto:1104-1112). Don’t compare it against the RRF fusion scores that POST /:bucket/search/vector returns.

For payloads and metadata filters, use a stock Qdrant or Pinecone client — see Connect & wire adapters. The console’s Connect panel generates ready-to-paste snippets per language.

Text search with server-side embedding

vsearch --text embeds client-side — pure KNN semantics, no hybrid, no rerank. For server-side embedding over pipeline-mode collections (and the cross-group RRF merge), use the HTTP route instead:

curl -sS -X POST "https://api.data.dodil.io/kb-prod/search/vector" \ -H "Authorization: Bearer $DODIL_TOKEN" \ -H "Content-Type: application/json" \ -d '{"text": "refund policy", "collectionNames": ["docs"], "topK": 10}'

Collection lifecycle

Creating, listing, and deleting collections stays on the control plane — and all three key off the pipeline id:

dodil data vector collection list -b kb-prod dodil data vector collection add my-texts -b kb-prod -t text_embedding_index dodil data vector collection delete <pipeline-id> -b kb-prod

See also