Comment installer et configurer Sphinx sur CentOS 7

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:

É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].