Jump to content

Recherche améliorée : Classe Search.php


Recommended Posts

Depuis son passage à prestashop , un de mes clients se plaint du manque de flexibilité de la recherche dans prestashop.

Nombre de ses clients sont habitués à entrer une partie de la référence pour commander directement leurs produits.

Seulement le hic , c'est que la methode find de la classe Search effectue une recherche du type (je shématise) :

select produit where name like 'motclef%'

Je me dis qu'à cela ne tienne, le vais tweaker la classe pour avoir une requête type

select produit where name like '%motclef%'

En même temps je me demande pourquoi cela n'a pas été codé comme ça...

Ben là voilà que les performances s'effondrent, et que la recherche n'abouti pas parce que la requête ne se termine pas...

Le problème vient de l'usage de la clause mysql IN , non adaptée à certains endroits, car suivie d'un select.

Mysql y perd ses index et perd les pédale. Je pense que c'est pour celà que le développeur de la classe a limité le like à motclef% .

IN est là ou mysql pêche le plus, j'ai pu m'en rendre compte à maintes reprises sur des requêtes complexes. (il y a aussi OR mais dans de moindres mesures...)

Le pire intervenant quant on a un ou plusieurs IN (select ....) dans la même requête.

J'ai réécrit un bout de code pour que ce IN soit prérenseigné et je peux désormais avoir un like %motclef% .

Je n'ai rien perdu en terme de performances, alors je vous livre l'override toute faite à placer dans /overrides/classes de prestashop 1.4

Pour ceux qui voudraient le même résultat sur une 1.3 , copiez simplement la methode(fonction) complete

	public static function find($id_lang, $expr, $pageNumber = 1, $pageSize = 1, $orderBy = 'position', $orderWay = 'desc', $ajax = false)
{ ........
	}

et collez la en lieu et place de la même methode dans /classes/Search.php

Pour comparer le résultat allez juste sur votre boutique et rentrez un nom de produit ou une référence tronquée à gauche comme pod au lieu de ipod

C'est un premier jet; car je pense que cette classe peut être encore plus optimisée , sans bien sûr lui enlever quelque fonctionnalité que ce soit.

Edit:

fichier mis à jour le 08/04/2011 , suivant les recommandations de Coeos

fichier mis à jour le 09/04/2011 , suite à un malheureux mélange de version %-P

NB : fichier override 1.4 uniquement , je préparerais un fichier prémodifié spécifique 1.3 sous peu

Search.php

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour, du bon boulot ;)

J'ai juste une petite remarque, tu ne mets pas beaucoup de ` personnellement j'en met toujours autour des noms des champs.

Sinon, je viens de tester les différentes requêtes avec mon nouveau module "Ultimate debug" (oui, je sais je me fais un peu de pub, mais bon...) et j'ai pu constater que pour pour la première requête (ligne 27: "$inListResult = $db->ExecuteS('SELECT id_product..." ) on obtenait une liste de id_product, mais ceux ci peuvent être en double : http://i.imm.io/4R4G.png et http://i.imm.io/4R76.jpeg
En rajoutant un DISTINCT c'est bon : http://i.imm.io/4R4Q.png et http://i.imm.io/4R7f.png

Merci pour cette optimisation Broceliande.


EDIT : dans la version 1.4 ils ont remplacé tous les intval($xxx) par (int)$xxx apparemment c'est 2 à 4 fois plus rapide (entre autre) : http://stackoverflow.com/questions/239136/fastest-way-to-convert-string-to-integer-in-php

Link to comment
Share on other sites

Merci coeos de ton test avancé et de ton retour très précis.
Tu n'as pas tort pour le `, je zappe assez souvent même si je me force un peu depuis quelques temps. Tout dépend de ce que je suis en train de faire... et du temps que j'ai... mais je vais ajuster ça n'aies craintes ;) .

Tu as fort raison de revenir sur ton module, car je suis très tenté de l'essayer (et l'adopter) , c'est même dans ma todo lol.

Le cast (int) est en effet plus rapide, intval étant une fonction plus aboutie mais permettant le cast en base n
C'est une bonne inspiration qu'ils ont eu la , d'autant que des intval il y en a un paquet dans presta !

Pour le distinct, je croyais avoir le groupby kivabien ... il manque peut être dans les pré-requetes, je vais regarder et corriger ça.

Merci encore, ça m'encourage à pousser plus loin l'optimisation de cette classe.

Link to comment
Share on other sites

Bonjour,

Merci pour cette amelioration appreciable. Je trouve aussi que la recherche PrestaShop est assez limitee. Notamment le fait que seuls les produits sont cherches (et non les categories ou boutiques). Si vous avez des pistes la dessus je suis tres tres preneur !

Apres avoir copie le fichier Search.php dans le dossier /override/classes la recherche fonctionne bien avec les mots tronques a gauche. En revanche seul le nombre de resultats s'affiche "1 résultat a été trouvé" et plus de liste en dessous.. du coup c'est moins utile^^
C'est pareil peut importe la recherche, tronquee ou pas.
Avez-vous deja eu des retours concernant ce probleme? Est-ce que ca peut etre du a une modification du theme que j'aurai faite? (Je debute dans PrestaShop).

Merci d'avance pour votre reponse!

Link to comment
Share on other sites

