Recherche "approximative" dans une base de donnée

Eléphanteau du PHP | 10 Messages

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 !

Mammouth du PHP | 19672 Messages

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...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 10 Messages

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.

ViPHP
pjl
ViPHP | 2119 Messages

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à.

Mammouth du PHP | 19672 Messages

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
Modifié en dernier par Cyrano le 17 août 2011, 05:51, modifié 1 fois.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 10 Messages

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

Eléphanteau du PHP | 10 Messages

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é.