Introduction
Pour comprendre l’intérêt du plugin, nous invitons à lire l’article suivant Indexer : Introduction. Le fonctionnement de la boucle SPHINX est expliqué dans cet article :
Indexer : La boucle SPHINX. La suite de l’article aborde uniquement l’installation et la configuration du plugin Indexer et du moteur Sphinx .
Rappel pour les lecteurs inattentifs, il faut installer Sphinx en plus du plugin.
Compatibilité
Le plugin Indexer
(compatible SPIP 2.1 et SPIP 3.x) exploite le mode RT (real-time), l’API mysql, et les fonctionnalités JSON de Sphinx. Pour cette raison il ne fonctionne qu’à partir de la version 2.2 de Sphinx.
Note : l’ancien plugin SPIP Sphinx
(doc) exploite le mode standard de Sphinx, et son API native.
Description technique
Le mode RT de Sphinx permet à tout moment d’enrichir ou d’actualiser les contenus de Sphinx, par l’intermédiaire de requêtes proches de l’écriture SQL, et donc assez familières. Ainsi, le plugin Indexer
actualise l’index de Sphinx après chaque modification d’un contenu dans SPIP. La page exec=indexer
permet d’indexer ou de réindexer tous les contenus du site.
Le plugin intègre quelques documentations :
http://zone.spip.org/trac/spip-zone/browser/_plugins_/indexer/trunk/doc
Notamment, par défaut, il utilise un index nommé ’spip’. Cet index Sphinx ressemble beaucoup à une table SQL. Chaque entrée dans l’index est appelé un document. Ici, un document possède certains champs assez communs, qui sont détaillés dans la documention de l’indexation.
Installation de Sphinx
Sphinxsearch fournit un ensemble de paquets selon les environnements serveurs (Windows, Linux, Debian, ....) depuis la page :
http://sphinxsearch.com/downloads/release/
Le point important est de prendre un version supérireure à 2.2
L’installation est à effectuer selon votre environnement (exe, yum, apt-get/aptitude, ....)
Vous pouvez contrôler le bon fonctionnement de Sphinx via la commande suivante (à exécuter en root ou assimilé)
searchd
Création de la configuration Debian et dérivés
Il faut créer le fichier de configuration de sphinx dans /etc/sphinx/sphinx.conf
.
Un fichier d’exemple est fourni avec le paquet debian/ubuntu.
Nous pouvons utiliser du PHP pour gérer la configuration dans des fichiers séparés dans /etc/sphinx/conf.d-enabled/
ou /etc/sphinxsearch/conf.d-enabled/
. On en profite pour créer le répertoire manquant sous Ubuntu/Debian :
Fichier /etc/sphinx/sphinx.conf
ou /etc/sphinxsearch/sphinx.conf
#!/usr/bin/env php
<?php
# Correction bug paquet debian / ubuntu
if (!is_dir('/var/run/sphinx')) {
mkdir('/var/run/sphinx');
}
# Recherche et inclusions des configurations
foreach (glob(__DIR__ . '/conf.d-enabled/*.conf') as $conf) {
include $conf;
}
Créer le répertoire /etc/sphinx/conf.d-enabled
ou /etc/sphinxsearch/conf.d-enabled
(et éventuellement conf.d-available
)
Dans conf.d-enabled, mettre :
- le fichier 1_charsets.conf
- Remarque : C’est un script il doit donc avoir les droits d’exécution.
- le fichier searchd.conf :
On précise les IP d’écoute, pour restreindre au serveur local pensez à mettre 127.0.0.1 et non l’ip publique de votre serveur.
On peut noter que searchd fournit par défaut des connecteurs sur divers ports :
- API interface « native » 9312
listen = 127.0.0.1:9312
- API interface « SphinxQL » 9306
listen = 127.0.0.1:9306:mysql41
Le plugin Indexer n’utilise que l’inteface SphinxQL, il est donc tout à fait possible de désactiver l’interface 9312.
Si le répertoire de référence est sphinxsearch et non sphinx, pensez à corriger la config suivante en actualisant les chemins.
searchd
{
# [hostname:]port[:protocol], or /unix/socket/path to listen on
# known protocols are 'sphinx' (SphinxAPI) and 'mysql41' (SphinxQL)
# listen = 9306:mysql41
listen = 127.0.0.1:9306:mysql41
pid_file = /var/run/sphinx/searchd.pid
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
binlog_path = /var/lib/sphinx/
}
- le fichier spip.conf :
index spip{ type = rt path = /var/lib/sphinxsearch/data/spip rt_field = title rt_attr_string = title rt_field = summary rt_attr_string = summary rt_field = content rt_attr_string = content rt_attr_timestamp = date rt_attr_timestamp = date_indexation rt_attr_string = uri rt_attr_json = properties rt_attr_string = signature <?php echo _CHARSET_INDEXATION_FR ; ?> }
Relancer le démon searchd une fois ceci effectué :
sudo searchd --stop
sudo searchd
# ou
sudo service sphinxsearch restart
Tester que Sphinx est bien lancé
Se connecter à Sphinx via le client mysql ou mariadb :
mysql -h0 -P9306
Quelques commandes :
-
show tables;
: liste l’ensemble des indexes -
describe spip;
: décrit les champs d’un index
> show tables;
+-------+------+
| Index | Type |
+-------+------+
| spip | rt |
+-------+------+
1 row in set (0.00 sec)
> describe spip;
+------------+-----------+
| Field | Type |
+------------+-----------+
| id | bigint |
| title | field |
| summary | field |
| content | field |
| date | timestamp |
| title | string |
| summary | string |
| content | string |
| uri | string |
| signature | string |
| properties | json |
+------------+-----------+
11 rows in set (0.00 sec)
Préparer SPIP et indexer ses articles
Si sphinx est actif (on peut se connecter à lui via mysql), on peut alors, si il est installé sur le même serveur que le site SPIP, directement l’interconnecter avec SPIP.
La configuration de base se fait dans config/mes_options.php :
define('SPHINX_DEFAULT_INDEX', 'spip');
define('SPHINX_SERVER_HOST', '127.0.0.1');
define('SPHINX_SERVER_PORT', 9306);
Pour ce faire, télécharger et activer le plugin Indexer.
Une fois actif, aller sur la page ecrire/?exec=indexer
.
L’interface est encore très sobre, mais on peut démarrer l’indexation de tous les articles du site en cliquant « démarrer ». Cela peut prendre un peu de temps en fonction de la machine et du nombre d’articles.
Une fois indexé, une page (joliment affichée si « spipr-dist » est actif) peut être visitée pour tester un peu : ?page=sphinx
. Cette page affiche un champ de recherche, ainsi que des facettes sur les auteurs, les mots clés ou la date.
Interdire les écritures
Si vous utilisez ce plugin sur un site de préproduction, la configuration suivante permet d’interdire les écritures dans la base sphinx :
define('_INDEXER_READONLY', true);
Discussions par date d’activité
21 discussions
SPIP semble essayer d’insérer des choses dans l’index de Sphinx, mais cela ne fonctionne pas :
Yep !
En supprimant date_indexation dans le fichier lib/Indexer/Storage/Sphinx.php de la requête SQL, sphinx c’est soudainement mis à indexer le contenu.
Cepandant, je dois que ce soit bien, ce champs devrait fonctionner !
Il ne faut rien supprimer du tout évidemment. :)
C’est à priori parce que tu as une vieille installation, une vieille déclaration de la config Sphinx, qui date d’avant l’ajout de ce champ. Dans le plugin, l’exemple de configuration contient bien ce nouveau champ :
http://zone.spip.org/trac/spip-zone/browser/_plugins_/indexer/trunk/doc/Configuration%20Sphinx.md#L19
Donc il faut que tu supprimes ta base et que tu la recrées avec ce champ ou bien que tu trouves la commande SphinxQL qui ajoute ce champ sans tout supprimer (il me semble que ça existe mais je ne suis pas sûr).
Du coup, c’est l’article de contrib qui n’est pas à jour, car j’ai copié/coller le spip.conf de l’article.
Ok corrigé
Hello,
Merci pour la modification, mais cela ne correspond pas au fichier sur la zone.
Sur contrib, il y a ça :
et sur la zone il y a ça :
Du coup, c’est quoi le bon ?
Répondre à ce message
bon on a finalement reussi a mettre sphinx en place c’est super, mais maintenant on va essayer d’affiner les résultats.
ma questions est la suivante : quel est le meilleur moyen de configurer sphinx pour renvoyer des resultats quand il n’y a pas de résultat pour la chaine de recherche entiere ?
par exemple : bmw cabriolet bleu
ca serait bien de montrer les : bmw cabriolet.
:)
le code est en place sur notre site : www.topspeed.in
Phil
Pas évident, mais tu dois pouvoir le faire en exploitant le tableau META renvoyé par sphinx : pour chacun des mots de la requête il te dira quels mots ont combien d’occurrences, et tu pourras ensuite tenter diverses combinaisons.
Répondre à ce message
J’ai deux questions :
- Est-il possible de ne comparer la chaine de caractere de recherche qu’ avec les titres uniquement ?
- Est-il possible de mettre un critere pour ne selectionner que les documents qui ont un score minimum ? Car dans mes resultats j’ai des articles tres peu pertinents.
Merci d’avance.
Indexer : La boucle SPHINX plutôt donc (mais il manque plein de choses dans l’article).
Je dirais de jouer avec les poids en ne mettant que le titre du coup (même 1 devrait suffire si on met pas les autres, à priori…)
À priori ya un « score » dans le select, donc tu dois pouvoir faire :
(le premier arg est un truc interprété en booléen, fixe ou le plus souvent dynamique, qui sert à dire si on applique le critère ou pas, puis ensuite la comparaison, l’opérateur est en dernier car la plupart du temps c’est = et donc il est facultatif)
Répondre à ce message
Est-ce normal que dans
/Sources/SpipSourcesIndexer.php
a la ligne 105 on ait cette ligne :
alors que la variable $infos n’est declaree ou utilisee nulle part ailleurs ?
C’est évidemment une coquille, merci :
http://zone.spip.org/trac/spip-zone/changeset/95179
Répondre à ce message
j’ai été voir sur spipr-dist pour trouver le squelette sphinx mais il semble ne plus être disponible
ca serait sympa si quelqu’un pouvait poster ce squelette dans la contribution.
Euh c’est pour rendre actif Z-core c’est tout hein, et le système de bloc principal, qui fait qu’on a juste besoin de choses dans content/ pour générer une page entière.
Donc tu parles juste de ça en fait :
http://zone.spip.org/trac/spip-zone/browser/_plugins_/indexer/trunk/content/sphinx.html
Répondre à ce message
bon ok je progresse, maintenant la page ?exec=indexer fonctionne mais j’ai un message d’erreur spip
Mais j’ai un message d’erreure sur ce morceau :
« Erreur SQL 1054
Unknown column ’id_parent’ in ’where clause’
SELECT * FROM spip_groupes_mots WHERE id_parent = 0 ORDER BY 0+titre,titre »
J’ai essaye de modifier la configuration du plugin pour ne pas indexer les documents, mais quand je lance l’indexation, il semble que tout est analyse quand meme...
je regarderais demain si j’arrive a fixer ce dernier soucis.
j’avoue que je n’ai pas la dernière version de php sur mon server et que c’est peut être un problème.
Bonjour
Cela ressemble à un bogue id_parent devrait soit exister, soit ne pas être présent dans la requête. J’ai fusionné les 2 messages sur ce sujet pour éviter de se disperser.
Attention au sens Sphinx tout est document, tout comme les articles ou les documents au sens SPIP.
Au deux endroits où le champ « id_parent » est ajouté (indexer/jointure_mots + Sources/HierarchieMots), il y a toujours le test suivant :
if (_DIR_PLUGIN_GMA) {
.Donc « id_parent » n’est ajouté QUE si le plugin « Groupes de mots arborescents » est bien activé au moment où ça se passe.
Donc 1) tu as ce plugin ?
Et 2) il est mal installé donc ? le champ « id_parent » n’a pas été ajouté à la table des groupes ?
Ben c’est étrange car j’ai pas le plugin ’mot arborescence’ d’installe...
J’ai pu l’installe dans le passe, mais j’ai clairement pas de repertoire GMA
J’ai le pluging MOTUS...
comment je pourrais debugger ca ? et voir pourquoi cette variable _DIR_PLUGIN_GMA retourne ’true’ ?
Enfin pour le moment j’ai commenter le code qui fait ce test dans
/indexer/jointure_mots.php : if (_DIR_PLUGIN_GMA)
./Sources/HierarchieMots.php : if (_DIR_PLUGIN_GMA)
Et la page d’indexation marche maintenant sans erreure...
Toutes les variables statiques du type « _DIR_PLUGIN_TRUC » sont définies uniquement quand le plugin de préfixe « truc » est activé dans le site. Donc si ce define() est fait, c’est normalement que le plugin est activé.
T’as pas des plugins ajoutés dans le dossier « plugins-dist » ? Qui fait que c’est toujours activé ?
Pour tester un bug, il faut de toute façon tester en désactiver TOUS les plugins nécessaires, avec un SPIP tout nu, puis si ça marche, en réactiver un par un pour voir qui fait planter.
Bon normalement ça devrait VRAIMENT être corrigé avec ça
http://zone.spip.org/trac/spip-zone/changeset/94686
C’est moi, désolé, j’avais mal fait les tests, car une variable statique renvoie toujours son propre nom quand elle n’existe pas, donc c’est considéré comme True puisque c’est une chaîne…
Répondre à ce message
On dirait que la page de recherche page=sphinx
n’est plus incluse dans le squelettes spipr-dist
si quelqu’un l’a sous la main je suis preneur :)
en attendant je vais essayer d’aller voir l’article avec la boucle sphinx..
j’ai simplement mis la boucle sphinx que j’ai récupère sur spip-contrib
malheureusement ca ne me retourne aucun résultat.
difficile de savoir si l’indexation marche..
Bonjour
Pour contrôler le bon comportement de l’indexation, il est possible :
Si l’une ou l’autre retournent des résultat, alors il s’agit d’un problème de boucle. Dans le cas contraire, il est possible que la configuration soit incomplète.
Répondre à ce message
bon je precise qu’il faut aller créer a la main un repertoire /var/lib/sphinx/data/spip/
avec les droit sphinx:sphinx
sinon quand on lance #searchd, on a un message d’erreur « WARNING : index ’spip’ : preload : failed to open /var/lib/sphinx/data/spip.lock : No such file or directory ; NOT SERVING
FATAL : no valid indexes to serve »
je progresse ;)
Répondre à ce message
ah aussi je ne vois pas comment sphinx peu se connecter a la base de donne ’spip’ sans qu’on lui indique les informations de connection user/password ...
Bonjour
La configuration proposée utilise 2 spécificités de Sphinx :
* le mode RT
* le connecteur Mysql
Ces 2 particularités cumulées permettent à Sphinx d’exposer une base de donnée d’indexation sphinx nommée spip et publique.
C’est pourquoi il n’est pas nécessaire dans la configuration de donner ni mot de passe, ni utilisateur.
Répondre à ce message
bon j’essaye d’installer SPHINX... la documentation est pas ideal pour un debutant comme moi ;)
J’ai bien réussi a installe SPHINX sur mon serveur mais la configuration c’est un peu plus delicate.
surtout qu’on dirait que zone.spip.net est offline.
ca serait bien de rassembler tous les fichiers necessaire sur cette page de contribution.
Bonjour
Les fichiers de configuration pouvant évoluer il est préférable d’avoir les fichiers à jour sur le SVN. En les mettant tous ici on prendrait le risque d’avoir 2 versions à maintenir et le risque d’avoir un fichier faux.
Contrairement à d’autres contributions cette documentation est là pour expliquer le fonctionnement du plugin Indexer ce qui fait que ces pages peuvent être autonomes.
Pour la zone c’est corrigé :) Merci pour le signalement. Le serveur et donc le plugin est à nouveau disponible
Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |