Comment installer et configurer Sphinx sur Ubuntu 16.04

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

L’installation de Sphinx sur Ubuntu est simple car elle se trouve dans le référentiel de packages natifs. Installez-le en utilisant + apt-get.

sudo apt-get install sphinxsearch

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

Nous allons ensuite configurer une base de données en utilisant les exemples de données du fichier SQL fourni avec le package. 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 + mysql> +.

Créez 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 /etc/sphinxsearch/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 / sphinxsearch +. La configuration comprend 3 blocs principaux indispensables à l’exécution: * index *, * searchd * et * source *. Nous vous fournirons un exemple de fichier de configuration et expliquerons chaque section afin de pouvoir la personnaliser ultérieurement.

Commencez par créer le fichier + sphinx.conf +.

sudo nano /etc/sphinxsearch/sphinx.conf

Chacun de ces 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 du + 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/sphinxsearch/data/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/sphinxsearch/searchd.log
 query_log         = /var/log/sphinxsearch/query.log
 read_timeout      = 5
 max_children      = 30
 pid_file          = /var/run/sphinxsearch/searchd.pid
 seamless_rotate   = 1
 preopen_indexes   = 1
 unlink_old        = 1
 binlog_path       = /var/lib/sphinxsearch/data
}

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/sphinxsearch/data/test1
 docinfo           = extern
}
searchd
{
 listen            = 9306:mysql41
 log               = /var/log/sphinxsearch/searchd.log
 query_log         = /var/log/sphinxsearch/query.log
 read_timeout      = 5
 max_children      = 30
 pid_file          = /var/run/sphinxsearch/searchd.pid
 seamless_rotate   = 1
 preopen_indexes   = 1
 unlink_old        = 1
 binlog_path       = /var/lib/sphinxsearch/data
}

Pour explorer plus de configurations, vous pouvez consulter le fichier + / etc / sphinxsearch / sphinx.conf.sample +, qui contient toutes les variables expliquées encore plus 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.9-id64-release (rel22-r5006)
Copyright (c) 2001-2015, Andrew Aksyonoff
Copyright (c) 2008-2015, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file '/etc/sphinxsearch/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.010 sec, 18552 bytes/sec, 384.50 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éons un travail cron. Tout d’abord, ouvrez la crontab.

crontab -e

On vous demandera peut-être quel éditeur de texte vous souhaitez utiliser. Choisissez ce que vous préférez; Dans ce tutoriel, nous avons utilisé + nano +.

La tâche suivante s’exécutera toutes les heures et ajoutera de nouvelles données à l’index en utilisant le fichier de configuration que nous avons 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/sphinxsearch/sphinx.conf --all

Maintenant que Sphinx est entièrement configuré, vous pouvez démarrer le service et l’essayer.

Étape 5 - Démarrer Sphinx

Par défaut, le démon Sphinx est désactivé. Nous allons d’abord l’activer en remplaçant la ligne + START = no + par + START = yes + dans + / etc / default / sphinxsearch +.

sudo sed -i 's/START=no/START=yes/g' /etc/default/sphinxsearch

Ensuite, utilisez + systemctl + pour redémarrer le démon Sphinx.

sudo systemctl restart sphinxsearch.service

Pour vérifier si le démon Sphinx fonctionne correctement, exécutez.

sudo systemctl status sphinxsearch.service

Vous devriez obtenir quelque chose qui ressemble à ce qui suit.

Output● sphinxsearch.service - LSB: Fast standalone full-text SQL search engine
  Loaded: loaded (/etc/init.d/sphinxsearch; bad; vendor preset: enabled)
  Active: active (running) since Tue 2016-07-26 01:50:00 EDT; 15s ago
  . . .

Cela permettra également de s’assurer que le démon Sphinx démarre même lorsque le serveur est redémarré.

Étape 6 - Test

Maintenant que tout est configuré, testons la fonctionnalité de recherche. Connectez-vous à SphinxQL (sur le port 9306) à 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, vous pouvez quitter 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 de 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://sphinxsearch.com [site Web du projet].