Thank you for reading this post, don't forget to subscribe!
Sphinx – это производительная и простая система для полнотекстового поиска с открытым исходным кодом. Sphinx может искать данные в любых источниках: в базах SQL, текстовых и HTML-файлах, почтовых ящиках, и т.д.
Основные функции Sphinx:
- Высокопроизводительная индексация и поиск;
- Продвинутые инструменты индексации и запросов;
- Продвинутая постобработка;
- Масштабируемость до миллиардов документов, терабайтов данных и тысяч запросов в секунду;
- Простая интеграция с источниками данных SQL и XML и поисковыми интерфейсами SphinxQL, SphinxAPI или SphinxSE;
- Распределенный поиск.
Данное руководство поможет установить Sphinx и настроить поисковую систему для взаимодействия с MySQL.
Требования
- Настроенный сервер CentOS 7.
- Не-root пользователь с доступом к sudo
- Предварительно установленный сервер MySQL
1: Установка Sphinx
На момент написания статьи последней стабильной версией Sphinx является 2.2.11.
Примечание: Отслеживать версии можно здесь.
Прежде чем установить Sphinx на сервер, нужно установить зависимости программы:
yum install -y postgresql-libs unixODBC
Перейдите в каталог tmp, чтобы загрузить файлы Sphinx.
cd /tmp
Загрузите последнюю версию Sphinx:
wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm
Установите Sphinx:
yum install -y sphinx-2.2.11-1.rhel7.x86_64.rpm
Поисковая система Sphinx успешно установлена на сервер. После установки Sphinx нуждается в дополнительной настройке.
2: Создание тестовой базы данных
Создайте базу данных с помощью образца файла SQL, который поставляется вместе с пакетом. Для этого нужно импортировать этот SQL-файл в базу данных.
Войдите в оболочку MySQL:
mysql -u root -p
Введите root-пароль MySQL, после чего командная строка изменится:
MariaDB>
Создайте БД (в данном руководстве она называется test):
CREATE DATABASE test;
Импортируйте SQL-файл.
SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;
Затем закройте оболочку MySQL:
quit
Теперь БД test заполнена данными из импортированного файла.
3: Настройка Sphinx
Конфигурации Sphinx должны храниться в файле sphinx.conf в каталоге /etc/sphinxsearch. Они состоят из трёх основных блоков: index, searchd и source.
В файле по умолчанию предусмотрена минимальная конфигурация. Но лучше создать новый конфигурационный файл.
Переместите конфигурационный файл по умолчанию, sphinx.conf:
mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2
Создайте новый sphinx.conf в текстовом редакторе:
vim /etc/sphinx/sphinx.conf
Примечание: После описания каждого блока настроек можно найти полный код для sphinx.conf.
Блок source содержит тип источника данных, имя пользователя и пароль MySQL. Первый столбец sql_query должен содержать уникальный ID. Запрос SQL будет выполняться для каждого индекса, а затем передавать данные в индексный файл Sphinx. Блок source состоит из таких полей:
- type: тип источника данных. В данном случае это mysql (также система поддерживает типы pgsql, mssql, xmlpipe2, odbc и т.д.).
- sql_host: имя хоста MySQL; в данном случае это localhost. В это поле нужно внести домен или IP-адрес.
- sql_user: имя пользователя MySQL (в данном случае это root).
- sql_pass: пароль MySQL.
- sql_db: имя БД, в которой хранятся нужные данные (в этом руководстве – test).
- sql_query: запрос, который сбрасывает данные в индексный файл.
Блок source выглядит так:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 } |
[/codesyntax]
Блок index содержит данные об источнике и путь к местонахождению данных.
- source: имя блока source. В данном случае это src1.
- path: путь к индексному файлу.
Этот блок выглядит так:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 |
index test1 { source = src1 path = /var/lib/sphinx/test1 docinfo = extern } |
[/codesyntax]
Блок searchd содержит порты и переменные для запуска демона Sphinx.
- listen: порт, на котором нужно запустить Sphinx, и используемый протокол (в руководстве – 9306:mysql41). Популярные протоколы Sphinx — sphinx (SphinxAPI) и :mysql41 (SphinxQL).
- query_log: путь к логу запросов.
- pid_file: путь к PID-файлу Sphinx.
- seamless_rotate: предотвращает останов searchd при кэшировании большого объема данных.
- preopen_indexes: указывает, нужно ли предварительно открывать все индексы.
- unlink_old: указывает, нужно ли отключить старые копии индекс-файлов.
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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/ } |
[/codesyntax]
Ниже приведены все конфигурации файла sphinx.conf. Вы можете просто скопировать и вставить их в свой файл. Единственная переменная, которую нужно отредактировать – это sql_pass в блоке source; укажите в ней свой пароль mysql.
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
source src1 { type = mysql sql_host = localhost sql_user = root sql_pass = your_root_mysql_password 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/ } |
[/codesyntax]
Больше конфигураций можно найти в файле /etc/sphinxsearch/sphinx.conf.sample, который содержит подробное описание всех переменных.
4: Управление индексом
В данном разделе показано, как добавить данные в индекс Sphinx, и обновить индекс с помощью cron.
Чтобы добавить данные в индекс, используется только что созданный конфигурационный файл.
sudo indexer --all
Команда должна вернуть:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 |
Sphinx 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 |
[/codesyntax]
В среде производства нужно постоянно поддерживать индекс в актуальном состоянии. Для этого создайте cronjob. Откройте crontab:
crontab -e
Этот cronjob будет запускаться каждый час и добавлять данные в индекс, обращаясь к созданному ранее конфигурационному файлу. Скопируйте и вставьте в конец файла следующее правило:
@hourly /usr/bin/indexer --rotate --config /etc/sphinx/sphinx.conf --all
Теперь поисковая система Sphinx готова к запуску.
5: Запуск Sphinx
Чтобы запустить демон Sphinx, используйте systemctl.
sudo systemctl start searchd
Убедитесь, что демон Sphinx запущен:
sudo systemctl status searchd
Команда должна вернуть:
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
. . .
6: Тестирование поиска
Теперь попробуйте найти данные с помощью Sphinx. Подключитесь к SphinxQL с помощью интерфейса MySQL (командная строка изменится на mysql>).
mysql -h0 -P9306
Попробуйте найти предложение:
SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;
Команда вернёт:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
+------+----------+------------+ | 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) |
[/codesyntax]
Как видите, система Sphinx обнаружила два совпадения из индекса test1. Команда SHOW META; показывает соответствия каждого ключевого слова в предложении.
Попробуйте выполнить поиск по ключевым словам:
CALL KEYWORDS ('test one three', 'test1', 1);
Команда вернёт:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 |
+------+-----------+------------+------+------+ | 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) |
[/codesyntax]
В индексе test1 система Sphinx нашла:
- 5 совпадений в 3 документах для ключа test.
- 2 совпадения в 1 документе для ключа one.
- 0 совпадений в 0 документах для ключа three.
Теперь можно удалить тестовую БД Sphinx:
DROP DATABASE test;
Закройте оболочку MySQL:
quit