ReviseAlgo Logo

Advanced PostgreSQL

PostgreSQL Extensions and Full-Text Search

Using specialized plugins and query matchers.

Last Updated: June 15, 202612 min read

1. Introduction

PostgreSQL's extension system lets you add new data types, operators, index methods, and functions without forking the database. Key extensions include pg_trgm (trigram similarity), uuid-ossp (UUID generation), PostGIS (geospatial), and pgvector (vector similarity for AI). Built-in Full-Text Search (FTS) provides inverted-index-based text search with ranking, stemming, and phrase matching — often eliminating the need for external search engines like Elasticsearch.

2. Why It Matters

Extensions let PostgreSQL serve as a multi-model database — handling geospatial queries, vector similarity search for ML, and full-text search without additional infrastructure. Full-Text Search processes millions of documents with sub-second search latency, supports natural language ranking (tf-idf), and integrates with GIN indexes for O(log n) lookups.

3. Real-World Analogy

Extensions are like apps on a smartphone — the base phone (PostgreSQL) handles calls and texts, but you install apps (extensions) for maps (PostGIS), music (pgvector), or messaging (pg_trgm). Full-Text Search is like having a built-in search engine that indexes every word in your documents and ranks results by relevance, similar to how Google indexes web pages.

4. How It Works

Full-Text Search converts text into a tsvector (a sorted list of lexemes — normalized words) and queries use tsquery (boolean expressions of lexemes):

  • to_tsvector('english', text): Parses, lowercases, removes stop words, stems words ("running" becomes "run").
  • to_tsquery('english', 'fat & rat'): Creates a boolean query matching documents containing both "fat" and "rat".
  • @@ operator: Matches tsvector against tsquery.
  • ts_rank / ts_rank_cd: Ranks results by relevance using term frequency and proximity.
  • GIN index on tsvector: Provides fast lookups by lexeme.

5. Internal Architecture

Extensions are installed with CREATE EXTENSION and register objects in the pg_extension catalog. FTS uses a text search configuration (language-specific dictionaries, thesaurus, and stop words). The GIN index stores an inverted mapping from lexemes to document IDs. At query time, the index returns candidate documents, which are then ranked and filtered. pg_trgm adds trigram-based GIN/GiST indexes for fuzzy LIKE queries.

6. Visual Explanation

The diagram shows the FTS pipeline: raw text flows through a parser, then a dictionary (stemming/stop words), producing a tsvector. Queries use tsquery with boolean operators, matched against the GIN index, then ranked by ts_rank.

7. Practical Example

8. Common Mistakes

  • Computing tsvector on every query: Store tsvector as a generated column with a GIN index instead of calling to_tsvector in WHERE.
  • Wrong text search configuration: Using 'simple' instead of 'english' skips stemming and stop word removal, giving poor relevance.
  • Not using setweight: Title matches should rank higher than body matches — use weights (A, B, C, D) for different columns.
  • Missing pg_trgm index for LIKE: WHERE name LIKE '%john%' can't use B-tree indexes. Add a GIN trigram index.

9. Quick Quiz

Q1: What does setweight(tsvector, 'A') do?

A) Encrypts the vector   B) Assigns highest relevance weight   C) Compresses the vector   D) Sorts lexemes

Answer: B) Assigns highest relevance weight (A > B > C > D)

10. Scenario-Based Challenge

Build a search feature for a blog with 1 million posts. Requirements: search titles and body with relevance ranking, title matches weighted higher, support phrase search with <-> (followed-by) operator, and fuzzy fallback for typos using pg_trgm. Benchmark query time and ensure it's under 50ms.

11. Debugging Exercise

12. Interview Questions

  • Q: When would you use PostgreSQL FTS vs Elasticsearch?
    A: PostgreSQL FTS is sufficient for moderate-scale search (<10M documents) with simple ranking needs. Elasticsearch is better for complex aggregations, faceted search, or when you need sub-10ms latency on very large corpora with advanced NLP features.
  • Q: What is the purpose of pg_trgm extension?
    A: It provides trigram-based similarity matching for fuzzy string comparison. It enables GIN/GiST indexes for LIKE '%...%' queries and the % (similarity) operator for typo-tolerant matching.

13. Production Considerations

  • GIN index updates: GIN indexes use a pending list for fast inserts. Run REINDEX periodically or set fastupdate = off for read-heavy workloads.
  • Text search configuration: Match the language config to your content. Use pg_ts_config to create custom configs with domain-specific dictionaries.
  • pgvector for AI: The pgvector extension enables vector similarity search (cosine, L2) for embedding-based RAG applications directly in PostgreSQL.
  • Extension security: Only install trusted extensions. Superuser privileges are required for CREATE EXTENSION.