Intégrer solr dans WordPress

WordPress / Solr

Certes il existe déjà des plugins qui permettent d’intégrer solr dans WordPress, mais ils sont soit basiques soit non open source. On va donc voir ensemble comment intégrer solr dans WordPress qui est capable d’indexer les champs customs (typiquement des champs ACF) et les documents (pdf par exemple). [Cet article nécessite une connaissance de solr et WordPress.]

Plugin de base

On a inspiré le plugin « Advanced Search By My Solr Server » qui est capable d’indexer les différents posts avec les champs custom mais pas avec leurs pièces jointes. Il dispose d’une page de configuration pour configurer l’information du serveur solr et les paramétrages d’indexation.

Config solr

Une fois solr est installé, il y a un fichier de config (solrconfig.xml) par défaut qui sera utilisé pour chacune collection en cas d’absence de son propre fichier de config. Pour pouvoir indexer les contenus d’un fichier pdf, on va créer notre propre fichier de config en prenant celui par défaut comme base. Et puis on ajoute la requestHandler pour l’indexation de pdf.

<requestHandler name="/update/extract"
                  startup="lazy"
                  class="solr.extraction.ExtractingRequestHandler" >
    <lst name="defaults">
      <str name="lowernames">true</str>
      <str name="fmap.meta">ignored_</str>
      <str name="fmap.meta_author">ignored_</str>
      <str name="fmap.date">ignored_</str>
      <str name="fmap.modified">ignored_</str>
      <str name="fmap.creator">ignored_</str>
      <str name="fmap.content">filecontent</str>
      <str name="uprefix">ignored_</str>
      <str name="literalsOverride">false</str>
      <str name="ignoreTikaException">true</str>
      <str name="captureAttr">true</str>
    </lst>
  </requestHandler>

On indique le schéma d’appel d’indexation et le plugin à extraire le contenu du fichier avec les paramètres par défaut. Toutes les informations extraites sont mises dans fmap avec les champs séparés. Dans notre config, on récupère juste le contenu du fichier et l’envoie à solr dans le champs ‘filecontent’ en ignorant toutes les autres informations (par exemple, le date de création du pdf, l’auteur du ficher, etc.) Plus de détails de paramétrage se trouvent sur le wiki solr.

Schema solr

Comme le contenu d’un fichier est envoyé à solr sous le nom ‘filecontent’, il faut que solr le reconnaisse. On a donc besoin de le déclarer dans le schema.xml. On va prendre le schema.xml par défaut et on ajoute la déclaration du champ filecontent :

<field name="filecontent" type="text" indexed="true" stored="true" multiValued="true"/>

On est prêt du côté solr pour l’indexation du pdf.

Implémention dans WordPress

Ce plugin de base a pris une librairie de solr php client qui a été bien fait. En plus, il y a déjà une classe (Mss_Solr) qui encapsule les fonctions basiques de la librairie, par exemple, la fonction de recherche, de mise à jour, de suppression des documents d’indexation, etc. On ajoute juste la fonction extract dans cette classe pour l’indexation des fichiers pdf.

/**
 * @param string $file chemin du fichier à indexer
 * @param array $options paramétres d'indexation
 * @param object $document l'objet prêt à indexer
 * @param string $memetype mime type du ficher
 * @return Apache_Solr_Response
 */
public function extract($file, $params = array(), $document = null, $mimetype = 'application/octet-stream')
  {
    return $this->_solr->extract($file, $params, $document, $mimetype);
  }

En plus, on va créer une fonction qui sera appelée lors du déclenchement d’indexation dédié aux fichiers.

/**
 * @param array $options paramétres d'indexation
 * @param object $document l'objet prêt à indexer
 * @param object $post_info objet du post (WordPress)
 * @param bool $commit option commit à la fin d'indexation.
 */
function mss_post_media($options, $document, $post_info, $commit = TRUE){
    $file_path = get_attached_file($post_info->ID);
    if(file_exists($file_path)){
        try {
            $solr = new Mss_Solr();
            if ($solr->connect($options, true)) {
                $params = array(
                    'commit' => ($commit ? 'true' : 'false')
                );
                if ($document) {
                    $solr->extract($file_path, $params, $document, $post_info->post_mime_type);
                }
            }
        } catch ( Exception $e ) {
            echo $e->getMessage();
        }
    }
}

Avec cette fonction, on est prêt du côté php aussi, il faut juste simplement appeler cette fonction à la place de mss_post lorqu’on souhaite lancer l’indexation pour un post qui contient du fichier (cela pourrait être au moment de l’ajout et de la modification d’un poste, ou d'une action en masse).

Conclusion

L’indexation de fichier pdf devrait être opérationnelle avec cette configuration. On pourra l’adapter en fonction du besoin de projet sans aucun souci, en plus, c’est bien documenté pour les 2 côtés (WordPress et Solr).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.