Recherche complexe et performante dans une base mysql ?
12 messages
• Page 1 sur 1
-

milkiway - WRInaute accro

- Messages: 4910
- Inscription: 3 Fév 2004
Recherche complexe et performante dans une base mysql ?
Bonjour,
Je souhaiterais faire une recherche dans une base MySQL mais sur les termes proches de ma requête.
Exemple, si on parle de téléphone, je voudrais lister toutes les entrées qui approchent ma requête "iphone 3gs 16 Go"
Et que ça me liste par exemple
- iphone 3gs 16 Go
- 3gs apple iphone 16gb
- iphone 16GB version 3 GS
- etc.
Je rêve des genoux ou c'est faisable avec une fonction qui va bien ?
Merci
Je souhaiterais faire une recherche dans une base MySQL mais sur les termes proches de ma requête.
Exemple, si on parle de téléphone, je voudrais lister toutes les entrées qui approchent ma requête "iphone 3gs 16 Go"
Et que ça me liste par exemple
- iphone 3gs 16 Go
- 3gs apple iphone 16gb
- iphone 16GB version 3 GS
- etc.
Je rêve des genoux ou c'est faisable avec une fonction qui va bien ?
Merci
-

Marie-Aude - Modérateur

- Messages: 11893
- Inscription: 5 Juin 2006
Re: Recherche complexe et performante dans une base mysql ?
Tu ne précises pas comment tu définis les termes "proches"
En fait le problème est là : identifier les termes essentiels de la requête
Après c'est du like '%monterme%'
Bref le problème n'est pas dans mysql
En fait le problème est là : identifier les termes essentiels de la requête
Après c'est du like '%monterme%'
Bref le problème n'est pas dans mysql
-

milkiway - WRInaute accro

- Messages: 4910
- Inscription: 3 Fév 2004
Re: Recherche complexe et performante dans une base mysql ?
Merci pour la réponse.
Justement, il y a une telle variété de termes qu'il est impossible de les définir à l'avance.
like ne correspond pas à ce que je cherche. C'est plus du domaine du soundex, fulltext ou ce genre de chose me semble t il.
Et je cherche justement (si ça existe) une solution SQL.
Justement, il y a une telle variété de termes qu'il est impossible de les définir à l'avance.
like ne correspond pas à ce que je cherche. C'est plus du domaine du soundex, fulltext ou ce genre de chose me semble t il.
Et je cherche justement (si ça existe) une solution SQL.
-

Marie-Aude - Modérateur

- Messages: 11893
- Inscription: 5 Juin 2006
Re: Recherche complexe et performante dans une base mysql ?
Non ce sont d'autres techniques.
En même temps, tu peux essayer de travailler sur les longueurs de chaine, la composition (avec ou sans chiffre)
En même temps, tu peux essayer de travailler sur les longueurs de chaine, la composition (avec ou sans chiffre)
- jcaron
- WRInaute accro

- Messages: 2685
- Inscription: 13 Fév 2004
Re: Recherche complexe et performante dans une base mysql ?
Oui, je pense que fulltext est ta meilleure option.
L'alternative, c'est de gérer tout ça "toi même": tu décomposes chaque champ en une série de mots, et tu les indexes séparément via une table de jointure. Tu peux ensuite utiliser de la canonicalisation, du stemming, du soundex, des synonymes, etc. suivant tes besoins. Ca te donne plus de souplesse, mais c'est bien entendu plus compliqué.
Par exemple, si le champ contient "toto tata tutu", tu décomposes en 3 mots, et tu as:
- une table qui contient les mots eux-mêmes et un id (avec index sur le mot), donc 3 lignes, une pour toto, une pour tata, une pour tutu;
- une table qui associe chacun de ces mots à ta table originale: id_tata->id_de_ta_ligne, etc. Tu peux optionnellement ajouter la position dans le champ, ou une notion de "poids" du mot, de façon générale (un mot très fréquent pourra avoir un poids plus faible par exemple) ou au niveau de cette ligne de la table originale (un mot très présent dans cette ligne aura un poids plus important)
Ensuite, tu obtiens ton résultat avec une requête tu type:
Ca peut se générer de façon automatique en fonction du nombre de mots si nécessaire.
Avec les bons index là où il faut, ça devrait rester relativement rapide, à condition de traiter correctement les mots très présents.
Jacques.
L'alternative, c'est de gérer tout ça "toi même": tu décomposes chaque champ en une série de mots, et tu les indexes séparément via une table de jointure. Tu peux ensuite utiliser de la canonicalisation, du stemming, du soundex, des synonymes, etc. suivant tes besoins. Ca te donne plus de souplesse, mais c'est bien entendu plus compliqué.
Par exemple, si le champ contient "toto tata tutu", tu décomposes en 3 mots, et tu as:
- une table qui contient les mots eux-mêmes et un id (avec index sur le mot), donc 3 lignes, une pour toto, une pour tata, une pour tutu;
- une table qui associe chacun de ces mots à ta table originale: id_tata->id_de_ta_ligne, etc. Tu peux optionnellement ajouter la position dans le champ, ou une notion de "poids" du mot, de façon générale (un mot très fréquent pourra avoir un poids plus faible par exemple) ou au niveau de cette ligne de la table originale (un mot très présent dans cette ligne aura un poids plus important)
Ensuite, tu obtiens ton résultat avec une requête tu type:
- Code: Tout sélectionner
select * from table t,mots m1,mots m2,mots m3,mots_table mt1,mots_table mt2,mots_table mt3 where m1.mot='toto' and m2.mot='tata' and m3.mot='tutu' and mt1.mot=m1.id and mt2.mot=m2.id and mt3.mot=m3.id and mt1.table=t.id and mt2.table=t.id and mt3.table=t.id
Ca peut se générer de façon automatique en fonction du nombre de mots si nécessaire.
Avec les bons index là où il faut, ça devrait rester relativement rapide, à condition de traiter correctement les mots très présents.
Jacques.
-

