Vous ne vous êtes jamais demandé comment un moteur de recherche faisait pour vous retourner une pertinence dans le résultat, et surtout avoir des temps de réponse aussi bas?
Explication:
Avant de connaître cette fonctionnalité je faisais mes requêtes de recherche sur un champ texte comme celà,
Select id from articles where body like '%valeur recherchée%';
Mais la solution passe par l'indexation en full_text d'un champ text (disponible que sur les tables au format MyISAM «ENGINE=MyISAM » ), alors voilà après cette petite modification dans votre structure de base de données vous pouvez vous attaquer à la requête magique.
Select id, Match(title,body) against ('valeur recherchée') as resultat from articles;
Ceci va vous retourner l'id de votre enregistrement, mais également le coefficient de pertinence du mot dans le texte. Cet algorithme se base sur le nombre de lignes, le nombre de caractères, le nombre d'occurrences du mot, mais également sur la pertinence du mot recherché. Par exemple il exclut tout mot dont le nombre de caractères est inférieur à 4, il passe sous silence les articles et les mots reconnus comme trop commun. En gros plus un mot est rare plus le coefficient est important.
Petite amélioration de notre requête:
Select id, Match(title,body) against ('valeur recherchée') as resultat from articles where match(title,body) against('valeur recherchée');
Cette requête classe les pertinences par ordre décroissant et supprime ceux égale à 0.
Pour en finir avec ça, il faut savoir que ce type de requête ne fonctionne correctement que sur une grande quantité d'informations avec des champs contenant quelques phrases. J'espère que ce petit article vous a interressé et n'hésitez pas à me donner vos opinions.
Pour consulter la documentation de MySQL c'est ici que ça se passe.


MyISAM et pas InnoDB ?
hello,
tu dis "disponible que sur les tables au format MyISAM «ENGINE=MyISAM »" mais euh, c'est pas dispo aussi sur les tables utilisant le moteur d'InnoDB ?!? Il me semblait pourtant...
Faut croire que non
Full-text indexes can be used only with MyISAM tables, and can be created only for CHAR, VARCHAR, or TEXT columns.
source : http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
Dia
Oui effectivement comme le
Oui effectivement comme le dis Dia ce n'est disponible que sur les tables au format MyISAM sinon tu as un message d'erreur indiquant que l'indexation en FullText n'est pas disponible.
Mmm voilà qui est très euh
Mmm voilà qui est très euh surprenant... Un truc à prendre sérieusement en compte dans les scripts de création de tables donc (avant de diffuser une application) ! Et surtout bien réfléchir au moteur le plus adéquat pour l'application... Ah bah, pas fini de nous faire réfléchir ce MySQL !
Il y a pas mal de choses qui
Il y a pas mal de choses qui changent entre InnoDB et MyISAM (entre autre l'UTF-8 d'après mes souvenirs). Si je trouve suffisement d'informations je tenterai de faire un article sur "Quel moteur choisir pour votre table MySQL".
Yop, je dois dire que
Yop, je dois dire que j'avais surtout conscience des choses qu'InnoDB supportait en plus que MyISAM mais j'avoue ne pas avoir porté attention qu'il pouvait y avoir quelques "moins" qui trainaient :s
Quand à UTF-8, tu peux choisir le moteur que tu veux entre les deux, c'est de toutes façons super mal géré par MySQL (expérience faite)...