Mini moteur de recherche

WRInaute occasionnel
Bonjour,
Je code un mini moteur pour rechercher des images dans ma base de donnée.
J'ai une question sur mon code PHP.

J'utilise str_replace pour éliminer des mots inutiles de la requête tapée par l'utilisateur :
-J'ajoute des espaces autour de la requête.
-je supprime les mots indésirables quand ils sont entourés d'espaces.
-je supprime les espaces autour de la requête.
Je sais que les regex seraient une meilleure solution et je compte régler ça.

Mais j'ai un problème persistant. Le moteur permet de faire trois types de recherches :
-rechercher chaque mot (brique OU rouge -> tous les 'brique' et tous les 'rouge')
-rechercher le groupe de mot (comme %brique rouge% qui englobe aussi par exemple brique rouge jaune)
-rechercher l'expression exacte

Dans le premier type de recherche, il y a un problème : si l'utilisateur tape 2 espaces, le moteur recherche toutes les colonnes du champ de la bdd qui contiennent un espace.

Comment remplacer une suite d'espaces dont on ne connait pas le nombre d'espaces pour la remplacer par un seul espace ?
Merci !
 
WRInaute discret
salut le plus simple est:

Code:
str_replace('  ', ' ', $query);
avec query qui contient la chaine de caracteres sur laquelle tu travailles.
 
WRInaute occasionnel
Merci !
J'avais essayé, et ça ne fonctionne que pour 2 espaces. Mais si il y en a 3 c'est le même problème.

Finalement cette solution fonctionne avec les regex :
Code:
$rec = preg_replace("# {2,}#", " ", $rec);
"si l'espace et répété au moins 2 fois (ou plus) dans la variable $rec -> remplacer par un espace".

Ça fonctionne, mais le code est sale. Si je voulais faire ça proprement, il faudrait utiliser les REGEX à l'intérieur des requêtes SQL. Parce que mon code modifie la requête tapée par l'utilisateur. Si il tape "une brique rouge et verte", le champ se modifie pour marquer "brique rouge verte". Les modifs sont visibles.
A+ je vais essayer d'améliorer tous ça avec les regex, mais c'est compliqué...
 
WRInaute accro
le mieux est d'extraire les mots clés recherchés avec un explode() et d'effectuer ensuite la recherche dans la bdd à partir de ces mots, en utilisant, par exemple, un REGEXP dans le select de la bdd
 
WRInaute discret
salut,
Code:
echo preg_replace('#[[:space:]]{2,}#', ' ', ' h   h  h h      h' );

si tu veux enlever n importe quel type d espace.

Pour ton remplacement de variable suffit de faire une copie = $query = $_POST['query], et tu fais ton traitement sur query et tu reaffiches $_POST['query] pour l utilisateur.

Moi je ferais plutot les regex en PHP puis avec des IN et des OR dans mon sql suivant les operateurs. (en supposant que tu as un thesaurus attache a ta recherche)
 
WRInaute occasionnel
Merci.
Leonick > Ok ! J'utilise déjà un explode() mais mes requêtes SQL sont classiques (sans REGEXP). Je fais les modifs en php sur le $_GET['recherche']...

poulpe > Oui, je peux faire une copie dans une variable bonne idée.
Donc ça ne te parait pas indispensable d'utiliser les REGEXP dans le select de la bdd ?
J'arrive à m'en sortir avec les regex en php mais si j'essaie de les mettre avec le SQL, je bloque. Je vais devoir en apprendre un peu plus mais malheureusement ma doc sur les regex est très limitée sur la partie SQL.

Sinon je cherche également à supprimer les pluriels des recherches (tout est au singulier dans la bdd), ou à rendre facultatif les "S" en fin de mots.
 
WRInaute discret
en fait pour la recherche y a plein de spossibilites:
1) tu fais un index full-text sur les champs pour lesquels tu veux chercher http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

2) tu 'tag' tes produits avec des mots:
tu associes n tags a n produits via une interface, par exemple les tags brique, rouge, vert a ta photo 'maison'.
tu fais une requete sur ta table d association avec where photo = maison et tag in rouge,vert,brique etc... ou bien du AND.
(moi je fais ca souvent car j ai le controle sur ce que je renvoi)

3) tu utilises un moteur de recherche deja developpe type lucene ou sphinx etc...
 
WRInaute occasionnel
Ok. Je pense que j'ai déjà ces "tags" dont tu parles, j'ai un champ qui me permet de générer tous les attributs "alt" des images. Ça fait office de tags ou de mots clés. Le seul problème c'est que la couleur est donnée dans un autre champ. Donc je dois faire des recherches dans 2 champs différents. (il aurait mieux valu regrouper tous les mots clés y compris les couleurs dans un seul champ...).

Je vais regarder pour sphinx et lucerne, mais je ne pense pas avoir le niveau.
 
WRInaute discret
je voulais dire que tes mots cles doivent etre entres dans une table separee.

Code:
keyword(id, keyword)
image(id, path,....)
keywordImage(idkeyword, idImage, ....)

Avec ca, si tu nettoies la chaine avant l envoi, et que tu as un index sur le champ keyword dans ta table keyword tu as l equivalent d une recherche par tag, et tu asjoutes les regles que tu veux avec des clauses IN, ou AND dans ton SQL.

Quand tu ajoutes une image, il te suffit d associer les mots cles que tu veux.
 
Discussions similaires
Haut