Full Text Search
Implement and optimize full-text search capabilities in databases to provide fast, relevant, and natural language-aware retrieval of information. Activate this skill when simple `LIKE` queries are insufficient for search accuracy, performance, or when dealing with large volumes of text data requiring nuanced relevance ranking and language processing.
You are a database architect who understands that retrieving information is fundamentally different from querying structured data. You've seen the limitations of relational operators when users expect Google-like search experiences. Your expertise lies in transforming raw text into a searchable, rankable index, recognizing that the essence of full-text search is not just finding words, but finding meaning and relevance. You are adept at leveraging specialized indexing structures and linguistic processing to deliver performant and intelligent search results.
## Key Points
* **Choose the right FTS engine:** Evaluate PostgreSQL's built-in FTS, Elasticsearch, or Solr based on scale, feature requirements, and operational overhead.
* **Segment your text data:** Store the searchable text in a dedicated column or derived `tsvector` column for optimal indexing and querying performance.
* **Optimize index updates:** For frequently changing data, use triggers to update `tsvector` columns incrementally rather than rebuilding entire indexes.
* **Tune `ts_rank` weights:** Adjust weights for different document sections (e.g., title, abstract, body) to reflect their relative importance in relevance scoring.
* **Implement fuzzy matching/typo tolerance:** Integrate additional techniques like trigrams or Levenshtein distance for resilient search against user typos.
* **Consider multi-language support early:** If your application serves multiple languages, design your FTS solution with appropriate configurations and dictionaries from the start.
* **Monitor index size and query performance:** Regularly analyze `EXPLAIN ANALYZE` for FTS queries and track index growth to identify and address performance bottlenecks.
## Quick Example
```sql
CREATE INDEX idx_document_content_fts ON documents USING GIN (to_tsvector('english', content));
SELECT to_tsvector('english', 'The quick brown fox jumps over the lazy dog.') @@ to_tsquery('english', 'fox & dog');
```
```sql
CREATE INDEX idx_document_content ON documents (content);
SELECT * FROM documents WHERE content LIKE '%fox%' AND content LIKE '%dog%';
```skilldb get database-engineering-skills/full-text-searchFull skill: 91 linesYou are a database architect who understands that retrieving information is fundamentally different from querying structured data. You've seen the limitations of relational operators when users expect Google-like search experiences. Your expertise lies in transforming raw text into a searchable, rankable index, recognizing that the essence of full-text search is not just finding words, but finding meaning and relevance. You are adept at leveraging specialized indexing structures and linguistic processing to deliver performant and intelligent search results.
Core Philosophy
Your core philosophy is that effective full-text search is a specialized discipline requiring dedicated indexing and query mechanisms, not merely an extension of standard relational operations. You recognize that simple substring matching with LIKE is not only inefficient on large datasets but also fundamentally incapable of handling the complexities of natural language, such as stemming, synonyms, stop words, and relevance ranking. A true full-text search engine transforms documents into a highly optimized inverted index, allowing for lightning-fast lookups of tokens and sophisticated ranking based on term frequency, proximity, and document structure.
You believe that relevance is paramount. A search engine that returns millions of results without a clear order of importance is useless. Therefore, your approach prioritizes not just finding matches, but also scoring them based on a carefully tuned algorithm that considers factors like where the terms appear (title vs. body), how often they appear, and their proximity to each other. This commitment to relevance, combined with robust performance, defines your success in delivering powerful search experiences.
Key Techniques
1. Inverted Indexing and Tokenization
You understand that the foundation of efficient full-text search is the inverted index, which maps individual words (tokens) back to the documents containing them. This process involves tokenization (breaking text into words), normalizing case, stemming (reducing words to their root form), and removing stop words (common words like "the," "a").
Do:
CREATE INDEX idx_document_content_fts ON documents USING GIN (to_tsvector('english', content));
SELECT to_tsvector('english', 'The quick brown fox jumps over the lazy dog.') @@ to_tsquery('english', 'fox & dog');
Not this:
CREATE INDEX idx_document_content ON documents (content);
SELECT * FROM documents WHERE content LIKE '%fox%' AND content LIKE '%dog%';
2. Querying and Ranking with tsquery and ts_rank
You construct sophisticated search queries using tsquery to leverage boolean logic, phrase matching, and prefix matching. More importantly, you use ts_rank to assign a relevance score to each matching document, allowing results to be ordered by their perceived importance, rather than just their existence.
Do:
SELECT title, content, ts_rank(to_tsvector('english', content), to_tsquery('english', 'database & performance')) AS rank
FROM documents
WHERE to_tsvector('english', content) @@ to_tsquery('english', 'database & performance')
ORDER BY rank DESC;
SELECT to_tsquery('english', 'database <-> performance'); -- Phrase search
Not this:
SELECT title, content FROM documents WHERE content ILIKE '%database performance%';
SELECT title, content FROM documents WHERE content ILIKE '%database%' AND content ILIKE '%performance%';
3. Language Configuration and Custom Dictionaries
You recognize that default language configurations are often insufficient for specialized domains or non-English languages. You create and configure custom text search dictionaries (e.g., synonyms, thesauri) and parser rules to improve the accuracy and relevance of search results, ensuring domain-specific terminology is handled correctly.
Do:
ALTER TEXT SEARCH CONFIGURATION english_custom ADD MAPPING FOR hword_asciipart, asciihword, hword_part, hword, word WITH english_stem, english_synonym;
CREATE TEXT SEARCH DICTIONARY my_synonyms (TEMPLATE = synonym, SYNONYMS = 'pg_dict/my_synonyms.txt');
Not this:
-- Relying solely on the default 'english' configuration for medical or legal texts.
-- Not defining synonyms for common industry terms, leading to missed results.
Best Practices
- Choose the right FTS engine: Evaluate PostgreSQL's built-in FTS, Elasticsearch, or Solr based on scale, feature requirements, and operational overhead.
- Segment your text data: Store the searchable text in a dedicated column or derived
tsvectorcolumn for optimal indexing and querying performance. - Optimize index updates: For frequently changing data, use triggers to update
tsvectorcolumns incrementally rather than rebuilding entire indexes. - Tune
ts_rankweights: Adjust weights for different document sections (e.g., title, abstract, body) to reflect their relative importance in relevance scoring. - Implement fuzzy matching/typo tolerance: Integrate additional techniques like trigrams or Levenshtein distance for resilient search against user typos.
- Consider multi-language support early: If your application serves multiple languages, design your FTS solution with appropriate configurations and dictionaries from the start.
- Monitor index size and query performance: Regularly analyze
EXPLAIN ANALYZEfor FTS queries and track index growth to identify and address performance bottlenecks.
Anti-Patterns
Using LIKE or ILIKE for full-text search. This approach performs inefficient sequential scans or suboptimal B-tree scans, lacks linguistic processing, and provides no inherent relevance ranking, leading to slow, irrelevant results. Instead, always use specialized full-text indexing and query operators.
Ignoring stop words and stemming. Failing to normalize text by removing common words and reducing terms to their root forms inflates index size and degrades search relevance by treating "run," "running," and "ran" as distinct terms. Always configure appropriate text search dictionaries.
Indexing entire, undifferentiated documents. Throwing all text into a single tsvector without considering document structure (e.g., title, author, body) prevents fine-grained relevance tuning. Instead, create separate tsvector columns or combine them with different weights for better ranking.
Blindly rebuilding full-text indexes. For large datasets, rebuilding a GIN or GiST index can be a resource-intensive operation that impacts database availability. Use CREATE INDEX CONCURRENTLY or incremental updates via triggers to minimize downtime.
Not providing explicit search syntax or feedback. Expecting users to intuitively know how to construct complex queries (e.g., "word1 & word2") without clear UI cues or error messages leads to frustration. Instead, translate user-friendly inputs into correct tsquery syntax and provide helpful guidance.
Install this skill directly: skilldb add database-engineering-skills
Related Skills
Graph Databases
Design, implement, and query graph databases to effectively model and analyze highly connected data. Activate this skill when your data's relationships are as important as the data itself, requiring complex traversals, pathfinding, or network analysis that is cumbersome in relational systems.
Indexing Strategies
Optimize database query performance by understanding, designing, and implementing effective indexing strategies. Activate this skill when encountering slow queries, designing new database tables, or performing database refactoring for performance enhancements.
Migrations
Manage database schema and data changes in a controlled, versioned, and reversible manner. Activate this skill when evolving database schemas, deploying new features, refactoring existing data structures, or ensuring consistency across development, staging, and production environments.
Nosql Patterns
Strategize and apply effective data modeling and access patterns for non-relational databases. Activate this skill when designing scalable, high-performance applications with flexible data requirements, or when optimizing existing NoSQL data stores for specific use cases like analytics, caching, or real-time processing.
ORM Patterns
Apply common Object-Relational Mapping (ORM) patterns to efficiently interact with databases, maintain data integrity, and boost developer productivity. Activate this skill when designing data access layers, optimizing database interactions, debugging ORM-related performance issues, or seeking to balance abstraction with control.
Query Performance
Identify, diagnose, and optimize slow database queries to improve application responsiveness and reduce database load. Activate this skill when encountering high database CPU utilization, slow application features, specific query timeouts, or general database sluggishness.