Установка и настройка Sphinx в CentOS 7

Sphinx – это производительная и простая система для полнотекстового поиска с открытым исходным кодом. Sphinx может искать данные в любых источниках: в базах SQL, текстовых и HTML-файлах, почтовых ящиках, и т.д.

Основные функции Sphinx:

  • Высокопроизводительная индексация и поиск;
  • Продвинутые инструменты индексации и запросов;
  • Продвинутая постобработка;
  • Масштабируемость до миллиардов документов, терабайтов данных и тысяч запросов в секунду;
  • Простая интеграция с источниками данных SQL и XML и поисковыми интерфейсами SphinxQL, SphinxAPI или SphinxSE;
  • Распределенный поиск.

Данное руководство поможет установить Sphinx и настроить поисковую систему для взаимодействия с MySQL.

Требования

  • Настроенный сервер CentOS 7.
  • Не-root пользователь с доступом к sudo (о создании такого пользователя можно прочитать в руководстве по начальной настройке).
  • Предварительно установленный сервер MySQL (инструкции по установке можно найти в соответствующем разделе этого руководства).

1: Установка Sphinx

На момент написания статьи последней стабильной версией Sphinx является 2.2.11.

Примечание: Отслеживать версии можно здесь.

Прежде чем установить Sphinx на сервер, нужно установить зависимости программы:

sudo 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:

sudo 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:

sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2

Создайте новый sphinx.conf в текстовом редакторе:

sudo vi /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 выглядит так:

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
}

Блок index содержит данные об источнике и путь к местонахождению данных.

  • source: имя блока source. В данном случае это src1.
  • path: путь к индексному файлу.

Этот блок выглядит так:

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

Блок searchd содержит порты и переменные для запуска демона Sphinx.

  • listen: порт, на котором нужно запустить Sphinx, и используемый протокол (в руководстве – 9306:mysql41). Популярные протоколы Sphinx — sphinx (SphinxAPI) и :mysql41 (SphinxQL).
  • query_log: путь к логу запросов.
  • pid_file: путь к PID-файлу Sphinx.
  • seamless_rotate: предотвращает останов searchd при кэшировании большого объема данных.
  • preopen_indexes: указывает, нужно ли предварительно открывать все индексы.
  • unlink_old: указывает, нужно ли отключить старые копии индекс-файлов.

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/
}

Ниже приведены все конфигурации файла sphinx.conf. Вы можете просто скопировать и вставить их в свой файл. Единственная переменная, которую нужно отредактировать – это sql_pass в блоке source; укажите в ней свой пароль mysql.

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/
}

Больше конфигураций можно найти в файле /etc/sphinxsearch/sphinx.conf.sample, который содержит подробное описание всех переменных.

4: Управление индексом

В данном разделе показано, как добавить данные в индекс Sphinx, и обновить индекс с помощью cron.

Чтобы добавить данные в индекс, используется только что созданный конфигурационный файл.

sudo indexer --all

Команда должна вернуть:

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

В среде производства нужно постоянно поддерживать индекс в актуальном состоянии. Для этого создайте 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;

Команда вернёт:

+------+----------+------------+
| 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)

Как видите, система Sphinx обнаружила два совпадения из индекса test1. Команда SHOW META; показывает соответствия каждого ключевого слова в предложении.

Попробуйте выполнить поиск по ключевым словам:

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)

В индексе test1 система Sphinx нашла:

  • 5 совпадений в 3 документах для ключа test.
  • 2 совпадения в 1 документе для ключа one.
  • 0 совпадений в 0 документах для ключа three.

Теперь можно удалить тестовую БД Sphinx:

DROP DATABASE test;

Закройте оболочку MySQL:

quit

Заключение

Данное руководство помогает установить Sphinx и выполнить простой поиск данных с помощью SphinxQL и MySQL.

По этой ссылке можно найти реализации Sphinx API для PHP, Perl, Python, Ruby и Java.

Пользователи Nodejs могут найти пакет SphinxAPI по этой ссылке.

Sphinx позволяет добавить пользовательский поиск на сайт. Более подробную информацию по использованию Sphinx можно найти на сайте проекта.

Tags: , ,
  • Александр Михневич

    Подскажите, почему может не запускаться Sphinx?

    [root@d40765 system]# service searchd start
    Redirecting to /bin/systemctl start searchd.service
    Job for searchd.service failed because a timeout was exceeded. See «systemctl status searchd.service» and «journalctl -xe» for details.
    [root@d40765 system]# systemctl status searchd.service
    * searchd.service — SphinxSearch Search Engine
    Loaded: loaded (/usr/lib/systemd/system/searchd.service; enabled; vendor preset: disabled)
    Active: failed (Result: timeout) since Пт 2018-01-26 01:39:38 MSK; 1s ago
    Process: 22136 ExecStartPre=/bin/chown sphinx.sphinx /var/run/sphinx (code=killed, signal=TERM)
    Process: 22133 ExecStartPre=/bin/mkdir -p /var/run/sphinx (code=exited, status=0/SUCCESS)
    Main PID: 926 (code=exited, status=0/SUCCESS)

    янв 26 01:39:38 d40765 systemd[1]: Starting SphinxSearch Search Engine…
    янв 26 01:39:38 d40765 systemd[1]: searchd.service start-pre operation timed out. Terminating.
    янв 26 01:39:38 d40765 systemd[1]: Failed to start SphinxSearch Search Engine.
    янв 26 01:39:38 d40765 systemd[1]: Unit searchd.service entered failed state.
    янв 26 01:39:38 d40765 systemd[1]: searchd.service failed.