Créer un moteur de recherche avec Sphinx et PHP

Formation

En Ligne

Prix sur demande

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

Description

  • Typologie

    Formation

  • Méthodologie

    En ligne

Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.

Questions / Réponses

Ajoutez votre question

Nos conseillers et autres utilisateurs pourront vous répondre

À qui souhaitez-vous addresser votre question?

Saisissez vos coordonnées pour recevoir une réponse

Nous ne publierons que votre nom et votre question

Les Avis

Le programme

Introduction du cours

Vous avez envie de faire un moteur de recherche, mais vous ne savez pas comment vous y prendre ? Vous ne voulez pas vous embêter à construire des requêtes SQL au risque de vous embrouiller ? Vous avez déjà fait un moteur de recherche, mais il n'est pas très performant et vous en cherchez alors un puissant ? Ce tutoriel est fait pour vous !

Je vais ici vous présenter un moteur de recherche très utilisé, que ce soit par les très gros sites ou les petits sites faits maison. En effet, Sphinx est l'un des moteurs les plus puissants qui existent, avec une vitesse de recherche impressionnante. Il a l'avantage d'être compatible avec de nombreux langages, comme PHP, Python et Java par exemple. Ici, nous l'exploiterons avec PHP.

Pour vous montrer la puissance de cette bibliothèque, j'ajouterai que de nombreux sites utilisent Sphinx, tels que Dailymotion, joomla.org, mysql.com, et même le SdZ. Le plus gros site utilisant Sphinx hébergeant environ 2 TB de données, cela vous donne une idée de la puissance du moteur. ;)

Pour utiliser Sphinx, il va falloir l'installer sur le serveur. Assurez-vous donc que vous ayez les droits nécessaires pour effectuer de telles opérations.

Installation de Sphinx

Commençons par télécharger les fichiers nécessaires au fonctionnement de Sphinx. Pour cela, rendez-vous sur le site de Sphinx, rubrique Téléchargements. Choisissez ensuite la version release. Si vous êtes sous Windows, téléchargez le fichier Win32 binaries w/MySQL support. Sinon, si vous êtes sous Linux ou Mac OS par exemple, téléchargez le fichier Source tarball (tar.gz).

Gardez cette archive dans un coin de votre ordinateur, même après l'installation finie, car elle comporte un dossier (api) dont nous nous servirons par la suite.

Installation et mise en route sous WindowsInstallation

Décompressez l'archive à la racine de votre disque dur, et renommez le dossier en Sphinx. Si votre disque dur se nomme C:, vous devriez avoir un dossier C:\Sphinx.

Ouvrez ensuite l'invite de commandes. Pour cela, cliquez sur le menu Démarrer, puis dans Exécuter tapez cmd et validez. Si votre dossier contenant sphinx est C:\Sphinx, tapez dans la fenêtre ouverte cette commande :

C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf --servicename SphinxSearch

Ceci aura pour effet d'enregistrer le service searchd dans Windows.

Mise en route

Le service est par défaut arrêté, il faut que vous l'activiez manuellement. Pour cela, nous allons d'abord configurer un petit peu Sphinx. Avec Sphinx, toutes les options de configuration se font dans un fichier texte : sphinx.conf, situé dans le dossier C:\Sphinx. Créez donc ce fichier, et mettez-y à l'intérieur :

index dist {         type = distributed } searchd {         port      = 3312         log       = C:\Sphinx\var\searchd.log         query_log = C:\Sphinx\var\query.log         pid_file  = C:\Sphinx\var\searchd.pid }

Puis créez un dossier var dans C:\Sphinx, ainsi qu'un dossier data dans le dossier var que vous venez de créer. Maintenant, Sphinx est correctement configuré pour être lancé. Rouvrez la console (Démarrer, puis Exécuter..., puis cmd) et entrez :

net start SphinxSearch

Sphinx est désormais lancé !

Installation et mise en route sous Linux et Mac OSInstallation

Vous devriez avoir l'archive .tar.gz dans le dossier où vous l'avez téléchargée. Dans un premier temps, décompressez l'archive (clic droit > Extraire ici, ou via un terminal avec la commande tar xzvf sphinx-0.9.9.tar.gz par exemple). Pour qu'on ait tous le même dossier (ce qui peut varier à cause du numéro de version), renommez-le sphinx.

Avant de compiler la bibliothèque, nous devons nous assurer que vous avez les outils nécessaires. Il vous faudra deux outils : gcc et make (sous ubuntu). Pour les installer, il faut vous octroyer le paquet build-essential (sudo apt-get install build-essential).

