Comment utiliser sa propre fonction de comparaison de chaine dans une requete ?

Eléphant du PHP | 91 Messages

31 oct. 2007, 01:56

Bonjour,

J'essaye de parcourir une base mysql 5.0.27 de façon à trouver les produits correspondant à un mot clé.

Bon en bref j'essaye d'améliorer le moteur de recherche de mon site donc.

Pour le moment il se contente d'une recherche à l'aide de :

Code : Tout sélectionner

like '%mot_clé%'
Ce qui donne par ex la requête :

Code : Tout sélectionner

select products_id from table_products where products_name like '%porte_manteau%'
J'aurais aimé utiliser ma propre fonction de comparaison, qui calcule la distance entre deux chaines, et qui permettrais donc de renvoyer des résultats pertinents malgré une faute de frappe/orthographe.

Vais-je devoir tester les produits en les extrayant un à un de la base de données (ou tous d'un coup, puis je filtre ensuite) ou ya-t-il une façon d'inclure la comparaison directement dans la requête ?

Merci de l'aide.

HS : Il doit y avoir un type profondément désespéré derrière la demande de schéma des tables dans les rappels avant de poster ... j'ai faillit avoir une crise d'épilepsie :wink:
( enfin ici, je ne pense pas qu'un seul schéma ne soit pertinent )

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

31 oct. 2007, 03:30

Il doit y avoir un type profondément désespéré derrière la demande de schéma des tables dans les rappels avant de poster
C'est moi, et malgré tout cela les gens continuent à ignorer la consigne.

Eléphant du PHP | 91 Messages

31 oct. 2007, 11:46

Mouais ...

Bon.

Je veut bien donner un schéma de table, enfin je ne vois pas l'intérêt ici, je me trompe peut-être.

Code : Tout sélectionner

CREATE TABLE table_products ( products_id int NOT NULL auto_increment,, products_name text NOT NULL default '', PRIMARY KEY (products_id) );
Désolé de la pointe d'ironie, si elle était déplacée.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

01 nov. 2007, 02:01

Ne t'en fais pas, mon message ne t'étais pas spécialement adressé, je ne faisais que confirmer tes doutes et commenter sur la situation actuelle.

Concernant ton schéma, il a au moins l'intéret de souligner deux aspects importants de ta table : premièrement, il n'y a pas d'index FULLTEXT. Même s'il ne dispose malheureusement pas encore de "correction" des mots mal ortographiés, un index FULLTEXT serait bien plus performant qu'un LIKE. (fais une recherche sur "LIKE FULLTEXT" sur les forums, il doit y avoir pas mal de sujets) Deuxièmement, c'est un champs TEXT et non VARCHAR, ce qui est étrange compte tenu du nom de la colonne. S'il s'agit du nom des produits, il ne devraient pas dépasser les 255 caractères et donc un VARCHAR serait bien plus indiqué.

Pour en revenir à ta question originale, je ne vois pas comment filtrer les résultats à l'aide de fonctions contenues dans une requête. Si tu peux transposer ton algorithme en SQL tu pourrais en faire une procédure, mais c'est beaucoup de boulot pour pas grand chose en fin de compte. Ce que je te recommande, c'est de créer une colonne supplémentaire et y stocker une version "simplifiée" du nom de tes produits. Par exemple, en découpant tous les mots et en les stockant sous forme de lexèmes (cherche sous Google "php french stemmer"). Ou, plus simplement sous forme de metaphone(). Ainsi, "porte-manteau" serait stocké sous la forme "PRT MNT". L'inconvénient de metaphone() est qu'il suit les règles de prononciation de l'anglais et donc certaines modifications seraient nécessaire (retirer les "s" en fin de mots par exemple).

Pour résumer, je pense que ta meilleure option est d'ajouter une colonne où stocker les variations du nom du produit en question. Tu peux remplir cette colonne automatiquement (stemmer, metaphone) voire même à la main lors de la saisie des produits.

Eléphant du PHP | 91 Messages

01 nov. 2007, 02:51

Merci des pistes elles mènent assez loin, je vais pouvoir faire quelque chose de sympa avec tout ça.

Notamment ce code et ses commentaires correspondent pas mal à ce que je veut faire.

Et un autre lien au sujet des stemmers

Au sujet du FULLTEXT, pas tout pigé, sans doute parce que je n'est aucune idée de ce qu'est un index, mais c'est pas les ressources sur le sujet qui manquent.