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
> |>
> |
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.