Hmm , j'ai l'impression que j'ai mélangé du code 1.4 et 1.3 , bizarre .
La recherche ajax fonctionne parfaitement alors que quand on clique sur le bouton :
Unknown column 'p.id_tax' in 'on clause' ...
Je vais reprendre ça
En revanche , je n'ai pas de souci type 1 seul résultat dans l'autocompletion (recherche ajax) , bizarre également.
Est-ce que ton index est bien construit ?

Link to comment
Share on other sites

J'utilise le code updaté du post [ # 9 ] avec 1.3.7 et je ne vois pas de probleme. Mon bloc recherche est dans ma colonne de gauche.


Oui oui! mais c'est mea culpa , en fait le code que j'avais posté initialement était celui d'une 1.3.7 . C'est pour cela que ça roule chez toi. Par contre ne 1.4 , autant l'ajax pose no problem, autant lorsqu'on utilise le bouton rechercher, là on avait une erreur...

Du coup la classe présente dans le premier post est désormais une 1.4 , il manque la 1.3.7 ;) que tu as déja au final :-)
Link to comment
Share on other sites

  • 2 months later...

Tiens, c'est amusant quelqu'un m'a posé exactement la même question sur Skype cet après midi et je lui ai donné exactement la même réponse (l'override, le %, etc. ^^).

ça m'a moi aussi étonné que ce ne soit pas de base, j'ai donc proposé qu'on le fasse, on m'a dit "ben oui évidemment" jusqu'à ce que je tombe sur quelqu'un qui m'a dit "ah non surtout pas ! ça tue les perf' car l'indexation est pété".

Et évidemment oui, Si l'on a un catalogue un peu conséquent avec des description importantes, le fait d'utiliser la table word_search n'a plus aucun avantage.

Je pense qu'il est envisageable de laisser le choix dans la configuration "autoriser la recherche en milieu de mot" en précisant bien que les risques de lenteur sont importants sur un gros catalogue (gros à définir clairement ^^)

.

Edit: J'ai (maintenant) lu complètement le premier message, et donc ma réponse ne fait que confirmer tes soupçons !

Link to comment
Share on other sites

Ben captain , il faut croire que ça n'intéresse personne à part mes clients et nous deux :s


Alors, tu vois ! ;)

... j'ai donc proposé qu'on le fasse, on m'a dit "ben oui évidemment" jusqu'à ce que je tombe sur quelqu'un qui m'a dit "ah non surtout pas ! ça tue les perf' car l'indexation est pété".


?? qu'est-ce que cet individu entend par là ? pété ... de rire ? :lol:

... ... en précisant bien que les risques de lenteur sont importants sur un gros catalogue (gros à définir clairement ^^)


Comme toutes les requêtes ... Comme tu dis : Gros à définir ...

Ceci dit, la recherche est une action déclenchée par l'utilisateur : il sera prêt à attendre un chouia ... :roll:

Et puis, une recherche qui ne retourne aucun résultat, ça n'est pas très bon !!
Link to comment
Share on other sites

  • 2 weeks later...

Bonjour tout le monde,

Edern, as-tu trouvé une solution sur la recherhe par catégorie??
j'ai le meme probleme je suis sur la version 1.3.7, je peux seulement faire la recherche par produits et c'est assez embetant.
Je cherche depuis des jours une solution en vain, aucuns modules, nada. Je suis donc preneur si vous avez une solution a ce probleme. Merci ;)

Link to comment
Share on other sites

  • 1 month later...
  • 4 weeks later...
  • 2 weeks later...

Bonjour,

Magnifique optimisation ! Avec mes 150 000 produits, mon serveur croule sous les requêtes de recherche des bots...

Je suis à la recherche d'une version qui fonctionnerait pour une 1.2.5 ou en tout cas inférieur à 1.4

Auriez-vous le fichier en stock ? Cela m'aiderait bcp et je vous en serait reconnaissant.

Link to comment
Share on other sites

  • 4 months later...

Bonjour

 

merci pour ce fichier et ce développement. Juste une chose, si j'ai bien compris j'ai remplacé la fonction du fichier original par celle du fichier fait par le forum, cependant je ne constate pas de changements dans mes résultats. + notre site fonctionne avec des produits ayant beaucoups de déclinaisons différentes, mais il m'est impossible de retrouver un produits par une référence faisant partie des déclinaisons. Existe t'il une solution ?

 

Merci d'avance

Link to comment
Share on other sites

Afin de clarifié mon besoin voici comment sont faient mes produits

 

j'ai une référence appelé par exe REF--T355 ou les -- sont différents produits de couleurs leurs différentes. donc dans déclinaison j'ai pour un produit Bleu REFBLT355 etc...

 

si je tape dans mon module de recherche REFBLT355 il ne me trouve rien :'(.

 

Merci d'avance pour toute aide.

Link to comment
Share on other sites

je viens de comprendre que sur ma version 1.4.6.2 le search.php est déja le bon, et donc que le problème vient de mes caractères spéciaux -- dans ma recherche ou dans mes réf produits. y a t'il un moyen de contrecarré ça ? + le soucis de recherche dans les déclinaisons ?

Link to comment
Share on other sites

  • 11 months later...

Bonjour

 

je tourne en 1.4.4.0 et lorsque j installe le fichier, la recherche répond instantanément mais sur une page blanche.

 

De plus l'indexation en back office des produits ne fonctionne pas.

 

Lorsque je supprime ce fichier tout refonctionne, la lenteur de la recherche aussi..

 

Avez vous rencontré ce problème?

 

Merci de votre aide

Edited by quickman26 (see edit history)
Link to comment
Share on other sites

  • 1 month later...
  • 9 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...