Nous voilà parés. Ouvrez le terminal si ce n'est pas déjà fait, et dirigez-vous dans le dossier via la commande cd. Invoquons maintenant le fichier de configuration avec cette commande :

./configure --prefix=/usr/local/sphinx

L'option --prefix indique au programme l'emplacement désiré où installer Sphinx.

Si la console vous affiche une erreur stipulant qu'elle ne trouve pas les fichiers d'inclusion de MySQL, installez le paquet libmysqlclient15-dev (sous ubuntu). Il contient un programme qui sera invoqué par le fichier de configuration lui permettant de localiser ces fichiers.

Nous allons maintenant compiler les sources pour créer les fichiers binaires :

make

Tout simplement. ;)
Maintenant que tous les fichiers sont prêts, il ne manque plus qu'à les installer :

sudo make install

Et tout est bon ! :)

Mise en route

Avant de démarrer Sphinx, il va falloir le configurer un minimum. Sphinx se configure à l'aide d'un fichier de configuration du nom de sphinx.conf dans le dossier /usr/local/sphinx/etc s'il n'existe pas, créez-le). À l'intérieur de ce fichier, copiez/collez ceci :

searchd {         port      = 3312         log       = /usr/local/sphinx/var/log/searchd/searchd.log         query_log = /usr/local/sphinx/var/log/searchd/query.log         pid_file  = /usr/local/sphinx/var/log/searchd/searchd.pid }

Ces données informent le moteur de recherche qu'il devra écouter le port 3312 de l'ordinateur (c'est à ce port qu'on se connectera pour exécuter une requête), qu'il stockera son historique dans les fichiers searchd.log et query.log, et enfin que le fichier associé au processus que Sphinx créera sera searchd.pid.

Pour démarrer Sphinx, il suffit de démarrer le service sphinx. Pour cela, si vous êtes sous Ubuntu, la simple commande sudo service sphinx start suffit.

Pour des raisons pratiques, nous allons créer des liens pointant vers les outils de Sphinx (se situant dans le dossier /usr/local/sphinx/bin si vous avez utilisé le même préfixe que moi). Pour cela, il va falloir, pour chaque fichier, exécuter une commande :

sudo ln -s /usr/local/sphinx/bin/indexer /usr/local/bin/indexer sudo ln -s /usr/local/sphinx/bin/indextool /usr/local/bin/indextool sudo ln -s /usr/local/sphinx/bin/search /usr/local/bin/search sudo ln -s /usr/local/sphinx/bin/searchd /usr/local/bin/searchd sudo ln -s /usr/local/sphinx/bin/spelldump /usr/local/bin/spelldumpRecherchons avec SphinxLe fonctionnement de Sphinx

Avant de commencer à rentrer dans le vif du sujet et utiliser bêtement le moteur sans savoir ce qu'on fait, on va d'abord se pencher sur son mode de fonctionnement.

Imaginez votre bureau en désordre, avec vos notes ou vos factures éparpillées n'importe où. Si on vous demandait de retrouver tel montant sur telle facture, vous mettriez un temps fou pour le retrouver ! Pour pallier ce problème, il est recommandé de trier ses papiers pour pouvoir ensuite rechercher à n'importe quel moment et rapidement les informations nécessaires. Et c'est exactement comme ça que Sphinx fonctionne.

Sphinx Search est un moteur de recherche qui permet de rechercher à une grande vitesse du contenu à travers des milliers de documents. Pour ce faire, il a besoin (comme vous et vos papiers) de connaitre ces documents et de les ranger de façon à ce qu'il puisse les retrouver facilement. En effet, si on lui demandait de rechercher à travers une grosse quantité de données sans qu'il ne les ai jamais vues, il devrait tout lire à chaque recherche pour effectuer ensuite des opérations complexes sur les données pour voir si le document correspond à la requête. Tout cela serait bien long, et c'est pour quoi Sphinx opère en deux étapes.

  • La première étape est l'étape d'indexation. Cette étape est l'étape de lecture. C'est à cette étape que Sphinx va lire toutes les données pour les indexer. Il va alors se constituer une grande bibliothèque avec toutes ces données indexées qu'il pourra donc retrouver plus facilement. Cela soulève donc un léger problème, mais nous y reviendrons en temps voulu.

  • La seconde étape est simplement l'étape de recherche. Puisque Sphinx a déjà rangé toutes les données, il est capable de les retrouver en un temps record.

Préparation du terrain

Avant de procéder à une recherche, encore faudrait-il avoir des données à rechercher ! Pour que l'on travaille tous sur une même base de travail, je vous propose de télécharger une liste de 57 news issues du SdZ avec leurs catégories.

