SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano

246 Plugins, 178 contribs sur SPIP-Zone, 251 visiteurs en ce moment

Accueil du site > Navigation > Recherche > Recherche Fulltext > Fulltext

Fulltext

14 mars 2009 – par Fil, Nicolas Hoizey, scaron – 49 commentaires

19 votes

Ce plugin permet d’une part d’exploiter le mode de recherche FULLTEXT de MySQL et d’améliorer ainsi énormément les recherches par rapport au fonctionnement natif de SPIP, et d’autre part d’indexer le contenu de certains documents.

Ce plugin permet d’une part d’exploiter le mode de recherche FULLTEXT de MySQL en améliorant ainsi énormément les recherches par rapport au fonctionnement natif (et naïf) de SPIP, et d’autre part d’étendre l’indexation au contenu textuel des documents joints aux articles et/ou rubriques [1].

Indexation FULLTEXT

Performance

Sur une base de test comportant 200 000 articles, la vitesse de la recherche (hors rendu de la page, qui se fait à temps constant) passe de 5 secondes à 10 millisecondes ; sur deux mots, on passe de 15 secondes à 0,1 seconde.

Pertinence

Les résultats sont beaucoup plus pertinents, puisque si on tape deux mots (ou plus), le moteur FULLTEXT va trouver comme avant l’ensemble des articles contenant ces deux mots, mais attribuera un score plus important à ceux qui disposent de ces deux mots consécutifs. Ce score est comptabilisé par la balise #POINTS.

Fonctionnalité

Outre la recherche basique, le mode FULLTEXT permet d’utiliser des opérateurs logiques :

