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");
}