Предпосылки
инсталляция сфинкс
Давайте удостоверимся, что мы обновляем индекс пакета. Откройте терминал и дайте следующую команду:
sudo apt-get update
Затем устанавливаем Sphinx, используя официальный репозиторий Debian:
sudo apt-get install sphinxsearch
Давайте создадим базу данных для настройки и тестирования Sphinx. Мы всегда заходим в MySQL из терминала:
mysql -u root -p
Давайте создадим базу данных:
CREATE DATABASE test;
Давайте импортируем пример файла SQL:
SOURCE /etc/sphinxsearch/example.sql;
Выходим из MySQL:
quit
Настройка Сфинкса
Создадим файл sphinx.conf в /etc/sphinxsearch:
sudo nano /etc/sphinxsearch/sphinx.conf
Это основной блок, просто измените пароль в sql_pass, введя пароль вашей базы данных.
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
}
Блок индекса содержит каталог для сохранения индекса.
index test1
{
source = src1
path = /var/lib/sphinxsearch/data/test1
docinfo = extern
}
Блок searchd содержит другие настройки, такие как порт и переменные для запуска Sphinx в качестве демона.
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
}
Это полный файл конфигурации. Вы можете просто скопировать этот код и вставить все в свой файл. Вам просто нужно изменить пароль на пароль вашей базы данных.
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
}
Подготовьте указатель
Давайте добавим данные в индекс, используя только что созданную конфигурацию.
sudo indexer --all
Вы должны получить что-то вроде этого:
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).
В продакшне необходимо всегда иметь обновленные индексы, поэтому давайте создадим cronjob. Давайте откроем crontab из терминала:
crontab -e
Добавьте эту команду, которая будет запускаться автоматически каждый час:
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
Сохраните и закройте файл.
Запускаем Сфинкса
По умолчанию демон Sphinx отключен, поэтому давайте изменим этот параметр:
sudo sed -i 's/START=no/START=yes/g' /etc/default/sphinxsearch
Мы используем systemctl для перезапуска демона Sphinx:
sudo systemctl restart sphinxsearch.service
Чтобы проверить, правильно ли запущен демон Sphinx, введите следующую команду:
sudo systemctl status sphinxsearch.service
Тестируем Сфинкса
Из терминала мы входим в MySQL, обращаясь к базе данных Sphinx с помощью этой команды:
mysql -h0 -P9306
Давайте найдем фразу:
SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;
Вы должны получить что-то вроде этого:
+------+----------+------------+
| 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)
В полученных результатах видно, как Sphinx нашел 2 результата в индексе test1, используя наше тестовое предложение.
Ищем ключевые слова:
CALL KEYWORDS ('test one three', 'test1', 1);
Вы должны получить что-то вроде этого:
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)
Это другие результаты, полученные с использованием ключевых слов.
Теперь вы можете выйти из MySQL:
quit