<<TableOfContents()>>

= Configuration de Sphinx =

Savoirs en partage a besoin de [[http://sphinxsearch.com|Sphinx]] compilé avec `libstemmer`. Or, le Sphinx qui vient avec Debian n'est pas compilé avec `libstemmer`. Nous allons donc installer un paquet maison.

 * Installer le paquet : {{{
# wget http://apt.auf.org/pool/auf/s/sphinxsearch/sphinxsearch_0.9.9-6+auf1_i386.deb
# dpkg -i sphinxsearch_0.9.9-6+auf1_i386.deb
}}}
 
 Il est aussi disponible via apt dans la section `lenny-experimental` du DépôtApt.

 * Modifier le fichier de configuration. Sphinx supporte une méthode simple pour créer des fichiers de configuration dynamiquement. Si le fichier de configuration est exécutable et commence avec un ''she-bang'' (#!), le fichier est exécuté et sa sortie est utilisée comme configuration. Nous utiliserons cette méthode pour inclure la configuration spécifique à Savoirs en partage (qui est elle-même exécutable) dans la configuration globale de Sphinx.

 Voici donc le contenu à mettre dans le fichier `/etc/sphinxsearch/sphinx.conf` après avoir effacé l'exemple de configuration : {{{
#!/bin/sh
#!/bin/sh
#
# Configuration de Sphinx. 
#
# Si ce fichier est un script exécutable, Sphinx utilisera la
# sortie du script comme configuration. C'est ce que nous faisons ici pour
# obtenir une configuration dynamique.

# Inclusion de la configuration de Savoirs en partage

ROOT_SAVOIRS_EN_PARTAGE=/srv/www/www.savoirsenpartage.auf.org
CONF_SAVOIRS_EN_PARTAGE=$ROOT_SAVOIRS_EN_PARTAGE/bin/sphinx.conf.py

if [ -f $CONF_SAVOIRS_EN_PARTAGE ]; then
    /usr/bin/python $CONF_SAVOIRS_EN_PARTAGE
fi

# Configuration globale

cat <<EOF
indexer
{
    mem_limit = 256M
}

searchd
{
    listen = 127.0.0.1:9312
    pid_file = /var/run/searchd.pid
    log = /dev/null
}
EOF
}}}

 Assurez-vous de donner la bonne valeur à la variable `ROOT_SAVOIRS_EN_PARTAGE`, conformément à votre environnement. Par exemple, dans l'environnement de test, c'est plutôt `/srv/www/test.savoirsenpartage.auf.org`.

 Puis, il faut rendre ce fichier exécutable : {{{
# chmod +x /etc/sphinxsearch/sphinx.conf
}}}

 * Lancer l'indexeur pour créer les index initiaux : {{{
# indexer --all
}}}

 * Si tout s'est bien passé, on peut maintenant indiquer au système que nous voulons que le démon de Sphinx soit automatiquement lancé au démarrage en modifiant le fichier `/etc/default/sphinxsearch`. Il faut remplacer la ligne {{{
START=no
}}}
 par (vous l'aurez deviné) {{{
START=yes
}}}

 * On peut maintenant démarrer le démon : {{{
# /etc/init.d/sphinxsearch start
}}}

 * Les index de Sphinx doivent être regénérés à l'aide de l'outil `indexer` qui vient avec le paquet pour prendre en compte les nouvelles données. Le cron job suivant lance la regénération toutes les 15 minutes et écrit la sortie dans un log. {{{
*/15 * * * * root (date; /usr/bin/indexer --all --rotate; echo) >> /var/log/sphinxsearch/indexer.log
}}}

 Si vous n'aimez pas que l'indexeur soit lancé par root, vous pouvez le faire lancer par un autre utilisateur, mais il faut alors lui donner accès en écriture au répertoire `/var/lib/sphinxsearch/data`. 

= Développeur =

== Construire un paquet Debian pour Sphinx + libstemmer ==

 * ajouter les sources Debian dans son `/etc/apt/sources.list` : {{{
deb-src http://ftp.us.debian.org/debian/ squeeze main
}}}
 * mettre à jour les listes de paquets : {{{
sudo aptitude update
}}}
 * produire les paquets pour `sphinxsearch` incluant `libstemmer` : {{{
apt-get source sphinxsearch
cd sphinxsearch-*
wget -O- http://snowball.tartarus.org/dist/libstemmer_c.tgz | tar -xz
sed -i '/\.\/configure /s/$/ --with-libstemmer/' debian/rules
dpkg-checkbuilddeps # installer ce qui manque le cas échéant
# sur lenny installer libmysqlclient15-dev qui fournit libmysqlclient-dev
dch -i # créer une nouvelle version en ajoutant +stemmer0~lenny1
debuild -tc -us -uc
debrelease --dput lenny-test
}}}

== Compiler Sphinx + libstemmer « à la main » ==

 * télécharger sphinx : {{{
wget http://sphinxsearch.com/files/sphinx-0.9.9.tar.gz
}}}

 * télécharger libstemmer (FR) : {{{
wget http://snowball.tartarus.org/dist/libstemmer_c.tgz
}}}

 * extraire ces 2 archives (ex / opt) : {{{
tar zxvf sphinx-0.9.9.tar.gz && tar zxvf libstemmer_c.tgz
}}}

 * copier le contenu de libstemmer_c dans sphinx-xxx/libstemmer_c : {{{
mv libstemmer_c/* sphinx-0.9.9/libstemmer_c/
}}}

 * aller dans sphinx-xxx

 * options de compilation {{{
./configure --with-libstemmer
}}}

 * compiler {{{
make
}}}

 * installer {{{
make install
}}}

 * Les binaires ont été installés sur ma machine dans ''/usr/local/bin'' (search, searchd, indexer)

 * créer le fichier '''sphinx.conf''' dans le répertoire /usr/local/etc/ (le contenu de ce fichier est fourni dans la rubrique suivante,  path à ajuster)

 * la config dynamique générée par buildout s'attends à disposer d'un répertoire /var/lib/sphinxsearch/data accessible en écriture

 * indexer le contenu (créer les fichiers caches dans le répertoire ci-dessus en fonction des requêtes SQL{{{
indexer --all
}}}

 * Lancer le service de consultation de recherche
{{{
searchd
}}}

 * Lancer une recherche textuelle sur le site, si le serveur n'est pas lancé, une erreur : ''connection to localhost;9312 failed ((111, 'Connection refused'))'' apparaitra.