• Aucun résultat trouvé

Lorsque l'on fait une recherche naturelle, il suffit qu'un seul mot de la chaîne de caractères recherchée se retrouve dans une ligne pour que celle-ci apparaisse dans les résultats. Attention cependant au fait que le mot exact doit se retrouver dans la valeur des colonnes de l'index FULLTEXT examiné.

Voici la syntaxe utilisée pour faire une recherche FULLTEXT :

Code : SQL

SELECT * -- Vous mettez évidemment les colonnes que vous voulez.

FROM nom_table

WHERE MATCH(colonne1[, colonne2, ...]) -- La (ou les) colonne(s) dans laquelle (ou lesquelles) on veut faire la recherche (index FULLTEXT correspondant nécessaire).

AGAINST ('chaîne recherchée'); -- La chaîne de caractères recherchée, entre guillemets bien sûr.

Si l'on veut préciser qu'on fait une recherche naturelle, on peut ajouter IN NATURAL LANGUAGE MODE. Ce n'est cependant pas obligatoire puisque la recherche naturelle est le mode de recherche par défaut.

Code : SQL

SELECT * FROM nom_table

WHERE MATCH(colonne1[, colonne2, ...])

AGAINST ('chaîne recherchée' IN NATURAL LANGUAGE MODE);

Premier exemple : on recherche "Terry" dans la colonne auteur de la table Livre . Code : SQL

SELECT *

FROM Livre

AGAINST ('Terry');

id auteur titre

8 Terry Pratchett Les Petits Dieux 9 Terry Pratchett Le Cinquième éléphant 10 Terry Pratchett La Vérité

11 Terry Pratchett Le Dernier héros 12 Terry Goodkind Le Temple des vents

Deuxième exemple : On recherche d'abord "Petite", puis "Petit" dans la colonne titre. Code : SQL SELECT * FROM Livre WHERE MATCH(titre) AGAINST ('Petite'); SELECT * FROM Livre WHERE MATCH(titre) AGAINST ('Petit');

Résultat de la première requête :

id auteur titre

3 Daniel Pennac La Petite marchande de prose

La deuxième requête (avec "Petit") ne renvoie aucun résultat. En effet, bien que "Petit" se retrouve deux fois dans la table (dans "La Petite marchande de prose" et "Les Petits Dieux"), il s'agit chaque fois d'une partie d'un mot, pas du mot exact.

Troisième exemple : on recherche "Henri" dans la colonne auteur. Code : SQL SELECT * FROM Livre WHERE MATCH(auteur) AGAINST ('Henri'); id auteur titre

16 Henri-Pierre Roché Jules et Jim

Ici par contre, on retrouve bien Henri-Pierre Roché en faisant une recherche sur "Henri", puisque Henri et Pierre sont considérés comme deux mots.

Quatrième exemple : on recherche "Jules", puis "Jules Verne" dans les colonnes titre et auteur. Code : SQL

SELECT *

FROM Livre

WHERE MATCH(auteur, titre) AGAINST ('Jules');

SELECT *

FROM Livre

WHERE MATCH(titre, auteur) AGAINST ('Jules Verne');

id auteur titre

14 Jules Verne De la Terre à la Lune 16 Henri-Pierre Roché Jules et Jim

15 Jules Verne Voyage au centre de la Terre

id auteur titre

14 Jules Verne De la Terre à la Lune 15 Jules Verne Voyage au centre de la Terre 16 Henri-Pierre Roché Jules et Jim

Ces deux requêtes retournent les mêmes lignes. Vous pouvez donc voir que l'ordre des colonnes dans MATCH n'a aucune importance, du moment qu'un index FULLTEXT existe sur ces deux colonnes. Par ailleurs, la recherche se fait bien sur les deux colonnes, et sur chaque mot séparément, puisque les premières et troisièmes lignes contiennent 'Jules Verne' dans l'auteur, tandis que la deuxième contient uniquement 'Jules' dans le titre.

