Comme promis, voila un ticket sur Sphinx, un des moteurs de recherche les plus efficace.

Développeur Web pour IPB à mes temps perdus et tres sensibles à l'optimisation du code, j'ai remarqué que sur les gros forums d'Invision, le moteur de recherche FullText est une vraie "merde" dès que le nombre de message deviens trop important. En effet il faut plusieurs secondes pour obtenir un resultat. Un autre problemes rencontrés aussi est la limite de 3 caractères lors de la recherche, cette limite est tres contrainante impossible de recherche des mots tres courant (surtout en informatique) comme IP, SIP, MSN, MAC, PHP, IPB.... et le probleme est tres génant aussi pour le reference des produits qui sont tres courant...

J'avais commencé l'année derniere un moteur de recherche alternatif pour IPB pour un gros site d'actualité francais (avec un forum IPB) en utilisant le projet Xapian, ca a jamais debouché complement et Xapian était tres efficace mais

  • Nécessite un module pour Apache
  • Indexation très longue et complexe à mettre en place
  • Peu de documentation sur la version PHP et requete dur à construire (projet surtout prévu pour du C & co)

Pendant mes "vacances d'été", j'avais commencé à me lancer dans le portage du moteur de recherche utilisant Xapian pour la derniere version d'IPB. Suite à une news sur le site SDZ a propos de leur probleme de moteur de recherche, un des developpeurs du site a dit qu'il travaillait sur l'utilisation de Sphinx pour remplacer MySQL FullText. Je me suis donc interressé à Sphinx.

et j'ai trouvé un petit projet sympa ! Un développeur qui avait rendu public son moteur de recherche texte integrale après avoir rien trouvé sur Internet

Fonctionnalités de Sphinx

  • Support de Mysql, PostreSQL, "XML"
  • Indexation rapide (moins de 5min pour 2millions de messages)
  • Plusieurs modes de recherche (Correspondance tous les mots, Correspondance une phrase, Correspondance "boolean"...)
  • Recherche très rapide ;)
  • Support de la recherche décentralisé
  • Intregration simple grace aux API (Actuellement PHP et Python officielles )
  • Support de soundex et stemmer (Algo pour optimiser la recherche suivant la langue)

Inconvénients (avis perso)

  • Pas de support encore du wildcard (une recherche type mang*)
  • Pas de paquet (rpm, deb...) pour les principales distro
  • Pas de Wiki pour aider dans la documentation actuellement la documenation n'est pas complement à jour et ca pourrait etre interresant d'avoir une documentation "multi langue"
  • Pas de CVS/SVN/Trac enfin... il y a un CVS mais il tourne sur la machine de l'auteur et pas d'acces public ! ca serai plus d'interresant d'avoir un CVS public, ca permet de pouvoir recuperer plus facilement le code et un Trac permettrait une gestion des bugs actuellements ca se passe sur le forum :s

J'ai déjà demander plusieurs fois à l'auteur de mettre en place un SVN avec Trac ;)

Je recommande d'utiliser la version 0.9.7rc2 (actuellement) elle corrige beaucoup de bugs et rajoute le support de plusieurs attributs pour la recherche et un nouveau mode de recherche (mode étendu qui permet de mixer les differents types de recherche)

Indexation avec Sphinx
Sphinx n'indexe pas les messages en direct (à l'inverse du FullText de MySQL), il faut donc relancer l'indexation de la base souvent (le souvent depend des besoins pour une forum une 15aine de minutes suffisent). Sphinx propose un "schema" main + delta qui permet d'eviter une reindexation complete de la base (les anciens messages n'ont pas besoin d'etre reindexer souvent)

Le principe est assez simple
on dispose 2 tables, le main et le delta.
La table main contient l'ensemble de base, on la met à jour une fois par jour, puis toutes les 15 minutes, on met à jour la table delta qui contient les nouveaux messages non indexé dans la table main donc l'indexation de la table dure qqes secondes et cela permet d'avoir un index à jour (il n'est pas possible de mettre à jour une table actuellement, c'est un projet et encore experimentale actuellement)

Sphinx permet après de faire une recherche directement sur les 2 bases

SphinxForIPB
Au final, j'ai donc sorti SphinxForIPB qui permet de remplacer le moteur de recherche d'IPB. La modification ne demande aucune modification de fichier IPB et rajoute uniquement une nouvelle table dans la base de donnée et modifie un settings du PCA (on peux revenir en mode normal/FullText très facilement). SphinxForIPB tourne depuis un bon mois sur Macbidouille et la recherche est devenu un vrai bonheur à utiliser (ultra rapide) et beaucoup moins de probleme de lock de table et de ralentissement du forum

PCinpact a annoncé recement utilisé Sphinx pour le moteur de recherche de leur site :) et va bientot utiliser ma mod SphinxForIPB sur leur forum :)

Pour plus d'information,
le site officiel de Sphinx,
un comparatif des moteurs de recherche du moment
Documentation SphinxForIPB sur le Wikinvision
Annonce PCinpact