SearchFn
ReferenceAdapters

Postgres Adapter

Production-grade full-text search using Postgres tsvector.

The Postgres Adapter uses native Postgres full-text search (tsvector/tsquery) for production-grade search with no additional infrastructure beyond your existing database.

When to Use

  • Production apps already running Postgres
  • Server-side search that needs SQL-level durability and transactions
  • Moderate document volumes where a dedicated search engine is unnecessary

Installation

npm install @searchfn/adapters

Setup

The adapter requires search tables and indexes in your Postgres database. Run the migration SQL shipped with the package:

import { getPostgresMigrationSQL } from "@searchfn/adapters";

const sql = getPostgresMigrationSQL();
// Execute this SQL against your database to create required tables and indexes

Usage

import { PostgresAdapter } from "@searchfn/adapters";

const adapter = new PostgresAdapter({
  connectionString: process.env.SEARCH_DB_URL!,
  schema: "public",
  queryTimeoutMs: 15000,
});

await adapter.initialize({
  resources: [{ name: "tasks", searchFields: ["title", "description"] }],
});

await adapter.index({
  resource: "tasks",
  documents: [
    { id: "t-1", fields: { title: "Ship docs", description: "Write the guide" } },
  ],
});

const ids = await adapter.search({ resource: "tasks", query: "docs" });

Configuration

OptionTypeDefaultDescription
connectionStringstringRequired. Postgres connection string (DSN).
schemastring"public"Target database schema.
queryTimeoutMsnumber30000Timeout for individual queries.
maxBatchSizenumber10000Maximum documents per index batch.
retry.maxRetriesnumber2Retry attempts for transient failures.
retry.baseDelayMsnumber100Base delay between retries (with jitter).
retry.maxDelayMsnumber5000Maximum delay between retries.
loggerPostgresAdapterLoggerOptional adapter-level logger.

Capabilities

CapabilitySupported
persistentYes
searchAllYes
fuzzyYes
fieldBoostsNo

Behavior

  • Uses Postgres native tsvector full-text search.
  • Supports bounded retries with exponential backoff and jitter for transient database failures.
  • index operations use batch inserts up to maxBatchSize.
  • Keep connection strings in a secure secret store — never hardcode them.