Re: Amélioration du code pour les recherche s ?
Gilles Vincent <[email protected]>
| Newsgroups | gmane.comp.web.spip.devel |
|---|---|
| Message-ID | <CA+Q4CmvVj0LUkuqtZN9TDk--FEPa2dc0ANCjBvbr+aTWmbP4bA@mail.gmail.com> |
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]>: > 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, 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 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, 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]>: > | > |> 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]>[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 > |> > | >