Indexer les données

Comme je vous l'avais dit plus tôt, il va falloir indexer les données. Cependant, cela ne se fait pas d'un simple coup de baguette magique : il ne suffit pas de dire à Sphinx « indexe-moi mes news ! », ce serait trop simple ! Non, il va falloir lui donner quelques renseignements.

Avec Sphinx, pour effectuer une recherche sur une table, il faut avant tout créer un index. Un index est un bloc d'informations écrit dans le fichier de configuration qui va indiquer à Sphinx sur quoi il devra effectuer la recherche. Un index ne comporte généralement que 2 informations :

  • Le nom de la source qui lui est associée. Chaque index correspond à une source. C'est dans cette source que vous déterminerez les informations nécessaires au moteur pour pouvoir effectuer la recherche ;

  • L'emplacement où Sphinx créera sa bibliothèque.

Ainsi, si nous voulons créer notre index news, nous procéderions comme ceci :

Sous Linux/Mac OS

Sous Windows

index news {         source = news         path   = /usr/local/sphinx/var/data/news } searchd {         port      = 3312         log       = /usr/local/sphinx/var/log/searchd/searchd.log         query_log = /usr/local/sphinx/var/log/searchd/query.log         pid_file  = /usr/local/sphinx/var/log/searchd/searchd.pid }index news {         source = news         path   = C:\Sphinx\var\data\news } searchd {         port      = 3312         log       = C:\Sphinx\var\searchd.log         query_log = C:\Sphinx\var\query.log         pid_file  = C:\Sphinx\var\searchd.pid }

On va maintenant créer notre source news. Pour commencer, il va falloir dire à Sphinx qu'il devra se connecter à une BDD gérée par MySQL et lui communiquer les identifiants qui lui permettront de s'y connecter, ainsi que le nom de la base de données.

source news {         type                = mysql         sql_host            = localhost         sql_user            = root         sql_pass            =          sql_db              = newssdz } # ...

Si nous le voulons, Sphinx peut exécuter une requête dès qu'il se connecte. Ici, nous allons communiquer des données encodées en UTF-8 : il va donc falloir le dire à MySQL grâce à une requête SET NAMES :

source news {         type                = mysql         sql_host            = localhost         sql_user            = root         sql_pass            =          sql_db              = newssdz         sql_query_pre       = SET NAMES utf8 }

Maintenant, il va falloir indiquer à Sphinx comment récupérer les news pour qu'il les indexe. Pour cela, on va lui écrire la requête qu'il devra exécuter et qui lui retournera toutes les news, avec les champs désirés. Pour cela, une simple requête de type SELECT suffit :

source news {         type                = mysql         sql_host            = localhost         sql_user            = root         sql_pass            =          sql_db              = newssdz         sql_query_pre       = SET NAMES utf8         sql_query           = SELECT id\                                     , categorie\                                     , titre\                                     , contenu FROM news }

Qu'est-ce que j'entends par « avec les champs désirés » ? Visionnez-vous ce que Sphinx va faire : il va récupérer toutes les news en BDD, avec les valeurs des colonnes id, categorie, titre et contenu. Il va analyser chacune de ces colonnes :

  • « Tiens, la première colonne id est une clé primaire unique. J'en déduis qu'elle représente de manière unique, grâce à un identifiant, chaque news. Je vais donc me servir de cet identifiant pour différencier chaque document que j'aurai récupéré. »

  • « Ensuite, il y a une colonne categorie. C'est une simple clé contenant un nombre entier. L'utilisateur veut que je la récupère, donc je m'exécute, mais pour l'instant je vois pas à quoi elle me servira. »

  • « À présent, je vois une colonne titre. Je vois que cette colonne contiendra des valeurs de type texte. Lorsque l'utilisateur effectuera une recherche, j'irai donc chercher là-dedans. »

  • « Ah, il y a aussi une colonne contenu qui est de type texte. J'irai donc aussi chercher là-dedans. »

Sphinx ira chercher dans toutes les colonnes de type texte que vous avez spécifiées.

Vous voyez que pour l'instant, il est un peu inutile pour Sphinx de récupérer la colonne categorie, ça ne lui est pas utile. Or, pour nous, utilisateurs, on aimerait bien que Sphinx puisse nous classer nos résultats en fonction des catégories par exemple. On va donc dire à Sphinx que categorie est un attribut (on pourra alors filtrer et trier nos news grâce à cet attribut) :

source news {         type                = mysql         sql_host            = localhost         sql_user            = root         sql_pass            = ...

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

Créer un moteur de recherche avec Sphinx et PHP

Prix sur demande