Prerequisiti

Installazione di MySQL.

Installazione di Sphinx

Assicuriamoci di aggiornare l'indice dei pacchetti. Aprire il terminale e dare questo comando:
sudo apt update

Quindi installiamo Sphinx utilizzando il repository ufficiale di Ubuntu:
sudo apt install sphinxsearch

Creiamo un database per configurare e testare Sphinx. Effettuiamo il login in MySQL sempre da terminale:
mysql -u root -p

Creiamo il database:
CREATE DATABASE test;

Importiamo il file SQL di esempio:
SOURCE /etc/sphinxsearch/example.sql;

Usciamo da MySQL:
quit

Configurare Sphinx

Creiamo il file sphinx.conf in /etc/sphinxsearch:
sudo nano /etc/sphinxsearch/sphinx.conf

Questo è il blocco principale, cambiare solo la password in sql_pass inserendo quella del vostro database.

source src1
{
  type          = mysql

  #SQL settings (for ‘mysql’ and ‘pgsql’ types)

  sql_host      = localhost
  sql_user      = root
  sql_pass      = VOSTRA_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
}

Il blocco index contiene la directory per salvare l'index.

index test1
{
  source        = src1
  path          = /var/lib/sphinxsearch/data/test1
  docinfo       = extern
}

Il blocco searchd contiene altre configurazioni come la porta e le variabili per avviare Sphinx come deamon.

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
}

Questo è il file di configurazione completo. Potete semplicemente copiare questo codice e incollare tutto nel vostro file. Dovete solamente cambiare la password con quella del vostro database.

source src1
{
  type          = mysql

  sql_host      = localhost
  sql_user      = root
  sql_pass      = PASSWORD_VOSTRO_DATABASE
  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
}

Preparare gli Index

Aggiungiamo i dati all'index usando la configurazione appena creata.
sudo indexer --all

Dovreste ottenere un risultato simile a questo:

Sphinx 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.004 sec, 41327 bytes/sec, 856.53 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
rotating indices: successfully sent SIGHUP to searchd (pid=31773).

In produzione è necessario avere sempre gli index aggiornati, quindi creiamo un cronjob.
Apriamo il crontab, da terminale:
crontab -e

Aggiungere questo comando che verrà eseguito in automatico ogni ora:

@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all

Salvare e chiudere il file.

Avviamo Sphinx

Di default il demone di Sphinx è impostato su OFF quindi cambiamo questo parametro:
sudo sed -i 's/START=no/START=yes/g' /etc/default/sphinxsearch

Usiamo systemctl per riavviare il demone di Sphinx:
sudo systemctl restart sphinxsearch.service

Per verificare se il demone di Sphinx è avviato correttamente dare questo comando:
sudo systemctl status sphinxsearch.service

Testiamo Sphinx

Da terminale effettuiamo il login in MySQL accedendo al database di Sphinx con questo comando:
mysql -h0 -P9306

Cerchiamo una frase:
SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;

Dovreste ottenere un risultato simile a questo:

+------+----------+------------+
| id   | group_id | date_added |
+------+----------+------------+
|    1 |        1 | 1497184312 |
|    2 |        1 | 1497184312 |
+------+----------+------------+
2 rows in set (0,01 sec)

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| total         | 2        |
| total_found   | 2        |
| time          | 0.005    |
| 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)

Nei risultati ottenuti potete vedere come Sphinx ha trovato 2 risultati nell'index test1 utilizzando la nostra frase di prova.

Cerchiamo delle keywords:
CALL KEYWORDS ('test one three', 'test1', 1);

Dovreste ottenere un risultato simile a questo:

CALL KEYWORDS ('test one three', 'test1', 1);
+------+-----------+------------+------+------+
| 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)

Questi sono altri risultati ottenuti usando delle keywords.

Adesso è possibile uscire da MySQL:
quit

L'installazione di Sphinx su Ubuntu 18.04 LTS è terminata.