La recherche en texte intégral dans MySQL s'appuie sur un mécanisme de filtrage des termes fréquents, communément désignés sous le nom de mots vides. Ce processus utilise la liste active définie par les paramètres système character_set_server et collation_server. Une inadéquation entre l'encodage de la colonne indexée, le jeu de caractères du fichier des mots vides et la configuration globale du serveur peut provoquer des résultats erronés, incluant des faux positifs ou des omissions lors des requêtes MATCH() ... AGAINST().
- Configuraton des mots vides pour le moteur InnoDB
InnoDB intègre nativement une liste de mots vides relativement concise. Cette approche vise à préserver la pertinence des recherches, car de nombreux corpus techniques ou littéraires exploitent des termes courts comme des concepts clés ou des marqueurs syntaxiques essentiels.
Pour consulter la liste par défaut, interrogez le schéma d'information :
mysql> SELECT value AS terme FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD ORDER BY terme;
+---------+
| terme |
+---------+
| a |
| about |
| an |
...
+---------+
36 rows in set (0.01 sec)
Pour remplacer cette liste par un référentiel personnalisé au niveau global, créez une table respectant la structure imposée, alimentez-la, puis déclarez son chemin avant toute génération d'index. La colonne obligatoire doit obligatoirement se nommer value et accepter des chaînes de caractères.
-- Création du référentiel dans une base dédiée
CREATE TABLE gestion_fts.liste_exclusion (value VARCHAR(60)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Insertion des termes à filtrer
INSERT INTO gestion_fts.liste_exclusion VALUES ('Callme'), ('invisible'), ('screaming');
-- Déclaration globale de la liste
SET GLOBAL innodb_ft_server_stopword_table = 'gestion_fts/liste_exclusion';
Une fois la variable définie, la création d'un index plein texte appliquera autoamtiquement ce filtrage. Si la table cible ne possède pas de colonne FTS_DOC_ID, InnoDB effectuera une reconstruction temporaire lors de l'opération.
-- Préparation de la table documentaire
CREATE TABLE gestion_fts.extraits_livres (
ref_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
texte TEXT,
auteur VARCHAR(120),
titre VARCHAR(120)
) ENGINE=InnoDB;
INSERT INTO gestion_fts.extraits_livres (texte, auteur, titre) VALUES
('Le temps retrouvé commence ici.', 'Marcel Proust', 'À la recherche du temps perdu'),
('La vie est une longue solitude.', 'Gabriel García Márquez', 'Cent ans de solitude'),
('On ne naît pas femme, on le devient.', 'Simone de Beauvoir', 'Le Deuxième Sexe');
-- Génération de l'index (le filtrage s'applique immédiatement)
CREATE FULLTEXT INDEX idx_texte ON gestion_fts.extraits_livres(texte);
Pour valider l'efficacité du filtrage, déclarez la table cible dans la variable auxiliaire et consultez l'index inversé :
mysql> SET GLOBAL innodb_ft_aux_table = 'gestion_fts/extraits_livres';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT DISTINCT word FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE LIMIT 12;
+-----------+
| word |
+-----------+
| commence |
| deuxieme |
| devenir |
| femme |
| longue |
| naît |
| pas |
| retrouvé |
| sexe |
| temps |
| vie |
+-----------+
12 rows in set (0.00 sec)
Note technique : InnoDB ignore par défaut les unités lexicales dont la longueur est inférieure à 3 ou supérieure à 84 caractères. Ces seuils sont modifiables via
innodb_ft_min_token_sizeetinnodb_ft_max_token_size. Cette règle ne s'applique pas aux parseursngram, dont la taille de token est contrôlée parngram_token_size.
Pour appliquer une liste restrictive uniquement à une table spécifique, utilisez la variable innodb_ft_user_stopword_table en suivant la même procédure, mais en la configurant juste avant la création de l'index ciblé.
- Gestion des mots vides pour le moteur MyISAM
Lorsque character_set_server est configuré sur ucs2, utf16, utf16le ou utf32, le moteur MyISAM charge et analyse son fichier de mots vides en utilisant l'encodage latin1.
Pour substituer la liste par défaut, modifiez la variable système ft_stopword_file. Cette propriété attend le chemin absolu vers un fichier texte contenant les termes à ignorer, ou une chaîne vide pour désactiver entièrement le filtrage. Le serveur recherche le fichier dans le répertoire de données, sauf si un chemin absolu est fourni. Toute modification de cette variable ou du contenu du fichier nécessite un redémarrage du service MySQL ainsi qu'une régénération complète des index FULLTEXT.
Le fichier accepte un format libre : les termes doivent être séparés par tout caractère non alphabétique (retours à la ligne, espaces, virgules, tabulations, etc.). Seuls le tiret bas (_) et l'apostrophe (') sont conservés comme parties intégrantes des mots. L'encodage du fichier doit correspondre au jeu de caractères par défaut du serveur.
La distribution source de MySQL intègre une liste exhaustive dans le fichier storage/myisam/ft_static.c. Celle-ci contient des centaines de termes courants en anglais, des contractions et des mots fonctionnels. Pour des environnements multilingues ou francophones, il est recommandé de fournir un fichier personnalisé adapté au corpus applicatif.