Recherche "approximative" dans une base de donnée

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Recherche "approximative" dans une base de donnée

par demetan » 14 juil. 2005, 16:59

voila ma solution
$sound = SOUNDEX ($search);
$query_sim = "SELECT artist FROM catalog GROUP BY artist ORDER BY artist"; 
$result_sim = mysql_query($query_sim) or die("Query failed"); 
	while (list($artist) = mysql_fetch_row($result_sim)) 
		{		
		if ( SOUNDEX($artist) == $sound && strpos($artist, $search) === false ) 

{ ...
Ca marche ! J'ai l'impression que je fais bcp de calcul donc si qqn a une solution plus rapide, je suis toujours preneur !

le "strpos($artist, $search) === false" permet juste de ne pas remettre des resultats obtenus par un SELECT-LIKE "normal".

En tout cas, merci pour vos reponses ! Cela m'a bien aidé.

par demetan » 14 juil. 2005, 14:45

Merci pour les renseignements !

J'ai trouvé aussi les fonctions :

DIFFERENCE (X,Y) qui compare la distance entre les valeurs soundex de X et Y. Elle ne marche pas chez moi, mais je ne sais pas pourqoi.

LEVENSHTEIN (X,Y) qui calcule combien de lettre on doit changer pour passer du mot X au mot Y.

METAPHONE (X) comme soundex

Pour difference,
j'utilise cette requete ci :

$query_sim = "SELECT artist FROM catalog WHERE DIFFERENCE ($artist, $search) > 3 GROUP BY artist ORDER BY artist";

Mais cela ne marche pas. Si qqn a une idée du pourquoi ...

Merci

par Cyrano » 14 juil. 2005, 12:10

Il y aurait la fonction SQL SOUNDEX()
SOUNDEX(str)

Retourne la valeur Soundex de la chaîne de caractères str. Deux chaînes qui ont des sonorités proches auront des valeurs soundex proches. Une chaîne Soundex standard possède 4 caractères, mais la fonction SOUNDEX() retourne une chaîne de longueur arbitraire. Vous pouvez utiliser la fonction SUBSTRING() sur ce résultat pour obtenir une chaîne Soundex standard. Tout caractère non alpha-numérique sera ignoré. Tous les caractères internationaux qui ne font pas partie de l'alphabet de base (A-Z) seront considérés comme des voyelles :

mysql> SELECT SOUNDEX('Hello');
-> 'H400'
mysql> SELECT SOUNDEX('Quadratically');
-> 'Q36324'
À approfondir, voir ICI

par pjl » 14 juil. 2005, 10:25

regarde de près la doc de MySQL.
Il me semble qu'il y a quelque chose d'intégré qui resemble à celà.

par demetan » 14 juil. 2005, 10:12

Il n'existe pas une fonction pour faire ca ? Si je dois tout faire a la main, ca risque d'etre tres gros.

par Cyrano » 14 juil. 2005, 09:27

Salut,
tu peux faire une recherche de deux manières:

Code : Tout sélectionner

SELECT .... WHERE .... = 'zoro'
Ou bien encore :

Code : Tout sélectionner

SELECT .... WHERE .... LIKE 'zor%'
Rien n'interdit de combiner en mettant un OR.

Ce qu'il faut, c'est que tu génères ta requête en envoyant pour la seconde option une partie du mot recherché en une ou plusieurs déclinaisons : 'z%', 'zo%', 'zor%' etc...

Recherche "approximative" dans une base de donnée

par demetan » 14 juil. 2005, 08:51

Bonjour, voivi mon probleme : J'aimerais faire un moteur de recherche sur bd qui tiendrait en compte les erreurs de frappe ou les ressemblances.
Je vais donner deux exemples :
- On fait une demande sur "zoro" et la recherche se fera sur "zoro" mais aussi "zorro"
- On fait une demande sur "soleils" et la recherche se fait sur "soleils" et sur "soleil".

Une autre facon de voir le probleme : Est ce qu'il existe une fonction/commande qui permet de faire une recherche sur un mot modulo une lettre du mots ?

Merci !