Re: Amélioration du code pour les recherche s ?
JLuc <[email protected]>
| Newsgroups | gmane.comp.web.spip.devel |
|---|---|
| Message-ID | <[email protected]> |
Indépendamment des pistes MATCH ou LIKE en alternatives aux REGEXP quand il y a plusieurs mots, il serait efficace de ne pas mettre l'expression entière quand il y a plusieurs mots. C'est inutile s'il suffit qu'un seul des mot soit trouvé pour que la condition soit vraie. Ainsi pour 'Etats unis' au lieu de REGEXPer chaque champ candidat avec 'Etats unis|Etats|unis' il suffit de tester 'Etats|unis'. (le compilateur fait du zèle) JLuc Le 07/01/2016 19:22, Gilles Vincent a écrit : > Bonjour, > > je copie votre réponse à la liste spip-dev, car elle est intéressante et très argumentée. > > J'ai ouvert un ticket pour l'amélioration de la recherche ici : https://core.spip.net/issues/3638 > > .Gilles > > > 2016-01-07 18:18 GMT+01:00 Remi <[email protected] <mailto:[email protected]>>: > > Salut, > > Le problème c'est que ce type de requête est généré dès lors qu'il y a un > espace dans la recherche et les requêtes REGEXP n'utilisent pas les index. > > Donc ça ne concerne pas que les utilisateurs qui recherchent des > expressions régulières. > > Pour une recherche aussi bête que "chercher un mot" ça recherche > REGEXP("chercher un mot|chercher|un|mot") sur chaque colonne de la table > spip_articles. Evidemment ça renvoie tous les articles contenant "un". > > Un exemple particulièrement inefficace: 51s pour faire une recherche sur 2 > mots sans avoir la certitude que les 2 mots ne s'y trouvent. > > # Query_time: 51.073814 Lock_time: 0.018906 Rows_sent: 16363 Rows_examined: 36816 > > SELECT t.id_article, t.surtitre, t.titre, t.soustitre, t.chapo, t.texte, > t.ps <http://t.ps>, t.nom_site, t.url_site, t.descriptif FROM `xxxxxx`.spip_articles AS t > WHERE t.surtitre REGEXP 'Etats unis|Etats|unis' OR t.titre REGEXP 'Etats > unis|Etats|unis' OR t.soustitre REGEXP 'Etats unis|Etats|unis' OR t.chapo > REGEXP 'Etats unis|Etats|unis' OR t.texte REGEXP 'Etats unis|Etats|unis' > OR t.ps <http://t.ps> REGEXP 'Etats unis|Etats|unis' OR t.nom_site REGEXP 'Etats > unis|Etats|unis' OR t.url_site REGEXP 'Etats unis|Etats|unis' OR > t.descriptif REGEXP 'Etats unis|Etats|unis'; > > Ici, ça me renvoie les articles qui contiennent "punissons", > "réunis". > > A ce niveau, un bête like me met "que" 5s: > > SELECT * from (select *, concat( t.surtitre, t.titre, t.soustitre, > t.chapo, t.texte, t.ps <http://t.ps>, t.nom_site, t.url_site, t.descriptif) search from > spip_articles t) s WHERE s.search like '%unis%' or s.search like > '%Etats%'; > > Mais honnêtement 5s, ce n'est pas non plus acceptable. > > Mais s'il vous faut mettre un truc par défaut autre que du fulltext, > utilisez LIKE sur la chaine à rechercher. Ca ira plus vite et ça vous > renverra des résultats plus cohérents. > > Remi > > On Thu, 7 Jan 2016, Gilles Vincent wrote: > > |Bonjour Arnaud, > | > |les recherches de type MATCH() AGAINST() n'ont pas du tout le même > |comportement les recherches par expression régulière, et elles nécessitent > |certaines conditions (en particulier le site ne doit pas utiliser sqlite et > |le format des tables doit être MyISAM sauf à partir de MySQL5.6 qui permet > |d'utiliser innodb). > | > |C'est pour cela que ce n'est pas dans SPIP par défaut. > | > |le plugin Fulltext (http://contrib.spip.net/Fulltext) permet d'utiliser ce > |type de requêtes pour le critère {recherche}. Peut-être que ce sera > |incorporé au core lorsqu'on aura compris qu'une minorité d'utilisateurs > |utilisent des expressions régulières dans les zones de recherche des sites > |:) > | > | > |Bonne année, > | > |.Gilles > | > | > |2016-01-07 13:02 GMT+01:00 arnaud dechelle <[email protected] <mailto:[email protected]>>: > | > |> Salut, > |> > |> Je "m'occupe" (c'est un bien grand mot) de la partie technique du site > |> http://www.europe-solidaire.org/, hébergé chez L'Autre.net > |> <http://www.lautre.net/>. > |> Récemment, un des techniciens de l'association a envoyé le message > |> ci-dessous, précisant avoir modifié le code de Spip pour accélérer le temps > |> de réponse des recherches, et donc de soulager les serveurs de > |> l'association. Il conclue son message en soumettant l'idée de transmettre > |> sa modification aux développeurs de Spip. > |> Donc, ben..., voilà. > |> > |> Bonne continuation et merci pour cet outil génial qu'est Spip. > |> > |> - - - > |> > |> Votre Spip génère des requêtes de recherche très très longues (2 minutes) > |> dès lors qu'on recherche plus de 2 mots. > |> [...] > |> J'ai rajouté la condition suivante dans le fichier > |> ecrire/inc/recherche_to_array.php > |> > |> if > |> (($methode=="REGEXP")&&("spip_articles"==table_objet_sql($table))) { > |> $requete['WHERE'][]="MATCH(`surtitre`,`titre`,`soustitre`,`chapo`,`texte`,`ps`,`nom_site`,`descriptif`) > |> AGAINST('".addcslashes($recherche, "'")."')"; > |> > |> Ce qui solutionne le problème. > |> > |> Il semble que les dernières versions de SPIP connaissent le même problème, > |> c'est pourquoi je vous recommande de rentrer en contact avec les créateurs > |> de ce logiciel pour leur en faire part. > |> > |> Remi > |> pour les roots > |> < <[email protected] <mailto:[email protected]>>[email protected] <mailto:[email protected]>> > |> > |> > |> > |> _______________________________________________ > |> liste: http://listes.rezo.net/mailman/listinfo/spip-dev > |> doc: http://www.spip.net/ > |> dev: http://trac.rezo.net/trac/spip/ > |> irc://irc.freenode.net/spip <http://irc.freenode.net/spip> > |> > | > > > >