Retour : Page Principale > sommaire aide > sommaire aide logiciels

Sphinx


Note : on ne s'en sert plus, et on a Algolia (réfléchir à mettre plus de truc dedans - 2017-07)

Ressources

Configuration d'un compte utilisateur sphinx
  • CrĂ©ation d'un compte utilisateur sphinx :
    • sudo addgroup sphinx
    • sudo adduser --ingroup sphinx sphinx
  • Modifier le fichier .bashrc de sphinx :
    • Se connecter en Sphinx : sudo su - sphinx
      • umask 0002
      • export PATH=$PATH:$HOME/bin

Configuration post installation
  • CrĂ©ation d'un fichier de conf par dĂ©faut pour les test :
    • Aller dans le dossier de config de sphinx : cd /home/sphin/etc
    • Copier le fichier de config par dĂ©faut : cp sphinx-min.conf.dist sphinx.conf
  • Transfert des logs dans /home/log :
    • cd /home/sphinx/var/
    • rm -fR log
    • mkdir /home/log/sphinx/
    • chown sphinx:sphinx /home/log/sphinx/
    • ln -s /home/log/sphinx/ log
  • Attribuer toues le contenu de /home/sphinx Ă  sphinx : chown -R sphinx:sphinx /home/sphinx

Autoriser Sphinx dans Shorewall
  • Ajouter au fichier rules les règles ci-dessous : vi /etc/shorewall/rules
  • RedĂ©marrer Shorewall : /etc/init.d/shorewall restart
  • RedĂ©marrer Sphinx : /etc/init.d/sphinx restart
Règles pour le fichier /etc/shorewall/rules :
# sphynx + mysql
ACCEPT          net:193.54.123.169 $FW  tcp     9312,9306,3306


Installer le script de démarrage
  • cd /home/admin/scripts
  • wget http://sphinx.monptitblog.com/files/2010/08/sphinx.txt -O sphinx
  • Le script d'installation devrait utiliser ce fichier mais la manipulation manuelle est la suivante :
    • cp sphinx.txt /etc/init.d/sphinx
    • chmod +x /etc/init.d/sphinx
  • VĂ©rification dĂ©marrage :
    • /etc/init.d/sphinx start
    • ps aux | grep searchd | grep -v grep : 1 processus s'affiche
    • VĂ©rification arrĂŞt :
      • /etc/init.d/sphinx stop
      • ps aux | grep searchd | grep -v grep : rien ne s'affiche