La casse (minuscule/majuscule) des mots recherchés est indifférente.
Les accents ne sont pas pris en compte (« déjà » ou « deja », retourneront à l'identique « déjà », « dejà », « déja »...)
Exemples d'utilisation
  ⇢ Retourne les textes qui contiennent SOIT « enfant », SOIT « étranger », SOIT « enfant » ET « étranger ».
  ⇢ Retourne les textes qui contiennent « enfant » ET « étranger ».
  ⇢ Retourne les textes qui contiennent « enfant » mais présente en premier les textes qui contiennent aussi « étranger ».
  ⇢ Retourne les textes qui contiennent « enfant » mais PAS « étranger ».
  ⇢ Retourne les textes qui contiennent « enfant » ET « étranger » ou bien « enfant » ET « Asie » mais présente en premier les textes qui contiennent « enfant » ET « étranger ».
  ⇢ Retourne les textes qui contiennent « enfant », « enfants », « enfance », « enfanter », « enfantillage ».... (L'astérisque * doit être terminale ; ainsi « *fant » ne retournera rien.)
  ⇢ Retourne les textes qui contiennent exactement la séquence de mots « enfant étranger ».

Remarque : ce tableau constitue le contenu de l’aide fournie dans ce plugin par la balise #AIDE_RECHERCHE.

Principe de fonctionnement

Concernant uniquement la partie mettant en œuvre l’indexation FULLTEXT, le plugin utilise ces deux fichiers :

-  inc/rechercher.php est une amélioration du fichier du même nom livré avec SPIP. À chaque recherche sur une table, ce fichier vérifie la présence d’un ou plusieurs index FULLTEXT sur la table en question (ainsi que sur les tables qui lui sont liées par une jointure, voir ci-dessous).

-  exec/fulltext.php vous propose de créer des index FULLTEXT sur la plupart des tables de SPIP. C’est une proposition, qui correspond aux usages les plus « normaux » de SPIP (pour aller plus loin, cf. ci-dessous, configuration avancée).

Jointures

Le moteur natif de SPIP gère les jointures entre les tables. Avec FULLTEXT on les gère aussi, mais à condition qu’il existe au moins un index FULLTEXT sur chacune des tables liées.

Ainsi par exemple, si vous avez un FULLTEXT sur spip_articles, un autre sur spip_mots, mais aucun sur spip_auteurs, une recherche sur les articles avec le terme « Italie » renverra les articles liés au mot-clé « Italie », mais une recherche sur le terme « Robespierre » ne renverra pas les articles signés par cet auteur.

Autrement dit, sauf application particulière, vous avez tout intérêt à passer l’ensemble des tables en mode FULLTEXT.

Indexation du contenu textuel des documents

Ce plugin propose en outre l’indexation du contenu textuel des documents joints aux articles et/ou rubriques.

Il stocke pour cela dans la table spip_documents une version texte du document, obtenue à l’aide d’un « extracteur ». Cet extracteur peut être un exécutable système lancé depuis le plugin, ou du code purement PHP.

Les formats supportés à partir de la version 0.2 du plugin sont :

  • Le PDF, à condition que le fichier ne soit pas protégé contre la copie

Installation

Mise en place de l’indexation FULLTEXT

Une fois le plugin installé dans le répertoire plugins/ et activé à partir de la page « Gestion des plugins », la recherche fonctionne exactement comme avant. Pour l’installation proprement dite, il faut créer des index FULLTEXT sur les tables ; pour cela, il suffit de se rendre sur la page ecrire/?exec=fulltext, et de valider les opérations proposées.

On peut aussi, alternativement, les créer « à la main » à partir de n’importe quel client MySQL, avec les commandes suivantes :

ALTER TABLE spip_articles ADD FULLTEXT `titre` (`titre`);
ALTER TABLE spip_articles ADD FULLTEXT `tout`
  (`surtitre`,`titre`,`soustitre`,`chapo`,`texte`,`nom_site`,`url_site`,`descriptif`);

Le mode FULLTEXT n’étant disponible que sur les tables au format MyISAM, il faut parfois au préalable convertir les tables dans ce format :

ALTER TABLE spip_articles ENGINE=MyISAM;

La page ecrire/?exec=fulltext permet aussi de faire cela.

Indexation du contenu textuel des documents

Pour l’indexation des documents, il faut installer certains logiciels additionnels, et indiquer leur présence au plugin via des constantes à définir dans le fichier mes_options.php.

Certaines constantes sont génériques, non liées au type de fichier :

  • _FULLTEXT_TAILLE : Taille maximum conservée pour la version texte des fichiers (50000 par défaut)

Pour les PDF

  • Installer Xpdf
  • Définir ces constantes :
    • _FULLTEXT_PDF_EXE (par exemple /usr/bin/pdftotext) : Chemin vers l’exécutable pdftotext de Xdpf afin de transformer les fichiers PDF en texte brut
    • _FULLTEXT_PDF_CMD_OPTIONS (par exemple -enc UTF-8) : Options d’appel de l’exécutable

Suivi

Analyse des recherches

Le plugin fait un suivi de ses opérations liées à la recherche dans tmp/recherche.log ; on voit les index FULLTEXT utilisés, le temps mis pour chaque recherche et le nombre de résultats, etc.

Exemple de log :

Mar 13 15:28:42 1.2.3.4 (pid 21184) fulltext article: titre, full2
Mar 13 15:28:42 1.2.3.4 (pid 21184) fulltext auteur: nom
Mar 13 15:28:42 1.2.3.4 (pid 21184) fulltext mot: titre
Mar 13 15:28:42 1.2.3.4 (pid 21184) MATCH(t.`titre`) AGAINST ('fluor dans l\'eau \"fluor dans l\'eau\"') * 3.1
  + MATCH(t.`surtitre`,t.`titre`,t.`soustitre`,t.`chapo`,t.`descriptif`) AGAINST ('fluor dans l\'eau \"fluor dans l\'eau\"') * 1.4
  + SUM(MATCH(obj1.`nom`) AGAINST ('fluor dans l\'eau'))
  + SUM(MATCH(obj2.`titre`) AGAINST ('fluor dans l\'eau'))
   AS score
Mar 13 15:28:42 96.21.135.101 (pid 21184) recherche article (fluor dans l'eau) : 500 resultats 1.187s

Ce log indique que la table article a deux index FULLTEXT nommés titre et full2 ; que la recherche portant sur « fluor dans l’eau » donne un poids de 3,1 à la présence de ces mots dans le titre, 1,4 dans l’ensemble des champs, et 1 pour le nom d’un auteur ou d’un mot-clé lié par une jointure.

Analyse des extractions

Le plugin fait aussi le suivi des extractions de version texte des fichiers, dans tmp/extract.log.

Configuration avancée des index FULLTEXT

Avec n’importe quel client MySQL (ou phpMyAdmin) vous pouvez aller modifier la structure des index pour affiner les réponses, en incluant ou en excluant des champs, selon vos usages.

Ceci est notamment à faire si vous utilisez Extras2 pour ajouter de nouveaux champs : il faut alors créer un index incluant ces champs, pour qu’ils soient cherchables.

Notre recommandation : supprimer le précédent index FULLTEXT de tous les champs standards, et recréer un index FULLTEXT intégrant les champs standards et les champs extras pertinents. Seuls les champs de type TEXT (ou LONGTEXT etc) peuvent faire partie d’un index FULLTEXT.

Il est aussi possible d’aller bidouiller à l’intérieur du fichier pour, par exemple :

Ajouter des pondérations aux différents index

Le code consiste en une somme des scores donnés aux articles par les différents index. La pondération par défaut est une fonction décroissante du nombre d’éléments dans l’index. Ainsi, si on a deux index sur une table, l’un portant sur le titre, et l’autre sur l’ensemble des champs texte de la table, les termes de recherche présents dans le titre auront un poids de 4 environ, tandis que les mêmes termes trouvés dans le texte ne vaudront que 1 point.

Si l’on veut modifier ces poids il est possible :
— soit de modifier cette fonction pour qu’elle soit plus (ou moins) fortement décroissante ;
— soit d’ajouter un système encore plus compliqué avec des options de configuration ;
— soit d’ajouter un index. Par exemple, pour survaloriser les champs surtitre, sous-titre et chapo par rapport au champ texte, créer un index FULLTEXT supplémentaire avec la commande ci-dessous :

ALTER TABLE spip_articles ADD FULLTEXT `titrailles`
  (`surtitre`,`titre`,`soustitre`,`chapo`);

Cela dit, les réglages proposés par défaut marchent très bien pour nous, essayez-les :-)

Éliminer de la recherche tout un ensemble d’éléments

Scénario : notre base de données comporte toutes les archives d’un journal depuis 1920. Si l’on veut faire une recherche qui limite aux seuls articles récents, il n’est pas raisonnable de demander à inc/rechercher.php de ramener suffisamment d’articles pour ensuite en éliminer 90 % avec un critère {date>1980} dans la boucle. On peut alors envisager d’ajouter « en dur » un critère WHERE supplémentaire au niveau de la requête MySQL de inc/rechercher.php.
-  pour ce faire, on pourra, par exemple, réduire le corpus de recherche pour la table spip_articles, en ajoutant dans mes_options.php une ligne :

 define('_FULLTEXT_WHERE_article', ' t.date>"1980" ');

bien noter qu’il ne faut pas le ’s’ final dans le nom de la table, ainsi que l’utilisation des 2 types de quotes (’ et ") dans la définition de la clause WHERE.

Permettre à l’utilisateur de déterminer le corpus de recherche

On peut vouloir donner la possibilité à l’utilisateur de fixer la date de départ de sa recherche (lui permettre de ne chercher qu’à partir d’une date qu’il fixe lui-même).
Rien de plus simple.

-  Commençons par ajouter un input dans notre formulaire de recherche (formulaires/recherche.html) :

 <input type="text" class="text" size="5" name="recherche_date" id="recherche_date"[ value="(#ENV{recherche_date})"] />

-  Puis, dans notre fichier recherche_fonctions.php :

 if ( _request('recherche_date') && preg_match('/\d{4}/', _request('recherche_date')) ) {
   $limite = _request('recherche_date');
   define('_FULLTEXT_WHERE_article', 't.date>"' . $limite . '"');
   define('_FULLTEXT_WHERE_rubrique', 't.date>"' . $limite . '"');
   define('_FULLTEXT_WHERE_document', 't.date>"' . $limite . '"');
}

Ceci limitera le corpus de recherche (l’ensemble des données dans lequel s’effectuera la recherche) pour les articles, rubriques et documents aux seuls éléments dont la date (en l’occurence l’année de publication) est strictement supérieure à celle fournie par l’utilisateur.

Étendre la recherche aux mots de 3 lettres

Par défaut MySQL FULLTEXT indexe les mots de quatre lettres ou plus. Pour étendre la recherche aux mots de 3 lettres ou plus, il faut modifier la config du serveur (/etc/mysql/my.cnf sous Debian), et ajouter les deux éléments suivants :

[mysqld]
ft_min_word_len=3
[myisamchk]
ft_min_word_len=3

Attention après avoir effectué cette manipulation il est impératif de reconstruire tous les index FULLTEXT de toutes les bases de données présentes sur le serveur, cf. http://dev.mysql.com/doc/refman/5.1....
Une méthode en ligne de commande (il faut être root) :

# /etc/init.d/mysql stop
Stopping MySQL database server: mysqld.
# myisamchk --recover /var/lib/mysql*/*MYI
... (quelques secondes ou minutes) ...
# /etc/init.d/mysql start

Exemples d’utilisation

Suggérer des réponses aux questions sur forum.spip.org

Lire l’article « Forum.spip.org comme base de connaissances » sur spip.blog.

et aussi

... à vous de jouer !

Notes

[1] Uniquement les PDF dans un premier temps.

Retour en haut de la page

49 Messages de forum

Voir toute la discussion

Pages 1 | 2 | 3 | 4 | 5

  • Répondre à ce message

    4 février 00:31, par Mat

    Bonjour, il y avait une balise #EXTRAIT avec le plugin Indexation qui permettait d’afficher dans les résultats de recherche l’extrait où se trouvait le mot recherché. Il me semble que cette balise n’est plus disponible avec le plugin Fulltext ? Y’a-t-il un autre moyen d’arriver au même résultat ? Merci beaucoup !

  • Répondre à ce message

    15 janvier 16:26, par Fil

    Normalement la procédure de conversion utf8 écrit un backup de la base dans le répertoire tmp/

    Cela dit ce n’est peut-être pas si "catastrophique" que cela ; fais un dump SQL de ta base, de manière à pouvoir le cas échéant la récupérer

  • Répondre à ce message

    15 janvier 14:32, par Philippe G.

    Bonjour,
    J’ai un sacré problème, le plugin m’ayant demandé de convertir ma base en utf-8 (pourtant elle y est déjà), j’ai cliqué, me disant qu’il y avait bien une raison pour qu’on me demande cela. le résultat est catastrophique, naturellement. Y a-t-il un moyen de revenir en arrière, sachant que je n’ai pas fais de sauvegarde (erreur que je ne fais pourtant jamais !) ?
    Merci d’avance.
    Philippe

  • Répondre à ce message

    7 décembre 2009 10:40

    merci pour votre réponse, mais j’aurai besoin du contenu de l’un de vos fichier pour avoir une idée sur le contenu de ce fichier, et merci

  • Répondre à ce message

    6 décembre 2009 10:37, par Fil

    oui il fonctionne aussi dans la partie privée

  • Répondre à ce message

    6 décembre 2009 10:31

    Bonjour,

    est-ce que l’activation du plug-in permet d’en avoir également l’usage dans la partie privée ?

    merci

  • Répondre à ce message

    26 novembre 2009 15:09, par Loiseau2nuit

    Euh oui mais non. Son contenu dépend essentielement de la configuration dont TU as besoin. Je peux bien te filer le contenu d’un des miens de fichier mais ca ne t’avanceras absoluement à rien.

    Et pour ce qui concerne le cadre propre à FullText, ce que doit contenir le mes_options.php est déjà indiqué dans l’article ;-)

  • Répondre à ce message

    26 novembre 2009 15:03

    Merci pour votre réponse effectivement ce fichier ne figure pas dans le répertoire config donc pour le crée j’aurai besoin de son contenu, merci de me transmettre le contenu de ce fichier

  • Répondre à ce message

    26 novembre 2009 14:21, par Loiseau2nuit

    2 choses qui me laissent quelques peu perplexes sur la doc :

    je me demande s’il n’y a pas une erreur ici :

    Permettre à l’utilisateur de déterminer le corpus de recherche
    .../...
    Puis, dans notre fichier recherche_fonctions.php :

    Ne fallait-il pas là lire formulaires/recherche.php tout court ? J’ai un doute là, ou alors c’est qu’il manque une étape d’explication à ma compréhension ???


    Ensuite, serait-il possible d’avoir un petit décryptage PHP sur ce que fait exactement cette fonction :

    Ce juste histoire de voir comment l’adapter à autre chose que la date

    (là je bosse sur une recherche multi-critère se basant sur des champs extras en grand nombre + une recherche spécifique sur des références alpha-numériques incluses dans les articles et qu’il faudrait pouvoir remonter aussi, bien que pour la plupart elles ne contiennent qu’1 ou 2 caractères (ex : 6F ou 15CT ....) )

  • Répondre à ce message

    26 novembre 2009 13:43, par Loiseau2nuit

    bonjour moi je n’arrive pas à trouver le fichier mes_options.php, merci de m’indiquer ce chemin

    mes_options.php se trouve dans le répertoire /config à la racine de ton spip.

    Ce fichier n’existe pas par défaut, il faut donc le créer au besoin.

    ... et aussi les différentes étapes à suivre après l’installation de xpdf et fulltext pour commencer l’indexation

    ca par contre, je laisse à d’autres le soin de t’expliquer ça, moi je n’en suis pas encore là dans mon analyse de Fulltext

Pages 1 | 2 | 3 | 4 | 5

Répondre à cet article

Retour en haut de la page

Ça discute par ici

  • Formulaire de participation à un événement

    23 janvier – 17 commentaires

    Cet article tente de rassembler des informations au sujet de l’affichage d’un formulaire de participation aux événements gérés par le plugin Agenda développé par Cédric Morin. La version 2 du plugin Agenda permet d’afficher dans l’espace public des (...)

  • Le Squelette Zpip

    11 novembre 2009 – 119 commentaires

    Zpip [1] est un squelette réutilisable, modulaire et disposant d’une galerie de thèmes. Il est issu d’une fusion des projets Zesty et SPIP-Zen. Installer Zpip Pour installer Zpip et jouer avec sans plus attendre, il suffit de suivre le guide (...)

  • Plugin Pages uniques

    11 décembre 2008 – 74 commentaires

    Allez, avouez... il ne vous est jamais arrivé d’avoir besoin d’articles qui ne sont rattachés à aucun rubriquage particulier ? Des articles uniques, n’ayant ni de thème, ni de rapport avec aucun autre ? Ou encore des articles pour lesquels vous avez (...)

  • Le Couteau Suisse

    4 mai 2007 – 835 commentaires

    Ce plugin propose d’introduire facilement de simples fonctionnalités supplémentaires à SPIP et qui s’avèrent rapidement indispensables ! Par exemple : des filtres supplémentaires, des balises pratiques, des facilités typographiques, le contrôle de (...)

  • Squelette Median

    22 juin 2009 – 77 commentaires

    Un squelette généraliste, valide XHTML, et configurable. Sites de démonstration : en es fr