Sling Academy
Home/SQLite/Executing Full-Text Queries in SQLite Using MATCH

Executing Full-Text Queries in SQLite Using MATCH

Last updated: December 07, 2024

SQLite is a popular lightweight database engine integrated with many applications. It provides comprehensive support for full-text search (FTS) operations via its FTS5 extension, which is particularly useful when you need database indexes for speeding up complex queries searching large texts. In this article, we will explore how to execute full-text queries using the MATCH operator in SQLite.

Understanding Full-Text Search (FTS)

Full-text search allows users to write queries that match phrases, single words, or boolean patterns in a text field of a database. Unlike normal LIKE queries that search for exact substrings, FTS is designed to help you search large bodies of text efficiently.

Why Use Full-Text Search?

Full-text search is versatile and exceedingly powerful for applications that must manage and retrieve information rapidly from vast amounts of unstructured data, such as articles, blog posts, or any form of textual content.

Setting Up FTS in SQLite

To use full-text search, you must first create a virtual table with one of the FTS modules provided by SQLite. For FTS5, you create a virtual table with the CREATE VIRTUAL TABLE statement like this:

CREATE VIRTUAL TABLE articles USING fts5(title, body);

In this example, the virtual table 'articles' is being set up to hold texts in its 'title' and 'body' columns ready for full-text searching.

Inserting Data into FTS Table

Once the table is set up, you can insert data like any regular SQLite table:

INSERT INTO articles (title, body) VALUES
  ('SQLite Basics', 'SQLite is a C library that provides a lightweight disk-based database.'),
  ('Advanced SQLite', 'Learn advanced features and tips.'),
  ('SQLite Full-Text Search', 'Comprehensive guide to full-text search in SQLite.');

Performing Full-Text Queries Using MATCH

One of the primary advantages of SQLite’s FTS extension is the simple yet powerful MATCH query operator that helps you find records containing certain words or phrases.

For instance, to search for articles with 'SQLite' in either their title or body, the query is as follows:

SELECT * FROM articles WHERE articles MATCH 'SQLite';

This query returns all rows in the 'articles' table where the term 'SQLite' matches the contents of either the 'title' or 'body' columns.

Advanced Search Patterns

The MATCH operator can parse boolean space-separated terms and phrases encapsulated within double quotes. Here are some advanced query examples:

  • Find articles with the exact phrase 'full-text search':
SELECT * FROM articles WHERE articles MATCH '"full-text search"';
  • Search for articles containing either 'guide' or 'features':
SELECT * FROM articles WHERE articles MATCH 'guide OR features';
  • Find articles containing 'SQLite' but not 'basics':
SELECT * FROM articles WHERE articles MATCH 'SQLite NOT basics';

Using External Tokens and Triggers

SQLite FTS provides more depth by allowing customization and dynamic updating of tables using supported automatic triggers on texts.

Couple FTS with application-side logic for stepping up the database or integrating linguistic analysis tools by utilizing external tokenizers.

To update the full-text index with triggers each time an insert or a change occurs, you can do:

-- Enable triggers for the articles FTS table
CREATE TRIGGER after_insert AFTER INSERT ON articles BEGIN
  INSERT INTO articles_fts (rowid, title, body) VALUES (new.rowid, new.title, new.body);
END;

Conclusion

By using SQLite's FTS and MATCH operator effectively, you can execute searches at unprecedented speed on large text collections. Whether you're working with documentation, news articles, or domain-specific vocabularies, SQLite FTS offers a robust solution suitable for many application needs.

Next Article: How to Use MATCH for Powerful Text Queries in SQLite

Previous Article: Setting Language Options for Full-Text Search in SQLite

Series: Full-Text Search with SQLite

SQLite

You May Also Like

  • How to use regular expressions (regex) in SQLite
  • SQLite UPSERT tutorial (insert if not exist, update if exist)
  • What is the max size allowed for an SQLite database?
  • SQLite Error: Invalid Value for PRAGMA Configuration
  • SQLite Error: Failed to Load Extension Module
  • SQLite Error: Data Type Mismatch in INSERT Statement
  • SQLite Warning: Query Execution Took Longer Than Expected
  • SQLite Error: Cannot Execute VACUUM on Corrupted Database
  • SQLite Error: Missing Required Index for Query Execution
  • SQLite Error: FTS5 Extension Malfunction Detected
  • SQLite Error: R-Tree Node Size Exceeds Limit
  • SQLite Error: Session Extension: Invalid Changeset Detected
  • SQLite Error: Invalid Use of EXPLAIN Statement
  • SQLite Warning: Database Connection Not Closed Properly
  • SQLite Error: Cannot Attach a Database in Encrypted Mode
  • SQLite Error: Insufficient Privileges for Operation
  • SQLite Error: Cannot Bind Value to Parameter
  • SQLite Error: Maximum String or Blob Size Exceeded
  • SQLite Error: Circular Reference in Foreign Key Constraints