2026-09-04

В большинстве современных сборок 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