pg-smart-search
Examples

Examples

Real-world implementation patterns and code snippets for integrating pg-smart-search into your application.

Examples

Practical implementations of pg-smart-search in common frameworks and use cases.

Next.js API Route

Create a search API endpoint in your Next.js App Router application.

import { NextRequest, NextResponse } from next/server;
import { TrigramSearchEngine, MemoryCacheProvider } from pg-smart-search;
import { dbAdapter } from @/lib/db;

const engine = new TrigramSearchEngine(dbAdapter, {
  tableName: posts,
  searchColumns: [title, content],
  cacheProvider: new MemoryCacheProvider(),
});

export async function GET(request: NextRequest) {
  const searchParams = request.nextUrl.searchParams;
  const query = searchParams.get(q);
  const cursor = searchParams.get(cursor);

  if (!query) {
    return NextResponse.json({ error: Query parameter "q" is required }, { status: 400 });
  }

  const results = await engine.search({
    query,
    cursor: cursor || undefined,
    limit: 20,
  });

  return NextResponse.json(results);
}
import type { NextApiRequest, NextApiResponse } from next;
import { TrigramSearchEngine, MemoryCacheProvider } from pg-smart-search;
import { dbAdapter } from @/lib/db;

const engine = new TrigramSearchEngine(dbAdapter, {
  tableName: posts,
  searchColumns: [title, content],
  cacheProvider: new MemoryCacheProvider(),
});

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  if (req.method !== GET) return res.status(405).end();

  const { q, cursor } = req.query;

  if (!q || typeof q !== string) {
    return res.status(400).json({ error: Query parameter "q" is required });
  }

  const results = await engine.search({
    query: q,
    cursor: (cursor as string) || undefined,
    limit: 20,
  });

  return res.status(200).json(results);
}

E-Commerce Product Search with Filters

Implement a product search that supports filtering by category and price range.

import { TrigramSearchEngine } from "pg-smart-search";

const engine = new TrigramSearchEngine(adapter, {
  tableName: "products",
  searchColumns: ["name", "description"],
  ftsColumn: "search_vector",
});

const results = await engine.search({
  query: "wireless headphones",
  filters: {
    category: "electronics", // Injection-safe filter key
    price_range: "[50,200]",
  },
  limit: 20,
});

Pagination with Infinite Scroll

Implement cursor-based pagination for a frontend infinite scroll component.

// Initial Fetch
const firstPage = await engine.search({
  query: "laptop",
  limit: 15,
});

// Subsequent Fetch
const nextPage = await engine.search({
  query: "laptop",
  limit: 15,
  cursor: firstPage.pagination.nextCursor, // Pass the cursor from the previous result
});

if (!nextPage.pagination.hasMore) {
  console.log("Reached the end of results");
}