MySQL:Recherche efficace d'un mot dans une ta

Fermé
JLinho - 23 juin 2004 à 11:06
 loko - 22 déc. 2011 à 16:49
Salut à tous,

J'aimerais créer un petit moteur de recherche sur une Base de donnée.
Plus précisément, l'utilisateur rentre un mot et doit obtenir en retour tous les enregistrements (lignes de la table) dont un des champs ( au moins) contient le mot spécifié.

Les tables étant assez lourdes, il faut que ce soit assez efficace comme méthode. Un autre problème, c'est la casse et les accents:
Par exemple si l'utilisateur entre: "cHéVâLieR" , les enregistrements contenant la sous chaine "chevalier" ou "CHEVALIER" dans un de leurs champs doivent être détectés.

8 réponses

GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 386
23 juin 2004 à 13:20
Pour la casse tu peut déjà utilisé l'opérateur LIKE, il te retrouvera plusieur mots sans tenir compte de la casse (majuscule et minuscule) mais je sais pas pour les voyelle avec accent.
Sinon pour la recherche je pense que ca devrait marcher:
SELCT *
FROM maTable
WHERE champ1 LIKE "%monMot%" OR champ2 LIKE "%monMot%" ...
3
Salut,

En effet la creation d'un index est une bonne chose. Tu crée un index sur le syllable les plus courantes. Par exemple, si tu cree un index pour "va", alors chevalier se trouvera dedans.
Pour les accents, tu peux dupliquer les colonnes qui contiennent des accents en colonnes sans accent, sans caracteres speciaux, sans les articles et sans la ponctuation... pour une recherche plus rapide.
2
oué commence déjà par regardé la doc pour la commande "like" de mysql.
Ensuite tu peu également créer des index dans té tables et qui te permettent un gain consédérable de temps, mais sa prend aussi pas mal de mémoire sur ta bdd kan ta des grosses tables bien pleines
0
Pour les accents j'ai trouvé une astuce qui consiste à remplacer dans le mot recherché tous les voyelles accentués ou non par '_' , et puis j'utilise le LIKE...Par contre ça rique de donner pas mal de résultats en trop.... ( Au lieu de chercher batîment par exemple, il va chercher
%b_t_m_nt% , la ça va....mais si je cherche roseau, ça devient carrément n'importe quoi... car on recherche %r_s_ _ _% donc on va trouver 'rasoir' ou 'arrosoir' où d'autres anneries). Enfin bon c'est pas très satisfaisant...
Alors sinon c'est vrai qu'on peut toujours filtrer les résultats en PHP, mais il faut pas que le PHP travaille sur trop d'enregistrements...

Sinon iBook, je vois pas en quoi l'utilisation des Index va considérablement améliorer la vitesse des recherches, puisqu'il s'agit de rechercher en plein milieu de certains champs certains mots...à moins que j'aie mal pigé le principe des Indexs ....
0
Bonjour
Ne remplace que les caractères différents des minuscules, majuscules, chiffres (en gros ceux qui ne sont pas dans l'ASCII) et ainsi roseau restera roseau et bâtiment deviendra b_timent.
0
pourquoi faire simple (et inefficace: avec '_' ca va faire des confusions entre les mots) quand on peut faire compliqué....
il suffit simplement de convertir le mot-clé en tranformant les ('â','â','à') en 'a', ('ë','ê','è','é'), en 'e' (idem pour i,o,u) ...
et ca marche.
ou sinon la solution de GallyNet
0
ben je c pas ce que contient exactement ta bdd, mé tu peu définir des mots clés (mots les plus souvent tapé par tes visiteurs) pour caractériser un texte. Tu met un index dessus et ca peut te faire gagner en rapididé de requète, mais bon.... ca vau ce que ca vau.... tout dépend de l'utilisation exacte de ton moteur
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 386
23 juin 2004 à 18:38
Tu peut utiliser les expressions regulieres pour le probleme avec les accents, dans le cas de" batîment":

SELECT * FROM maTable WHERE champ1 REGEXP "b[aâà]1t[îiï]m[eéè^é¨2]nt";

(pas sur du code mais il doit rssembleer a ca)
Par contre tu doit modifier le mot via t'on script (PHP ?)
0
oui ca pourrai etre une bonne idée : tu duplique la colone qui contient le texte a l'interieur duquel tu cherche tes mots (genre la colone "description" et "titre" pour un annuaire de site par exemple) et dans les colones dupliquées, tu met le meme texte, mais sans accent ni ponctuation("description_format" "titre_format" par ex.). Et pour tes recherches, ben tu cherchera directement dans le texte formaté ("description_format" "titre_format")
0
Bon je devrais pouvoir m'en sortir maintenant...
Merci à tous pour votre aide !!!
0
Essaye un interclassement ‘latin1_swedish_ci’ pour ta table et tes champs recherchés.
Tes requêtes ignoreront alors la casse et les accents.
0
La meilleur des solutions est la tienne Ludwig merci du tuyau
0
Bonjour!

J'ai le même probléme.
Est-ce que quelqu'un pourrait m'expliquer la solution de ludwig, elle ne m'est pas trés parlante.

Merci d'avance,
Clément
0
inter > sparkendefugl
15 févr. 2010 à 06:14
via phpmyadmin tu peux voir,
dans la base de données,
choisi une table,
sélectionne un changement de structure,
dans la colonne interclassement,
tu as la solution de ludwing qui est LATIN...
plus précisément c'est un jeux de caractère probablement compatible
pour jouer avec la casse/accent
0