Par contre, l'ordre des lignes renvoyées par ces deux requêtes n'est pas le même. Lorsque vous utilisez MATCH... AGAINST dans une clause WHERE, les résultats sont par défaut triés par pertinence.

La pertinence est une valeur supérieure ou égale à 0 qui qualifie le résultat d'une recherche FULLTEXT sur une ligne. Si la ligne ne correspond pas du tout à la recherche, sa pertinence sera de 0. Si par contre elle correspond à la recherche, sa pertinence sera supérieure à 0. Ensuite, plus la ligne correspond bien à la recherche (nombre de mots trouvés par exemple), plus la pertinence sera élevée.

Vous pouvez voir la pertinence attribuée à une ligne en mettant l'expression MATCH... AGAINST dans le SELECT.

Cinquième exemple : affichage de la pertinence de la recherche Code : SQL

SELECT *, MATCH(titre, auteur) AGAINST ('Jules Verne Lune') FROM Livre;

id auteur titre MATCH(titre, auteur) AGAINST ('Jules Verne Lune')

1 Daniel Pennac Au bonheur des ogres 0

2 Daniel Pennac La Fée Carabine 0

3 Daniel Pennac La Petite marchande de prose 0 4 Jacqueline Harpman Le Bonheur est dans le crime 0 5 Jacqueline Harpman La Dormition des amants 0 6 Jacqueline Harpman La Plage d'Ostende 0 7 Jacqueline Harpman Histoire de Jenny 0

8 Terry Pratchett Les Petits Dieux 0 9 Terry Pratchett Le Cinquième éléphant 0

10 Terry Pratchett La Vérité 0

11 Terry Pratchett Le Dernier héros 0

12 Terry Goodkind Le Temple des vents 0

13 Daniel Pennac Comme un roman 0

14 Jules Verne De la Terre à la Lune 5.851144790649414 15 Jules Verne Voyage au centre de la Terre 3.2267112731933594 16 Henri-Pierre Roché Jules et Jim 1.4018518924713135

En fait, écrire :

Code : SQL

WHERE MATCH(colonne(s)) AGAINST (mot(s) recherché(s))

Cela revient à écrire :

Code : SQL

WHERE MATCH(colonne(s)) AGAINST (mot(s) recherché(s)) > 0

Donc seules les lignes ayant une pertinence supérieure à 0 (donc correspondant à la recherche) seront sélectionnées.

Recherche avec booléens

La recherche avec booléens possède les caractéristiques suivantes :

elle ne tient pas compte de la règle des 50 % qui veut qu'un mot présent dans 50 % des lignes au moins soit ignoré ; elle peut se faire sur une ou des colonne(s) sur laquelle (lesquelles) aucun index FULLTEXT n'est défini (ce sera cependant beaucoup plus lent que si un index est présent) ;

les résultats ne seront pas triés par pertinence par défaut.

Pour faire une recherche avec booléens, il suffit d'ajouter IN BOOLEAN MODE après la chaîne recherchée.

Code : SQL

SELECT *

FROM nom_table

WHERE MATCH(colonne)

AGAINST('chaîne recherchée' IN BOOLEAN MODE); -- IN BOOLEAN MODE à l'intérieur des parenthèses !

La recherche avec booléens permet d'être à la fois plus précis et plus approximatif dans ses recherches.

Plus précis, car on peut exiger que certains mots se trouvent ou soient absents dans la ligne pour la sélectionner. On peut même exiger la présence de groupes de mots, plutôt que de rechercher chaque mot séparément.

Plus approximatif, car on peut utiliser un astérisque * en fin de mot, pour préciser que le mot peut finir de n'importe quelle manière.

Pour exiger la présence ou l'absence de certains mots, on utilise les caractères + et -. Un mot précédé par + devra être présent dans la ligne et inversement, précédé par - il ne pourra pas être présent.

