Sphinx - установка/настройка

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"]

[/codesyntax]

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

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

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

[codesyntax lang="php" blockstate="collapsed"]

[/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"]

[/codesyntax]

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

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

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

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

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

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

sudo indexer --all

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

[codesyntax lang="php" blockstate="collapsed"]

[/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"]

[/codesyntax]

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

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

CALL KEYWORDS ('test one three', 'test1', 1);

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

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

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

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

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

DROP DATABASE test;

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

quit