Vérification de l’installation
  • VĂ©rification arborescence de dossiers sphinx : ls -al /home/sphinx
    • /home/sphinx doit contenir les dossiers : bin, etc, src et var
  • VĂ©rification recherche :
    • Commencer par corriger les droits de la base de donnĂ©es "test" de mysql :
      • cd /usr/local/mysql/data/
      • chown -R mysql:mysql test
    • CrĂ©ation d'une base mysql de test si nĂ©cessaire (normalement, elle existe dĂ©jĂ  mais ses fichiers ont des droits root - voir ci-dessus) : mysqladmin -u root create test
    • mysql -u root test < example.sql (note : la base doit s'appeler "test" car le fichier example.sql y fait rĂ©fĂ©rence)
    • Indexer le contenu : /home/sphinx/bin/indexer test1
    • Rechercher : /home/sphinx/bin/search -i test1 "four"

Automatiser l'indexation
  • Ajouter dans le dossier /etc/cron.daily un fichier sphinxsearch
    • vi /etc/cron.daily/sphinxsearch
    • Ajouter le contenu ci-dessous
  • Donner les droits d'execution : chmod 755 /etc/cron.daily/sphinxsearch
Fichier /etc/cron.daily/sphinxsearch
#!/bin/bash
# Script permettant une indexation des données pour Sphinx Search
#
# Auteur : Jean-Pascal MILCENT (2013-12-24)
# Notes : 
# - script Ă  placer dans /etc/cron.daily
# - l'option rotate évite de devoir arrêter le demaon searchd
# Log : 
# 2013-12-24 [Jean-Pascal MILCENT]: creation du script

/home/sphinx/bin/indexer --quiet --config /home/sphinx/etc/sphinx.conf --rotate i_spip i_papyrus i_projet i_bazar i_coste i_nvjfl >/dev/null 2>&1


Utiliser Sphinx Ă  distance
Sphinx est installé sur Agathis et Mysql sur Sequoia.
Sur Sequoia (193.54.123.169) :
  • dĂ©finir un utilisateur mysql sphinx (avec Phpmyadmin ou Webmin) qui aura pour paramètres :
    • host : 193.54.123.216
    • password : comme sur Agathis
    • le droit SELECT sur les bases de donnĂ©es auxquelles il doit accĂ©der
Sur Agathis (193.54.123.216) :
  • ouvrir dans Shorewall les ports de Sphinx pour Sequoia : 9306 et 9312
    • dĂ©finir un utilisateur mysql sphinx (avec Phpmyadmin ou Webmin) qui aura pour paramètres :
      • host : 193.54.123.216
      • password : comme sur Sequoia
      • le droit SELECT sur les bases de donnĂ©es auxquelles il doit accĂ©der

Tester Sphinx depuis Sequoia (moteur de recherche de Tela Botanica)
  • Se connecter en ssh sur Sequoia.
  • Connecter le port Sphinx sur Agathis : /usr/local/mysql/bin/mysql -h 193.54.123.216 -P 9306
  • Tester une requĂŞte : SELECT * FROM i_projet, i_spip, i_papyrus, i_bazar WHERE MATCH('journe');

Erreur : error while loading shared libraries: libmysqlclient.so.18
Si cette erreur est obtenue lors du lancement de l’exécutable /home/sphinx/bin/search , il est nécessaire de réaliser les étapes suivantes :
  • ajouter un fichier localapp.conf dans /etc/ld.so.conf.d/ : vi /etc/ld.so.conf.d/localapp.conf
  • ajouter la ligne : /usr/local/mysql/lib
  • prise en compte de la modif : ldconfig

Erreur : ERROR: index 'i_nvjfl': sql_connect: Can't connect to local  MySQL server through socket '/tmp/mysql-55.sock' (2) (DSN=mysql://sphinx:***@localhost:3306/tb_eflore).
Si l'emplacement du socket mysql par défaut utilisé n'est pas bon :
  • Modifier la ligne pointant vers les libs Mysql dans le fichier /etc/ld.so.conf.d/localapp.conf : vi /etc/ld.so.conf.d/localapp.conf
  • Recharger les emplacements des libs (en root) : ldconfig
  • Modifier le script de compilation pour indiquer le nouveau emplacement de la lib Mysql par dĂ©faut (port 3306)

Erreur : FATAL: no readable config file (looked in /home/sphinx/etc/sphinx.conf, ./sphinx.conf).
Nécessite de créer un fichier de configuration. Le fichier par défaut peut être utiliser pour les test :
cp /home/sphinx/etc/sphinx-min.conf.dist /home/sphinx/etc/sphinx.conf

Erreur : FATAL: failed to open log file '/home/sphinx/var/log/searchd.log': Permission denied
Il est nécessaire de rediriger les logs vers le dossier contenant l'ensemble des logs du système (/home/log).
Par ailleurs, il faut aussi attribuer le bon utilisateur au dossier /home/sphinx.
Pour ces deux cas, voir ci-dessus la config post installation.

Erreur : index 'test1': search error: .
Il semblerait que cette erreur n'est pas d'impact pour l'utilisation avec PHP...
Voir : http://sphinxsearch.com/forum/view.html?id=9370
Pour passer outre cette erreur : One workaround is to the pass the --noinfo or -q flag to 'search.'
Voir : http://sphinxsearch.com/bugs/view.php?id=1424

Fichier de démarrage
Source : http://sphinx.monptitblog.com/files/2010/08/sphinx.txt
#! /bin/sh
### BEGIN INIT INFO
# Provides:          Sphinx search engine daemon searchd
# Required-Start:    $local_fs $remote_fs mysql
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: Start and stop the Sphinx search engine daemon searchd
# Description: Start and stop the Sphinx search engine daemon searchd     
### END INIT INFO

# Author: Michael Dufosse <mdufosse@monptitsite.com>
#
# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="Sphinx search engine daemon"
NAME=searchd
DAEMON=/home/sphinx/bin/$NAME
DAEMON_ARGS=""
PIDFILE=/home/sphinx/var/log/$NAME.pid
SCRIPTNAME=/etc/init.d/sphinx

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
[ -f /etc/default/rcS ] && . /etc/default/rcS

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --chuid sphinx:sphinx --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
		|| return 1
	start-stop-daemon --chuid sphinx:sphinx --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
		$DAEMON_ARGS \
		|| return 2
	# Add code here, if necessary, that waits for the process to be ready
	# to handle requests from services started subsequently which depend
	# on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too if this is a daemon that forks
	# and if the daemon is only ever run from this initscript.
	# If the above conditions are not satisfied then add some other code
	# that waits for the process to drop all resources that could be
	# needed by services started subsequently.  A last resort is to
	# sleep for some time.
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
	[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE
	return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
	#
	# If the daemon can reload its configuration without
	# restarting (for example, when it is sent a SIGHUP),
	# then implement that here.
	#
	start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
	return 0
}

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  reload)
	#
	# If do_reload() is not implemented then leave this commented out
	# and leave 'force-reload' as an alias for 'restart'.
	#
	log_daemon_msg "Reloading $DESC" "$NAME"
	do_reload
	log_end_msg $?
	;;
  restart|force-reload)
	#
	# If the "reload" option is implemented then remove the
	# 'force-reload' alias
	#
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  *)
	echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
	#echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
	exit 3
	;;
esac

: