Skip to content
Tech Stack23 June 2026 · 7 min readUpdated 10 October 2026

SaaS Search in 2026: Postgres FTS vs Algolia vs Typesense

Postgres FTS works until your users expect typo tolerance and facets. Where Typesense fits, what Algolia's listed prices add up to, and how to isolate tenant search data safely.

SaaS Search in 2026: Postgres FTS vs Algolia vs Typesense

What you'll learn

  • When is Postgres full-text search enough for SaaS search?
  • Is Typesense better than Postgres FTS for customer-facing search?
  • How much do Algolia and Typesense cost for SaaS search?
Article contents

Every SaaS team building search faces the same decision, and plenty make it in the wrong order. They reach for Elasticsearch because it's the canonical answer, or wire up Algolia before testing whether Postgres could carry the workload. Your first action: write down your ten most common real queries, including two with typos, and run them against your current database. Keep that list for the rest of this post.

I haven't shipped a dedicated search engine in any project described on this site, so this comparison comes from vendor and PostgreSQL documentation, rechecked on 10 October 2026. Numbers I couldn't verify on a primary page are left out. If your app already uses Postgres, "is our existing database enough?" is the first useful question.

Postgres full-text search is enough when your catalog is modest, queries are mostly exact keywords, and typo tolerance or instant faceting isn't something users judge you on.

Postgres full-text search returns exact keyword matches while a mistyped query misses the indexed documents

The Supabase team benchmarked Postgres FTS against SQLite FTS5, Typesense, MeiliSearch and OpenSearch on a 32MB movie dataset. They concluded Postgres FTS is "quite close performance-wise" to the others for this basic case. In their numbers, a query for "love" returned 5,417 results in 19.09 ms, and "super hero" returned 34 in 3.13 ms. The same article found that only Typesense and MeiliSearch handled misspellings, and the Postgres query for "suprman" returned nothing. That is one small dataset, so treat it as a scope statement, not a guarantee for your data.

The implementation is small: a `tsvector` column, a GIN index and a query built with `websearch_to_tsquery`. The PostgreSQL 18 docs call GIN the preferred text search index type, and GIN is not lossy, unlike GiST. Good fits are internal admin search, ticket subjects, article titles and project names.

Where does it stop working?

The limits show up when the requirement list grows. These are the ones I'd watch:

  • Typo tolerance. `pg_trgm`, documented in the Postgres docs, adds similarity matching and index support for LIKE and ILIKE, so `ILIKE '%query%'` can be indexed with a trigram index. It works, but it's another extension to tune.
  • Ranking. The ranking docs warn that ranking can be expensive because it reads the `tsvector` of every matching document, which can be I/O bound.
  • Facets with live counts, instant search on every keystroke, and ranking by click signals. You build these yourself with GROUP BY and custom expressions.

Two smaller details from the docs help you size the risk. The `%` operator in `pg_trgm` uses a configurable similarity threshold that defaults to 0.3, so fuzzy matching needs tuning against your own data. And the text search limitations page caps a `tsvector` at less than 1 megabyte, which matters only if you index very large documents.

If you run on Supabase + Stripe, the tsvector-plus-GIN route keeps B2B SaaS search inside a stack you already operate. The SQL is small; validating ranking, tenant filters and real user queries is the part that takes time. Start there and migrate when the gap appears in your support queue, not before.

Typesense is better when customers judge search quality directly, because typo tolerance, prefix search and faceting are built into the engine and its defaults are documented.

A dedicated search index handles approximate queries and returns ranked results with facet filters

The Typesense search parameters default `num_typos` to 2 for every queried field and `prefix` to true, so typo-tolerant, as-you-type matching works without configuration. Field order in `query_by` sets weight unless you pass explicit `query_by_weights`, and `_text_match` breaks ties when you sort by other fields.

Typesense's own comparison page describes the design as instant search for data sets that fit in RAM. That's a vendor statement, and the practical consequence is worth checking: size memory for the index and growth, not only the raw document size.

For uptime, the high availability guide says Typesense uses Raft and needs at least 3 nodes to survive one node failure. Reads are served by whichever node gets them, and writes are forwarded to the leader. If a cluster loses quorum, it stops accepting reads and writes until someone intervenes, which is a real operational duty to plan for.

What about Meilisearch? It may be a good fit too, but a fair fourth-way comparison needs its current high-availability and hosting requirements checked separately. Test the same ten queries before you shortlist any engine.

What changes when search leaves Postgres?

A dedicated index is a copy of your product data, not the source of truth. Plan how creates, edits and deletes reach it; how you retry failed indexing jobs; and how you rebuild after a bug. Measure the delay between a database write and a searchable result. For permissions, index only fields users are allowed to discover, and treat tenant and role checks as mandatory at query time. If a user loses access, stale search results must not keep revealing titles or snippets while the index catches up. That operational work belongs in the migration estimate alongside search quality.

Algolia bills search requests and records, while Typesense is free to self-host and Typesense Cloud bills dedicated clusters hourly by RAM and CPU, so the gap grows with query volume.

A concrete scale balanced on a triangular fulcrum with a matte grey block on the left and a solid electric cyan block on the right against a brutalist backdrop

The Algolia pricing page lists a Free plan with 10K search requests per month. Grow includes 10K requests and then charges $0.50 per additional 1K, plus $0.40 per additional 1K records above 100K. Grow Plus charges $1.75 per additional 1K requests. The same page lists 50K records on the Free plan. The enterprise tier is custom-priced with volume discounts and a listed 99.99% availability. The October 2, 2025 announcement introduced Grow Plus with AI synonyms, AI ranking, advanced personalization, query categorization and collections, and says Algolia powers 1.75 trillion searches a year.

ItemAlgolia GrowAlgolia Grow PlusTypesense
Price per extra 1K searches$0.50$1.75No per-search fee; you pay for infrastructure
Illustrative 5M searches/monthabout $2,495about $8,733Depends on node size
Self-hostingNo (SaaS only)No (SaaS only)Yes
Typo tolerance and facetsYesYesYes

The illustrative row is my arithmetic on the listed rates: (5,000,000 minus 10,000 included) divided by 1,000, times the per-1K price, ignoring record charges. Typesense Cloud rates depend on the cluster you size, so I left a figure out. Get a quote for your own RAM and CPU.

Algolia earns its price when search is a conversion lever and someone on your team tunes ranking, such as an e-commerce catalog. A project management or clinic tool usually has no merchandising team. There, Typesense's infrastructure-based billing may fit better, but that is a judgment to test against your real query volume.

You isolate tenants by forcing a tenant filter on every query, either structurally in SQL or cryptographically through scoped keys in a dedicated engine.

A search gateway can reach one tenant's index while the neighboring tenant collections stay behind access boundaries

In Postgres, every query carries a `WHERE tenant_id = $1` filter, and RLS policies can enforce it at the database level. With a dedicated engine you build isolation explicitly. Three patterns, in ascending operational cost (the multi-tenant SaaS tools list covers the wider shortlist):

  1. Shared collection with scoped keys. Generate a search-only parent key, then derive one key per tenant. The Typesense docs say scoped keys are an HMAC-SHA256 digest of embedded parameters, and embedded `filter_by` can't be overridden by the client. Never expose the main search key client-side. Algolia's secured API keys work the same way: generated on your backend, with filters users can't alter.
  2. Separate collection per tenant. Hard isolation, simpler mental model, more schema management as tenants multiply.
  3. Separate cluster per tenant. Reserved for contracts with strict isolation requirements, since cost scales with tenant count.

On Callidus, a React + Firebase + Stripe Connect clinic SaaS built solo between February and April 2026, the case study documents everything under `tenants/{tenantId}/…` in Firestore, with JWT claims carrying `tenantId` and `role` and Firestore rules gating access. It has 14 onboarded tenants per the case study. It isn't a Postgres product, so the FTS question doesn't apply there, but the isolation rule is identical: scope every query by tenant. BookBed is a Flutter + Firebase + Stripe property management product; the case study doesn't describe a search layer, so I make no search claim about it.

Which ranking signals are worth adding first?

Add recency, popularity and field weighting, in that order of effort. In Postgres, `setweight` labels parts of a document A to D (defaults 1.0 for A down to 0.1 for D) and `ts_rank` uses them. In Typesense, put the field you want weighted most first in `query_by` or pass `query_by_weights`, and combine `_text_match` with a numeric field such as a view count in `sort_by`. Facet queries on Postgres run as GROUP BY against the same database as your writes, which is a workload separation question before it's a capability gap.

Your next step: run `EXPLAIN ANALYZE` on your current search query, then run the typo queries from your list. If several return nothing useful, prototype Typesense with scoped keys on a copy of your data and compare the same list.

Free resource

Free SaaS MVP Scope Template

A Notion document with the full feature checklist, MVP vs. nice-to-have table, pre-build questions, and cost signals — so you walk into any developer call knowing exactly what to ask for.

Get the template →
DL

Dusko Licanin

Full-Stack Developer · Banja Luka, Bosnia

Full-stack developer shipping SaaS MVPs, web apps, and mobile apps using AI-augmented workflows — without agency coordination overhead. Live portfolio: BookBed, Callidus, Pizzeria Bestek.

Frequently Asked Questions

When should a SaaS team move from Postgres FTS to a dedicated search engine?

Move when you keep writing workaround code for typos, instant search or live facet counts, because that signals a tool mismatch rather than a tuning problem. I can't give you a verified record-count threshold, since the benchmark I read used a 32MB movie dataset and concluded Postgres FTS was quite close performance-wise to the dedicated engines for a basic case. Only Typesense and MeiliSearch handled misspellings in that test. Write down your ten most common real queries, including typos, run them on your current Postgres setup, and migrate when the failures show up in support tickets. The Supabase benchmark is a useful scope reference.

Can Postgres handle typo-tolerant search with pg_trgm?

Yes, pg_trgm adds fuzzy matching to Postgres, but it is another extension to tune. The Postgres documentation says pg_trgm provides similarity functions, index support for LIKE and ILIKE, and a % operator with a configurable similarity threshold that defaults to 0.3. That can cover simple typo cases without a new service. What it doesn't give you is an engine built around instant search, live facet counts or click-based ranking, so you assemble those yourself. See the pg_trgm documentation and test it on your own data before deciding a dedicated engine is needed.

How do you isolate tenants in Typesense?

Use scoped search API keys: create a parent key with only the documents:search permission, then derive one key per tenant with an embedded filter_by on the tenant ID. Typesense's docs say the key is an HMAC-SHA256 digest of the embedded parameters and that the client can't override the embedded filter. Never expose the main search key client-side, because it would let users query all documents. Generate the tenant keys on your server. Algolia's secured API keys follow the same idea with filters users can't alter. For stricter contracts, consider a collection or cluster per tenant, per the Typesense API keys docs.

How much does Algolia cost compared with self-hosted Typesense?

Algolia charges per search request and per record, while self-hosted Typesense has no per-search fee and you pay for the servers. On Algolia's pricing page, Grow includes 10K requests, then $0.50 per additional 1K requests, and Grow Plus charges $1.75 per additional 1K. At 5 million searches a month that is about $2,495 on Grow and about $8,733 on Grow Plus before record charges, which is my arithmetic on the listed rates. Typesense Cloud bills dedicated clusters hourly by RAM and CPU, so get a quote for your index size. Check the current Algolia pricing before budgeting.