Skip to content
Document DB v12 - Improved Interceptors with Soft Delete Integration, AI protections, & Admin UI with Aspire Integration!How!?

Vectors

Appears when a type stores embeddings — an array of at least eight numbers, so a coordinate pair is not mistaken for one — or has a {table}_vec_{type} sidecar. Like Geometry, it reads from the document body, which is where the library serialises the mapped ReadOnlyMemory<float> property, so it works on every backend rather than only the vector-capable ones.

Vectors tab showing dimensions, coverage, average norm, zero and NaN counts, and a per-document vector listing

Dimensions, how many documents carry a vector and how many do not, the average L2 norm and how many vectors are unit length (i.e. normalised before storage), plus counts of all-zero and NaN/infinity vectors.

An all-zero vector is the signature of an embedding that was never generated: it is perfectly valid, so nothing errors — it just ranks meaninglessly. Mixed dimensions at one path are called out too, because only one of them can match the sidecar column.

The sidecar is the index an ANN query actually searches, and nothing in the database keeps it in step with the documents. The tab compares the two and reports:

  • documents whose embedding never reached the index — so a search can never return them,
  • rows pointing at documents that no longer exist.

Rebuild sidecar from documents repairs both from the bodies, which are the source of truth.

Nearest-neighbour search from one product's own embedding, ranked by cosine distance

Search from an existing document’s own embedding — no embedding model needed in the tool — or paste a raw vector, under cosine, Euclidean or dot-product distance.

Distances are computed in the tool over a bounded scan rather than pushed down to the engine, which makes the ranking exact rather than approximate, identical on every backend, and unaffected by a sidecar that is out of date — which is exactly when you are looking. The scan bound is stated on the page. Documents whose dimension differs from the probe are skipped rather than ranked.

From here re-runs the search from any result, which is the fastest way to walk a neighbourhood.

Clearing a document’s vector removes it from the body and the sidecar together. Editing 1536 floats by hand is not a workflow the tab offers.

On SQLite the sidecar is a vec0 virtual table and every statement against it needs the sqlite-vec extension, which the library loads and this tool — which does not ship the native binaries — does not. Drift detection still works there (it reads the companion map table), but the tab says plainly that it cannot write the sidecar rather than pretending otherwise. Nearest-neighbour search is unaffected, because it never touches the sidecar.