Docspgvector

pgvector Integration

Native vector similarity search for AI-powered applications, semantic search, and RAG pipelines.

Overview

Postrust provides native support for pgvector, enabling vector similarity search directly through your REST and GraphQL APIs. Build AI-powered applications with:

  • Semantic search using embeddings
  • Product recommendations
  • RAG (Retrieval Augmented Generation) pipelines
  • Image similarity search
  • Document clustering

Setup

SQL
-- Enable pgvector extension
CREATE EXTENSION IF NOT EXISTS vector;

-- Create table with vector column
CREATE TABLE documents (
  id SERIAL PRIMARY KEY,
  title TEXT NOT NULL,
  content TEXT,
  embedding vector(1536)  -- OpenAI dimensions
);

-- Create index for fast similarity search
CREATE INDEX ON documents
  USING ivfflat (embedding vector_cosine_ops)
  WITH (lists = 100);

REST API

cURL
# Insert document with embedding
curl -X POST "localhost:3000/documents" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Introduction to Rust",
    "content": "Rust is a systems programming language...",
    "embedding": [0.1, 0.2, 0.3, ...]
  }'

# Search similar documents via RPC
curl -X POST "localhost:3000/rpc/search_similar" \
  -H "Content-Type: application/json" \
  -d '{
    "query_embedding": [0.1, 0.2, ...],
    "match_count": 10
  }'

Similarity Search Function

Create a PostgreSQL function for semantic search:

SQL
CREATE OR REPLACE FUNCTION search_similar(
  query_embedding vector(1536),
  match_count int DEFAULT 10,
  match_threshold float DEFAULT 0.8
)
RETURNS TABLE (
  id int,
  title text,
  content text,
  similarity float
)
LANGUAGE sql STABLE
AS $$
  SELECT
    documents.id,
    documents.title,
    documents.content,
    1 - (documents.embedding <=> query_embedding) AS similarity
  FROM documents
  WHERE 1 - (documents.embedding <=> query_embedding) > match_threshold
  ORDER BY documents.embedding <=> query_embedding
  LIMIT match_count;
$$;

GraphQL API

GraphQL
# Query documents with embeddings
query {
  documents {
    id
    title
    embedding
  }
}

# Similarity search via RPC
query SearchSimilar($embedding: [Float!]!) {
  searchSimilar(queryEmbedding: $embedding, matchCount: 10) {
    id
    title
    content
    similarity
  }
}

Distance Operators

OperatorDescriptionUse Case
<->L2 distance (Euclidean)General purpose
<#>Negative inner productNormalized vectors
<=>Cosine distanceText embeddings

Index Types

IVFFlat

Faster build, less memory. Good for most use cases.

USING ivfflat (embedding vector_cosine_ops)

HNSW

More accurate, faster queries. Slower to build.

USING hnsw (embedding vector_cosine_ops)