IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)


MYSQL et la recherche textuelle

30/04/2003

Par "Olivier Miossec" (omiossec)

MYSQL et la recherche textuelle

Index
Configuration
Gestion des index
Méthodes
Etude de cas

 

Etudes de cas

Telecharger le fichier fulltext.sql

CREATE TABLE example_fulltext(
idexample_fulltext INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
date_texte DATE NOT NULL,
titre VARCHAR(200) NULL,
auteur INTEGER NOT NULL,
commentaire TINYTEXT NULL,
texte TEXT NULL,
validite BOOL NULL,
PRIMARY KEY(idexample_fulltext),
FULLTEXT INDEX example_fulltext_plein(texte, commentaire, titre),
INDEX example_fulltext_auteur(auteur));

CREATE TABLE example_auteur(
idexample_auteur INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nomauteur varchar(50));

Nous allons prendre un exemple simple, deux tables. La première, example_fulltext,  contient des extrais de textes de grands auteurs, la seconde, example_auteur, contient les noms des auteurs en question.

Commençons par une requête simple recherchant le mot « mort » dans l’ensemble des textes

SELECT titre, MATCH (texte, commentaire, titre) AGAINST ('mort') AS  cpt
FROM example_fulltext
ORDER BY cpt DESC

titre 

cpt 

Lettre à Ménécée 

1.3077735361583 

De la Nature 

1.2738213071353 

Réfutation d'Helvétius 

0.37034043359479 

Essais 

0.22855587241584 

Déclaration des droits de l'homme et du citoyen 

La Politique, livre I, chap. 2 

La Politique, livre III, chap. 6 et 7 

Principes de la philosophie 

Le Prince 

Le Prince 

Traité du vide 

La République 

Du Contrat social 

Du Contrat social 

Traité sur la tolérance 

Lettres à Lucilius 

Ajoutons un filtre permetant de n’extraire que les enregistrements comportant le mot « mort »

SELECT titre, MATCH (texte, commentaire, titre) AGAINST ('mort') AS  cpt
FROM example_fulltext
WHERE MATCH (texte, commentaire, titre) AGAINST ('mort')
ORDER BY cpt DESC

titre 

cpt 

Lettre à Ménécée 

1.3077735361583 

De la Nature 

1.2738213071353 

Réfutation d'Helvétius 

0.37034043359479 

Essais 

0.22855587241584 

L’on peut ajouter les auteurs une jointure.

SELECT titre, MATCH (texte, commentaire, titre) AGAINST ('mort') AS  cpt,Nomauteur
FROM example_fulltext 
inner join
example_auteur on auteur  =  idexample_auteur
WHERE MATCH (texte, commentaire, titre) AGAINST ('mort')
ORDER BY cpt DESC

titre 

cpt 

Nomauteur 

Lettre à Ménécée 

1.3077735361583 

Épicure 

De la Nature 

1.2738213071353 

HÉRACLITE 

Réfutation d'Helvétius 

0.37034043359479 

DIDEROT 

Essais 

0.22855587241584 

MONTAIGNE 

 

Maintenant supposant que l'on veuille savoir quel sont les textes où se trouvent le mot « mort » associé au mot « peuple » ?

Nous avons besoin d’utiliser une requête booléenne. Le mode booléen a été introduit avec la version 4.0.1 de MySql.

SELECT titre, MATCH (texte, commentaire, titre) AGAINST ('mort peuple' IN BOOLEAN MODE) AS  cpt
FROM example_fulltext  inner join example_auteur on auteur  =  idexample_auteur
WHERE MATCH (texte, commentaire, titre) AGAINST ('mort peuple' IN BOOLEAN MODE)
ORDER BY cpt DESC

Réfutation d'Helvétius 

Lettre à Ménécée 

De la Nature 

Essais 

Si nous voulons donner plus de poids  au mot « mort » alors il faut utiliser '+mort peuple'.

Essayons d’autre part de trouver les mots se rapportant au mot   « république » (républicain, républicanisme, …). Il faut alors utiliser l'opérateur *.

SELECT titre, Nomauteur
FROM full.example_fulltext  inner join example_auteur on auteur  =  idexample_auteur
WHERE MATCH (texte, commentaire, titre) AGAINST ('répu*' IN BOOLEAN MODE)

titre 

Nomauteur 

Du Contrat social 

Jean-Jacques ROUSSEAU 

La République 

PLATON 

Le Prince 

Nicolas MACHIAVEL 

La Politique, livre III, chap. 6 et 7 

ARISTOTE 

Le Prince 

Nicolas MACHIAVEL