first commit
This commit is contained in:
68
database/migrations/006_create_posts_fts.php
Normal file
68
database/migrations/006_create_posts_fts.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Migration 006 — Création de l'index FTS5 pour la recherche plein texte.
|
||||
*
|
||||
* Crée une table virtuelle FTS5 `posts_fts` indexant le titre, le contenu
|
||||
* et le nom de l'auteur de chaque article. Le rowid de la table FTS correspond
|
||||
* à l'id de l'article dans `posts`.
|
||||
*
|
||||
* Trois triggers maintiennent la synchronisation automatique entre `posts`
|
||||
* et `posts_fts` à chaque INSERT, UPDATE et DELETE.
|
||||
*
|
||||
* La colonne `author_username` est résolue par sous-requête lors de l'écriture
|
||||
* dans le trigger, ce qui évite de stocker une valeur dénormalisée en dehors
|
||||
* de l'index FTS (dont le seul rôle est la recherche).
|
||||
*
|
||||
* Le contenu HTML est passé par `strip_tags()` (fonction PHP enregistrée sur la
|
||||
* connexion PDO via `sqliteCreateFunction`) avant indexation, afin d'éviter que
|
||||
* les balises et attributs HTML ne polluent l'index et ne génèrent du bruit.
|
||||
*
|
||||
* Tokenizer utilisé : unicode61 (défaut FTS5) — gère les diacritiques et les
|
||||
* caractères non-ASCII, insensible à la casse.
|
||||
*/
|
||||
return [
|
||||
'up' => "
|
||||
CREATE VIRTUAL TABLE IF NOT EXISTS posts_fts USING fts5(
|
||||
title,
|
||||
content,
|
||||
author_username,
|
||||
tokenize = 'unicode61 remove_diacritics 1'
|
||||
);
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS posts_fts_insert
|
||||
AFTER INSERT ON posts BEGIN
|
||||
INSERT INTO posts_fts(rowid, title, content, author_username)
|
||||
VALUES (
|
||||
NEW.id,
|
||||
NEW.title,
|
||||
COALESCE(strip_tags(NEW.content), ''),
|
||||
COALESCE((SELECT username FROM users WHERE id = NEW.author_id), '')
|
||||
);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS posts_fts_update
|
||||
AFTER UPDATE ON posts BEGIN
|
||||
DELETE FROM posts_fts WHERE rowid = OLD.id;
|
||||
INSERT INTO posts_fts(rowid, title, content, author_username)
|
||||
VALUES (
|
||||
NEW.id,
|
||||
NEW.title,
|
||||
COALESCE(strip_tags(NEW.content), ''),
|
||||
COALESCE((SELECT username FROM users WHERE id = NEW.author_id), '')
|
||||
);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS posts_fts_delete
|
||||
AFTER DELETE ON posts BEGIN
|
||||
DELETE FROM posts_fts WHERE rowid = OLD.id;
|
||||
END;
|
||||
",
|
||||
|
||||
'down' => "
|
||||
DROP TRIGGER IF EXISTS posts_fts_delete;
|
||||
DROP TRIGGER IF EXISTS posts_fts_update;
|
||||
DROP TRIGGER IF EXISTS posts_fts_insert;
|
||||
DROP TABLE IF EXISTS posts_fts;
|
||||
",
|
||||
];
|
||||
Reference in New Issue
Block a user