В большинстве современных сборок SQLite FTS уже включён. Иногда проверить можно запросом к таблице pragma_module_list (но в ранних версиях FTS3, FTS4 или даже FTS5 бывают включены, но эта таблица отсутствует)
SELECT name FROM pragma_module_list;
Для поиска слов, содержащих спецсимволы, фразу для поиска необходимо заключать в кавычки(!)
Статичную базу данных можно индексировать вручную
CREATE VIRTUAL TABLE fts_articles USING fts5( id, title, article, href);
INSERT INTO "fts_articles" SELECT id, title, articles, href FROM articles WHERE news=1;
search.php: $result = $m_db->query( "SELECT DISTINCT id, href, title FROM fts_articles WHERE fts_articles MATCH '" . $search . "' ORDER BY title");
Для автоматического обновления индексов необходимо создать триггеры, переопределив разделитель SQL-команд (см. Ошибка incomplete input при создании триггера в SQLite)
CREATE VIRTUAL TABLE fts_articles USING fts5(title, article, href, news, content='articles', content_rowid='id');
CREATE TRIGGER articles_ai AFTER INSERT ON articles BEGIN
INSERT INTO fts_articles(rowid, title, article, href, news) VALUES (new.id, new.title, new.article, new.href, new.news);
END$
CREATE TRIGGER articles_ad AFTER DELETE ON articles BEGIN
INSERT INTO fts_articles(fts_articles, rowid, title, article, href, news) VALUES('delete', old.id, old.title, old.article, old.href, old.news);
END$
CREATE TRIGGER articles_au AFTER UPDATE ON articles BEGIN
INSERT INTO fts_articles(fts_articles, rowid, title, article, href, news) VALUES('delete', old.id, old.title, old.article, old.href, old.news);
INSERT INTO fts_articles(rowid, title, article, href, news) VALUES (new.id, new.title, new.article, new.href, new.news);
END$
Заполнить таблицу articles заново
CREATE TABLE t123(id, title, article, href, created, updated, news);
INSERT INTO t123 SELECT * FROM articles;
DELETE * FROM articles;
INSERT INTO articles SELECT * FROM t123;
Linux-5.4 box 3.8.13-tinycore Wed Sep 4 16:43:16 MSK 2026