Exemple : Recherche sur le titre, qui doit contenir "bonheur" mais ne peut pas contenir "ogres". Code : SQL

SELECT *

FROM Livre

WHERE MATCH(titre)

AGAINST ('+bonheur -ogres' IN BOOLEAN MODE);

id auteur titre

4 Jacqueline Harpman Le Bonheur est dans le crime

Seule une ligne est ici sélectionnée, bien que "bonheur" soit présent dans deux. En effet, le second livre dont le titre contient "bonheur" est "Le Bonheur des ogres", qui contient le mot interdit "ogres".

Pour spécifier un groupe de mots exigés, on utilise les doubles guillemets. Tous les mots entre doubles guillemets devront non seulement être présents mais également apparaître dans l'ordre donné, et sans rien entre eux. Il faudra donc que l'on retrouve

exactement ces mots pour avoir un résultat.

Exemple : recherche sur titre, qui doit contenir tout le groupe de mot entre guillemets doubles. Code : SQL

SELECT *

FROM Livre

WHERE MATCH(titre)

AGAINST ('"Terre à la Lune"' IN BOOLEAN MODE); SELECT *

FROM Livre

WHERE MATCH(titre)

AGAINST ('"Lune à la Terre"' IN BOOLEAN MODE); SELECT *

FROM Livre

WHERE MATCH(titre)

AGAINST ('"Terre la Lune"' IN BOOLEAN MODE);

Résultat première requête :

id auteur titre

14 Jules Verne De la Terre à la Lune

La première requête renverra bien un résultat, contrairement à la seconde (car les mots ne sont pas dans le bon ordre) et à la troisième (car il manque le "à" dans la recherche - ou il y a un "à" en trop dans la ligne, ça dépend du point de vue). "Voyage au centre de la Terre" n'est pas un résultat puisque seul le mot "Terre" est présent.

Pour utiliser l'astérisque, il suffit d'écrire le début du mot dont on est sûr, et de compléter avec un astérisque.

Exemple : recherche sur titre, sur tous les mots commençant par "petit". Code : SQL

SELECT *

FROM Livre

WHERE MATCH(titre)

id auteur titre

3 Daniel Pennac La Petite marchande de prose 8 Terry Pratchett Les Petits Dieux

"Petite" et "Petits" sont trouvés.

Exemple : recherche sur titre et auteur, de tous les mots commençant par "d". Code : SQL

SELECT *

FROM Livre

WHERE MATCH(titre, auteur) AGAINST ('d*' IN BOOLEAN MODE);

id auteur titre

1 Daniel Pennac Au bonheur des ogres 2 Daniel Pennac La Fée Carabine

3 Daniel Pennac La Petite marchande de prose 13 Daniel Pennac Comme un roman

4 Jacqueline Harpman Le Bonheur est dans le crime 11 Terry Pratchett Le Dernier héros

8 Terry Pratchett Les Petits Dieux

5 Jacqueline Harpman La Dormition des amants

Chacun des résultats contient au moins un mot commençant par "d" dans son titre ou son auteur ("Daniel", "Dormition"...). Mais qu'en est-il de "Voyage au centre de la Terre" par exemple ? Avec le "de", il aurait dû être sélectionné. Mais c'est sans compter la règle qui dit que les mots de moins de quatre lettres sont ignorés. "De" n'ayant que deux lettres, ce résultat est ignoré. Pour en finir avec la recherche avec booléens, sachez qu'il est bien sûr possible de mixer ces différentes possibilités. Les

combinaisons sont nombreuses.

Exemple : recherche sur titre, qui doit contenir un mot commençant par "petit", mais ne peut pas contenir le mot "prose". Code : SQL

SELECT *

FROM Livre

WHERE MATCH(titre)

AGAINST ('+petit* -prose' IN BOOLEAN MODE); -- mix d'un astérisque avec les + et -

id auteur titre

8 Terry Pratchett Les Petits Dieux

Documents relatifs