VibORM
Fields

Vector Field

Vector field type for embeddings and similarity search

Vector Field

The Vector field type stores numerical vectors for AI/ML embeddings and similarity search.

Vector fields are primarily supported in PostgreSQL with the pgvector extension.

Basic Usage

import { s } from "viborm";

s.vector()               // Required number[]
s.vector().nullable()    // number[] | null

Chainable Methods

s.vector()
  .nullable()           // Allow NULL
  .default([])          // Default value
  .map("column_name")   // Custom column name

Type Mapping

ModifierTypeScriptPostgreSQLMySQLSQLite
s.vector()number[]vectorN/AN/A
.nullable()number[] | nullvector NULLN/AN/A

PostgreSQL Setup

Enable the pgvector extension:

CREATE EXTENSION IF NOT EXISTS vector;

Examples

// OpenAI embedding (1536 dimensions)
const embedding = s.vector();

// Nullable embedding
const optionalEmbedding = s.vector().nullable();

Complete Example

const document = s.model({
  id: s.string().id().ulid(),
  content: s.string(),
  embedding: s.vector(),  // Store embedding
  createdAt: s.dateTime().now(),
}).map("documents");

// Store a document with embedding
await client.document.create({
  data: {
    content: "Hello, world!",
    embedding: [0.1, 0.2, 0.3, ...], // 1536 floats for OpenAI
  }
});

Vector similarity search is typically done with raw SQL or a specialized query:

// Using raw SQL for cosine similarity
const similar = await client.$queryRaw`
  SELECT id, content, 1 - (embedding <=> ${queryVector}::vector) as similarity
  FROM documents
  ORDER BY embedding <=> ${queryVector}::vector
  LIMIT 10
`;

Vector Dimensions

ModelDimensions
OpenAI text-embedding-ada-0021536
OpenAI text-embedding-3-small1536
OpenAI text-embedding-3-large3072
Cohere embed-english-v3.01024
sentence-transformers384-768

Indexing Vectors

For efficient similarity search, create an index:

-- HNSW index (recommended for most cases)
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);

-- IVFFlat index (for very large datasets)
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops)
  WITH (lists = 100);

Distance Functions

OperatorFunctionUse Case
\<->L2 distanceGeneral
\<#>Inner productNormalized vectors
\<=>Cosine distanceText embeddings

When to Use Vector

Use CaseRecommendation
Semantic searchVector embeddings
Image similarityVector embeddings
RecommendationVector embeddings
Full-text searchPostgreSQL tsvector or dedicated search
Exact matchingRegular fields with indexes

On this page