e-kiwi - Modérateur

- Messages: 15618
- Inscription: 23 Déc 2003
Re: Recherche complexe et performante dans une base mysql ?
-

spout - WRInaute accro

- Messages: 4382
- Inscription: 14 Mai 2003
Re: Recherche complexe et performante dans une base mysql ?
milkiway a écrit:Je ne sais pas s'il peut être utilisé en gros juste pour renvoyer du contenu à un script PHP.
http://www.ibm.com/developerworks/library/os-php-sphinxsearch/
http://sphinxsearch.com/wiki/doku.php?id=php_api_docs
-

Julia41 - WRInaute passionné

- Messages: 1765
- Inscription: 31 Aoû 2007
Re: Recherche complexe et performante dans une base mysql ?
Avec sphinx search, tu aurais des bonnes fonctions pour ce que tu cherches avec du build stop word (par exemple) qui te construit une liste de "tous les mots inutiles" (habituellement les il, elle, les, etc...).
Sphinx log aussi toutes les recherches, avec un coup de script ça te permettrait de faire des beaux inserts dans ta base.
A noter qu'avec pspell (bon, pour la config tu vas en chier) tu pourrais peut-être aussi faire quelque chose de sympa.
Nous on s'en sert pour "did you mean ?"
Voilà la fonction (toute simple) la seule "merde" est de build le fichier pws:
Sphinx log aussi toutes les recherches, avec un coup de script ça te permettrait de faire des beaux inserts dans ta base.
A noter qu'avec pspell (bon, pour la config tu vas en chier) tu pourrais peut-être aussi faire quelque chose de sympa.
Nous on s'en sert pour "did you mean ?"
Voilà la fonction (toute simple) la seule "merde" est de build le fichier pws:
- Code: Tout sélectionner
function didumean($query) {
//$pspell_config = pspell_new('fr', '', '', '',(PSPELL_FAST|PSPELL_RUN_TOGETHER));
$pspell_config = pspell_config_create('fr', '', SITENAME, 'cp1252');
pspell_config_mode($pspell_config, PSPELL_FAST);
pspell_config_personal($pspell_config, SITEDIR . '/includes/didumean.pws');
$pspell_link = pspell_new_config($pspell_config);
$words = preg_split ('/\s+/', $query);
$ii = count($words);
$spellchecked = '';
for($i=0; $i<$ii; $i++){
if (pspell_check($pspell_link, $words[$i])){
$spellchecked .= $words[$i] . ' ';
} else{
$erroneous = TRUE;
$suggestions = pspell_suggest($pspell_link, $words[$i]);
if ($suggestions)
$spellchecked .= $suggestions['0'] . ' ';
}
}
if(isset($erroneous)){
return ucwords($spellchecked);
} else{
return false;
}
}
12 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- recherche plateforme multi blog, très performante...
- Recherche dans une base de données MySQL
- Mysql Requête comparative complexe
- Requête mysql : Tri complexe des commentaires par votes
- Url complexe et moteurs de recherche
- Transformer une base de donnée excel en base de donnée mysql
- base mysql
- Base Mysql introuvable
- Base MYSQL exporter
- [mysql] 1 ou plusieur base ?
- Suggestions Google Suggest
Cet outil vous permet d'obtenir une liste de 10 mots ou expressions suggérés par Google sur la base d'un mot que vous fournissez.
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

