Recherche Full Text avec Solr sur Magento Community

  • De le 17 mars 2013
  • Difficulté : 2/4

Recherche Full Text avec Solr sur Magento Community La recherche Solr est réservée à la version Enterprise de Magento. De plus en plus de commerçants éprouvent le besoin d'intégrer une recherche poussée (par exemple lexème ou phonétique), car celle-ci est cruciale et participe à convertir d'avantage. Le module décrit dans cet article permet d'utiliser Solr sur une version communautaire de Magento.

Apache Solr

Solr est un moteur d'indexation de texte puissant et populaire. Intégré de base à Magento Enterprise il est voué à remplacer la recherche Full Text traditionnelle de Magento pour un grand nombre de commerçants.

Il est avéré que le comportement naturel d'un internaute tend à passer directement par le moteur de recherche, sans même prêter attention aux menus très hiérarchiques mis à sa disposition. C'est une volonté d'aller vite, mais surtout un besoin de chercher en langage naturel. La recherche est un élément crucial du site e-commerce, et sans doute l'un des plus compliqué à mettre en oeuvre.

Solr répond parfaitement à cette problématique, dans la majorité des cas il pourra pallier au sentiment de frustration éprouvé par l'internaute devant une page ne contenant aucun résultat.

Les filtres proposés par Solr sont nombreux : élision, mots interdits, découpage, accents, casse, phonétique... Correctement utilisés ils contribuent à rendre la recherche performante.

Module Solr Magento CE

Le développement du module a débuté en janvier 2012. Il est aujourd'hui intégré et adapté sur une centaine de sites.

Sources

Principe

Le module n'est en aucun cas une réplique du module Solr de Magento Community. Il s'agit d'une approche simpliste d'intégration de Solr à Magento CE.

Lors d'une recherche Full Text classique, Magento effectue une requête sur les données indexées dans la table catalogsearch_fulltext. Cette recherche SQL offre peu de possibilité en matière de permutations de texte. L'idée est donc d'indexer ces données sur le moteur d'indexation de Solr, de bénéficier de l'ensemble des filtres à disposition lors d'une recherche, et de trier les produits de façon cohérente par pertinence.

Modèles de recherche

Les résultats d'une requête donnée sont, comme pour le système de recherche classique, stockées dans la table catalogsearch_result. L'autosuggestion et la recherche à facette conservent le comportement natif de Magento. Le module dans l'état actuel n'utilise pas Solr pour substituer ces comportements.

Le champ fulltext indexé est strictement identique à celui utilisé nativement par Magento. Il est donc possible de choisir, via la gestion des attributs, les données dans lesquelles il sera possible de puiser pour la recherche.

Librairie

Le module est basé sur la librairie Solr PHP Client à disposition sur Google Code : Solr PHP Client.

Configuration

La configuration s'effectue depuis le menu Système > Configuration > Catalogue > Solr Search Engine.

Configuration du module Magento CE Solr

La configuration demande de renseigner les paramètres du serveur Tomcat sur lequel Solr est installé, d'activer la recherche sur le frontend, et d'autoriser l'indexation des données en backoffice.

L'indexation des données s'effectue pour l'ensemble du catalogue lors de la mise à jour des indexes de recherche de Magento, et sur un produit spécifique lors d'un ajout, d'une modification ou d'une suppression.

Indexation et suppression

L'indexation et la suppression en dehors du module est possible. Les méthodes de la classe Magentix_Solr_Model_Indexer le permettent.

Indexation

/* Indexation de l'ensemble du catalogue */
Mage::getModel('solr/indexer')->rebuildIndex();

/* Indexation d'un produit spécifique */
Mage::getModel('solr/indexer')->rebuildIndex(1);

/* Indexation de plusieurs produits */
Mage::getModel('solr/indexer')->rebuildIndex(array(1,2,3));

Supression

/* Suppression de l'ensemble du catalogue */
Mage::getModel('solr/indexer')->cleanIndex();

/* Suppression d'un produit spécifique */
Mage::getModel('solr/indexer')->cleanIndex(1);

/* Suppression de plusieurs produits */
Mage::getModel('solr/indexer')->cleanIndex(array(1,2,3));

Multi-Store

Le multi-store est géré par l'extension. Un produit est indexé autant de fois qu'il existe de boutiques. Seuls les résultats du store concerné sont présentés à l'internaute.

Response

<result name="response" numFound="2" start="0">
    <doc>
        <str name="fulltext">
            PU001|Machine à café Senseo|Description de la machine à café Senseo|Description courte de la machine à café Senseo
        </str>
        <str name="id">1</str>
        <str name="product_id">1</str>
        <str name="store_id">1</str>
    </doc>
    <doc>
        <str name="fulltext">
            PU001|Senseo Coffee Machine|Description of Senseo Coffee Machine|Short Description of Senseo Coffee Machine
        </str>
        <str name="id">2</str>
        <str name="product_id">1</str>
        <str name="store_id">2</str>
    </doc>
</result>

Schema.xml

Un fichier schema.xml d'exemple est fourni, il est situé dans le dossier etc du module. Il contient les champs nécessaires à l'indexation (id, product_id, store_id fulltext). Les types doivent être adaptés à vos besoins, des connaissance de Solr sont nécessaires. Par défaut, l'analyse du texte (index et query) s'effectue sur le champ de type text_general.

schema.xml

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_fr.txt" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fr.txt" format="snowball" enablePositionIncrements="true" />
        <filter class="solr.LengthFilterFactory" min="3" max="100" />
        <filter class="solr.ISOLatin1AccentFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" preserveOriginal="1" catenateAll="0" splitOnCaseChange="0" />
    </analyzer>
</fieldType>

Indisponibilité

En cas d'indisponibilité du serveur, la recherche Full Text classique Magento est utilisée. Cela reste transparent pour l'internaute.

Recherche avancée

Le module ne gère pas en l'état la recherche avancée avec Solr.

Logs

En cas de problème avec le serveur, des logs sont à disposition. Aucun message d'erreur n'est présenté à l'utilisateur. Le fichier de log est solr.log.

L'enregistrement des logs nécessite que l'option soit activé dans Magento.

Logs

2013-03-17T14:02:24+00:00 ERR (3): '0' Status: Communication Error
2013-03-17T14:16:46+00:00 ERR (3): '400' Status: Bad Request
2013-03-17T15:48:20+00:00 ERR (3): Host parameter is empty

Contribution

Merci aux développeurs ayant apporté leur contribution, notamment Nicolas Trossat (Boutik Circus).

N'hésitez pas à forker :)

commentaires

Commentez cet article : Recherche Full Text avec Solr sur Magento Community