Skip to content

Search

Search

The search module provides full-text search with a consistent API across multiple backends. Start with SQLite FTS for zero-infrastructure search and upgrade to Meilisearch or Typesense when you need more power.

Import

import { createSearch } from '@loewen-digital/fullstack/search'

Basic usage

import { createSearch } from '@loewen-digital/fullstack/search'
const search = createSearch({
driver: 'sqlite-fts',
db: dbInstance,
})
// Index a document
await search.index('posts').upsert({
id: '1',
title: 'Getting Started with Fullstack',
body: 'A guide to setting up @loewen-digital/fullstack...',
})
// Search
const results = await search.index('posts').search('fullstack guide')
// results.hits — array of matching documents
// results.total — total number of matches

Bulk indexing

const posts = await db.query.posts.findMany()
await search.index('posts').upsertMany(
posts.map((p) => ({ id: String(p.id), title: p.title, body: p.body }))
)

Filtering and sorting

const results = await search.index('posts').search('typescript', {
filter: 'status = published',
sort: ['publishedAt:desc'],
limit: 20,
offset: 0,
})

Removing documents

await search.index('posts').delete('1')
await search.index('posts').deleteAll()

Driver options

DriverDescription
sqlite-ftsSQLite FTS5 full-text search. Zero infrastructure required.
meilisearchMeilisearch. Requires meilisearch npm package.
typesenseTypesense. Requires typesense npm package.

Config options

OptionTypeDefaultDescription
driver'sqlite-fts' | 'meilisearch' | 'typesense'Search driver
dbDbInstanceDatabase instance (required for sqlite-fts)
meilisearch.hoststringMeilisearch server URL
meilisearch.apiKeystringMeilisearch master/search key
typesense.nodesNode[]Typesense server nodes
typesense.apiKeystringTypesense API key