introduction
Sphinx est un moteur de recherche open source qui permet des recherches en texte intégral. Il est surtout connu pour effectuer des recherches sur des données volumineuses de manière très efficace. Les données à indexer peuvent généralement provenir de sources très différentes: bases de données SQL, fichiers de texte brut, fichiers HTML, boîtes aux lettres, etc.
Certaines caractéristiques clés de Sphinx sont:
-
Indexation élevée et performances de recherche
-
Outils d’indexation et d’interrogation avancés
-
Post-traitement des résultats avancés
-
Une évolutivité prouvée pouvant atteindre des milliards de documents, des téraoctets de données et des milliers de requêtes par seconde
-
Intégration facile avec les sources de données SQL et XML et les interfaces de recherche SphinxQL, SphinxAPI ou SphinxSE
-
Mise à l’échelle facile avec des recherches distribuées
Dans ce tutoriel, nous allons configurer Sphinx avec un serveur MySQL en utilisant l’exemple de fichier SQL inclus dans le package de distribution. Cela vous donnera une idée de base sur la façon d’utiliser Sphinx pour votre projet.
Conditions préalables
Avant de commencer ce guide, vous aurez besoin de:
-
Un serveur CentOS 7.
-
Un utilisateur sudo non root, que vous pouvez configurer en suivant this tutorial.
-
MySQL installé sur votre serveur, que vous pouvez configurer en suivant l’étape 2 de https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on -centos-7 [ce tutoriel].
Étape 1 - Installation de Sphinx
Au moment de la rédaction de ce manuel, la dernière version de Sphinx est 2.2.11. Vous pouvez trouver la dernière version sur le site Web Sphinx.
Avant d’installer Sphinx, vous devez d’abord installer ses dépendances.
sudo yum install -y postgresql-libs unixODBC
Déplacez-vous dans le répertoire + tmp +
pour télécharger les fichiers de Sphinx dans un endroit discret.
cd /tmp
Téléchargez la dernière version de Sphinx en utilisant + wget +
.
wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm
Enfin, installez-le en utilisant + yum +
.
sudo yum install -y sphinx-2.2.11-1.rhel7.x86_64.rpm
Maintenant que vous avez correctement installé Sphinx sur votre serveur. Avant de démarrer le démon Sphinx, laissez-le configurer.
Étape 2 - Création de la base de données de test
Ici, nous allons configurer une base de données en utilisant les exemples de données du fichier SQL fourni avec le paquet. Cela nous permettra de vérifier que la recherche Sphinx fonctionne plus tard.
Importons l’exemple de fichier SQL dans la base de données. Commencez par vous connecter au shell du serveur MySQL.
mysql -u root -p
Entrez le mot de passe de l’utilisateur racine MySQL lorsqu’il vous sera demandé. Votre invite deviendra + MariaDB> +
.
Créer une base de données factice. Ici, nous l’appelons * test *, mais vous pouvez le nommer comme vous le souhaitez.
CREATE DATABASE ;
Importez l’exemple de fichier SQL.
SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;
Puis quittez le shell MySQL.
quit
Vous avez maintenant une base de données remplie avec les exemples de données. Nous allons ensuite personnaliser la configuration de Sphinx.
Étape 3 - Configuration du Sphinx
La configuration de Sphinx devrait se trouver dans un fichier nommé + sphinx.conf +
dans + / etc / sphinx +
. La configuration se compose de 3 blocs principaux: * index *, * searchd * et * source *.
Une configuration minimale est déjà fournie, mais nous vous fournirons un nouvel exemple de fichier de configuration et expliquerons chaque section afin que vous puissiez la personnaliser ultérieurement.
Tout d’abord, déplacez le fichier + sphinx.conf +
existant.
sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2
Créez un nouveau fichier + sphinx.conf +
avec + vi +
ou votre éditeur de texte préféré.
sudo vi /etc/sphinx/sphinx.conf
Chacun des blocs * index *, * searchd * et * source * est décrit ci-dessous. Ensuite, à la fin de cette étape, l’intégralité de + sphinx.conf +
est incluse pour que vous puissiez la copier et la coller dans le fichier.
Le bloc * source * contient le type de source, le nom d’utilisateur et le mot de passe du serveur MySQL. La première colonne de + sql_query +
devrait être un identifiant unique. La requête SQL s’exécute sur chaque index et sauvegarde les données dans le fichier d’index Sphinx. Vous trouverez ci-dessous les descriptions de chaque champ et du bloc source lui-même.
-
+ type +
: Type de la source de données à indexer. Dans notre exemple, il s’agit de * mysql *. Les autres types pris en charge sont pgsql, mssql, xmlpipe2, odbc, etc. -
+ sql_host +
: Nom d’hôte pour l’hôte MySQL. Dans notre exemple, il s’agit de+ localhost +
. Cela peut être un domaine ou une adresse IP. -
+ sql_user +
: Nom d’utilisateur pour la connexion à MySQL. Dans notre exemple, il s’agit de * racine *. -
+ sql_pass +
: Mot de passe pour l’utilisateur MySQL. Dans notre exemple, il s’agit du mot de passe de l’utilisateur racine MySQL. -
+ sql_db +
: Nom de la base de données qui stocke les données. Dans notre exemple, il s’agit de * test *. -
+ sql_query +
: la requête vide les données de la base de données vers l’index.
C’est le bloc source:
bloc source pour sphinx.conf
source src1
{
type = mysql
#SQL settings (for ‘mysql’ and ‘pgsql’ types)
sql_host = localhost
sql_user = root
sql_pass = password
sql_db = test
sql_port = 3306 # optional, default is 3306
sql_query = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents
sql_attr_uint = group_id
sql_attr_timestamp = date_added
}
Le composant * index * contient la source et le chemin d’accès pour stocker les données. + in
-
+ source +
: Nom du bloc source. Dans notre exemple, il s’agit de * src1 *. -
+ path +
: Le chemin pour sauvegarder l’index.
bloc d’index pour sphinx.conf
index test1
{
source = src1
path = /var/lib/sphinx/test1
docinfo = extern
}
Le composant * searchd * contient le port et d’autres variables pour exécuter le démon Sphinx.
-
+ listen +
: port sur lequel le démon Sphinx sera exécuté, suivi du protocole. Dans notre exemple, il s’agit de * 9306: mysql41 *. Les protocoles connus sont : sphinx (SphinxAPI) et : mysql41 (SphinxQL) -
+ query_log +
: chemin d’accès pour enregistrer le journal de la requête. -
+ pid_file +
: chemin d’accès au fichier PID du démon Sphinx. -
+ seamless_rotate +
: Empêche les blocages searchd lors de la rotation d’index contenant de grandes quantités de données à mettre en cache. -
+ preopen_indexes +
: Indique s’il faut forcer l’ouverture préalable de tous les index au démarrage. -
+ unlink_old +
: Indique s’il faut supprimer les anciennes copies d’index lors d’une rotation réussie.
bloc searchd pour sphinx.conf
searchd
{
listen = 9312:sphinx #SphinxAPI port
listen = 9306:mysql41 #SphinxQL port
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinx/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinx/
}
La configuration complète à copier et coller est ci-dessous. La seule variable que vous devez modifier ci-dessous est la variable + sql_pass +
dans le bloc source, qui est mise en surbrillance.
Le fichier sphinx.conf complet
source src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 3306
sql_query = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents
sql_attr_uint = group_id
sql_attr_timestamp = date_added
}
index test1
{
source = src1
path = /var/lib/sphinx/test1
docinfo = extern
}
searchd
{
listen = 9306:mysql41
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinx/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinx/
}
Pour explorer davantage de configurations, vous pouvez consulter le fichier + / usr / share / doc / sphinx-2.2.11 / sphinx.conf.dist +
, qui contient toutes les variables expliquées en détail.
Étape 4 - Gestion de l’index
Dans cette étape, nous allons ajouter des données à l’index Sphinx et nous assurer que l’index reste à jour en utilisant + cron +
.
Tout d’abord, ajoutez des données à l’index en utilisant la configuration créée précédemment.
sudo indexer --all
Vous devriez obtenir quelque chose qui ressemble à ce qui suit.
OutputSphinx 2.2.11-id64-release (95ae9a6)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinx/sphinx.conf'...
indexing index 'test1'...
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.006 sec, 29765 bytes/sec, 616.90 docs/sec
total 4 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
total 12 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
Dans les environnements de production, il est nécessaire de maintenir l’index à jour. Pour ce faire, créez un travail Cron. Premièrement, ouvrez + crontab +
.
crontab -e
Le travail Cron suivant s’exécute toutes les heures et ajoute de nouvelles données à l’index à l’aide du fichier de configuration créé précédemment. Copiez-le et collez-le à la fin du fichier, puis enregistrez et fermez le fichier.
crontab
@hourly /usr/bin/indexer --rotate --config /etc/sphinx/sphinx.conf --all
Maintenant que Sphinx est entièrement configuré, vous pouvez démarrer le service et l’essayer.
Étape 5 - Démarrer Sphinx
Utilisez + systemctl +
pour démarrer le démon Sphinx.
sudo systemctl start searchd
Pour vérifier si le démon Sphinx fonctionne correctement, exécutez:
sudo systemctl status searchd
Vous devriez obtenir quelque chose qui ressemble à ce qui suit.
Output● searchd.service - SphinxSearch Search Engine
Loaded: loaded (/usr/lib/systemd/system/searchd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2016-08-19 17:48:39 UTC; 5s ago
. . .
Sphinx est entièrement personnalisé et en cours d’exécution, nous allons donc vérifier qu’il fonctionnera correctement par la suite.
Étape 6 - Test de la fonctionnalité de recherche
Maintenant que tout est configuré, testons la fonctionnalité de recherche. Connectez-vous à SphinxQL à l’aide de l’interface MySQL. Votre invite deviendra + MySQL> +
.
mysql -h0 -P9306
Cherchons une phrase.
SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;
Vous devriez obtenir quelque chose qui ressemble à ce qui suit.
Output+------+----------+------------+
| id | group_id | date_added |
+------+----------+------------+
| 1 | 1 | 1465979047 |
| 2 | 1 | 1465979047 |
+------+----------+------------+
2 rows in set (0.00 sec)
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| total | 2 |
| total_found | 2 |
| time | 0.000 |
| keyword[0] | test |
| docs[0] | 3 |
| hits[0] | 5 |
| keyword[1] | document |
| docs[1] | 2 |
| hits[1] | 2 |
+---------------+----------+
9 rows in set (0.00 sec)
Dans le résultat ci-dessus, vous pouvez voir que Sphinx a trouvé 2 correspondances dans notre index + test1 +
pour notre phrase test. La commande + SHOW META; +
affiche également les résultats par mot-clé dans la phrase.
Cherchons quelques mots-clés.
CALL KEYWORDS ('test one three', 'test1', 1);
Vous devriez obtenir quelque chose qui ressemble à ce qui suit.
Output+------+-----------+------------+------+------+
| qpos | tokenized | normalized | docs | hits |
+------+-----------+------------+------+------+
| 1 | test | test | 3 | 5 |
| 2 | one | one | 1 | 2 |
| 3 | three | three | 0 | 0 |
+------+-----------+------------+------+------+
3 rows in set (0.00 sec)
Dans le résultat ci-dessus, vous pouvez voir que dans l’index * test1 *, Sphinx a trouvé:
-
5 correspondances dans 3 documents pour le mot-clef 'test'
-
2 correspondances dans 1 document pour le mot clé 'one ’
-
0 résultats dans 0 documents pour le mot clé 'three'
Maintenant que vous avez testé Sphinx, vous pouvez supprimer la base de données de tests avec + DROP DATABASE test; +
si vous le souhaitez.
Lorsque vous avez terminé, quittez le shell MySQL.
quit
Conclusion
Dans ce tutoriel, nous vous avons montré comment installer Sphinx et effectuer une recherche simple à l’aide de SphinxQL et de MySQL.
Vous pouvez également trouver les implémentations officielles SphinxAPI native pour PHP, Perl, Python, Ruby et Java. Si vous utilisez Nodejs, vous pouvez également utiliser le package SphinxAPI.
En utilisant Sphinx, vous pouvez facilement ajouter une recherche personnalisée à votre site. Pour plus d’informations sur l’utilisation de Sphinx, visitez le site http://sphinx.com [le site Web du projet].