probleme SELECT en MATCH avec du HTML...

probleme SELECT en MATCH avec du HTML... - PHP - Programmation

Marsh Posté le 20-08-2007 à 10:48:04    

Hello a tous ceux qui liront ce message :)
 
J'ai un petit souci dans l'une de mes requetes. Voici la requete en question :

Code :
  1. SELECT * FROM `une_articles` WHERE 1 AND MATCH (texte) AGAINST ('fiscalité') ORDER BY MATCH (texte) AGAINST ('fiscalité') DESC


Cette requete s'execute oui mais incorectement. Je m'explique :
 
Les données contenues dans le champ sur lequel je fais mes requetes sont en HTML saisies par un editeur de contenu. Les é deviennent é etc...
 
Le probleme c'est que cette requete me sort des données incohérente car elle matche uniquement l'expression é dans les autres enregistrements !
Autrement dit cette requete me ressort les enregistrements contenant des mots accentués. Ce qui n'est pas du tout pertinent.
 
Donc si certains d'entre vous ont déjà été exposés à ce genre de problème...

Reply

Marsh Posté le 20-08-2007 à 10:48:04   

Reply

Marsh Posté le 20-08-2007 à 11:32:50    

Fais une fonction qui inverse les codes HTML de tes accents

Reply

Marsh Posté le 20-08-2007 à 14:17:34    

Ca ne règlerais pas le probleme. Le texte dans la base est enrichi. Il ne peut etre stocké qu'en HTML
 
La solution serait pourquoi pas une procédure stockée pour faire une sorte de htmlentity_decode... Et encore je suis en MySQL 4 donc c'est a oublier... :/

Reply

Marsh Posté le 20-08-2007 à 14:39:03    

Citation :

La fonction MATCH() effectue la recherche d'une chaîne de caractères dans une liste de textes (et dans un groupe d'une ou plusieurs colonnes utilisées pour l'index FULLTEXT). La chaîne recherchée est donnée en argument à AGAINST(). La recherche est sans distinguer les majuscules des minuscules. Pour chaque ligne de la table, MATCH() retourne une valeur de pertinence, qui est une mesure de la ressemblance entre le chaîne recherchée et le texte de la ligne dans le colonne donnée dans la liste de MATCH().
 
Quand MATCH() est utilisé comme condition de WHERE (voir l'exemple suivant) les lignes retournées sont automatiquement organisées avec la pertinence la plus élevé en premier. La pertinence est un nombre décimal positif. La pertinence de zéro signifie qu'il n'y a pas de similarité. La pertinence est calculé en fonction du nombre de mots dans la ligne, du nombre de mots uniques dans cette ligne, du nombre total de mots dans la liste, et du nombre de documents (lignes) qui contiennent un mot en particulier.


En clair, même s'il ne trouve que la moitié de ce que tu lui demandes, la valeur de "MATCH (texte) AGAINST ('fiscalité')" sera supérieure à 0 et le système te les retournera. En plus de ça, c'est une recherche qui travaille mot à mot, ça ne m'étonnerait pas que mysql considère que 'fiscalité' est formé du mot 'fiscalit' et du mot 'eacute' vu que le caractère '&' n'est pas une lettre ni un chiffre.
 
Comme le dit nycius, utilise donc une fonction (html_entity_decode par exemple) pour transformer tous les codes html en caractères normaux. Evidement, si t'as des balises html dans tes messages il faudra d'abord les transformer en quelque chose de plus neutre (du bbcode par exemple) Ca résoudra surement ton problème comme par magie.
 
PS : Comme indiqué dans le bout du manuel de mysql que j'ai cité, mysql tri par pertinence décroissante s'il n'y a aucun tri explicite d'indiqué dans la requette. Tu peux donc enlever le "order by" qui lui fait faire deux fois exactement le même boulot.

Reply

Marsh Posté le 22-08-2007 à 10:00:09    

L'utilisation du BBCODE est a exclure car je ne peux pas changer l'editeur de contenu... Enfin si mais ca ferait énormément de taf en plus, et on perdrait nettement en lisibilité :/
 
Mon texte en base est obligatoirement en HTML :spamafote:
 
Donc je sais pas comment régler ce problème :/

Reply

Marsh Posté le 22-08-2007 à 10:06:28    

fait ton match en boolean mode avec un + devant fiscalité

Reply

Marsh Posté le 22-08-2007 à 11:48:47    

Tu peux me donner l'exemple de requete adapté a celui que j'ai donné ?


Message édité par the_bigboo le 22-08-2007 à 11:51:03
Reply

Marsh Posté le 22-08-2007 à 15:10:16    

Reply

Marsh Posté le 22-08-2007 à 15:44:37    

C'est ce que je viens de faire ;)
Merci de ton aide ;)

Reply

Marsh Posté le 22-08-2007 à 17:20:09    

Et ça a marché comme tu voulais?

Reply

Marsh Posté le 22-08-2007 à 17:20:09   

Reply

Marsh Posté le 22-08-2007 à 19:42:42    

A la perfection ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed