Зміст

Використання SphinxSearch як альтернативного пошукового рушія для глобального пошуку


Починаючи з версії 0.9.2 з'явилася альтернатива у вигляді повнотекстового пошуку для модуля globalsearch.

На тестах поводиться набагато швидше, ніж jQuery autocomplete, який використовується в поточній реалізації. Плюс має величезну гнучкість при подальшому використанні.

Disclaimer:
Звісно ж, само собою зрозуміло виконання всіх команд від рута.

Хочете від непривілейованого користувача - внесіть відповідні зміни в конфігурацію.

Увімкнення SphinxSearch

У alter.ini:

Опція вмикає альтернативний глобальний пошук на базі SphinxSearch.

SPHINX_SEARCH_ENABLED=1

Хост зі SphinxSearch.

SPHINX_SEARCH_HOST="127.0.0.1"

Порт для підключення до SphinxSearch.

SPHINX_SEARCH_SQL_PORT="9306"

Ім'я користувача для підключення до SphinxSearch (за замовчуванням порожнє!).

SPHINX_SEARCH_USER=""

Пароль для підключення до SphinxSearch (за замовчуванням порожній!).

SPHINX_SEARCH_PASSWORD=""

Ім'я БД для підключення до SphinxSearch (за замовчуванням порожнє!).

SPHINX_SEARCH_DB=""

Імена індексів (полів), у яких здійснювати пошук у SphinxSearch. За замовчуванням contract,paymentid,macodt,macminus відключені. Для активації потрібно розкоментувати відповідні рядки в конфігураційному файлі й дочекатися пере індексування, тільки потім можна вмикати їх у цій опції.

;SPHINX_SEARCH_INDEXES="ip,mac,realname,login,fulladdress,mobile,phone"

Обмеження елементів у відповіді під час пошуку в SphinxSearch. Не варто задирати цей параметр, оскільки позначатиметься на поїданні ресурсів браузера javascript-ом.

;SPHINX_SEARCH_LIMIT=100

Додаткове сортування результатів

SPHINX_SEARCH_SORT="GROUP BY `id`,`title`"



Само собою потребує

GLOBALSEARCH_ENABLED=1

Масштабованість

Варто відзначити можливе горизонтальне розширення з будь-якими балансувальниками (хоча навряд чи стане в пригоді для подібних навантажень).
Теж саме про відмовостійкість. Будь-які варіанти від балансувальників з health check до VRRP.


Так само важливо розуміти, що жодних обмежень щодо пошуку з боку Ubilling немає.
Якщо ви хочете додати кастомний індекс для пошуку - потрібно дві речі:

  1. Створити новий індекс у SphinxSearch + пере індексація.
  2. Додати ваш індекс в опцію SPHINX_SEARCH_INDEXES.

Встановлення на FreeBSD

Тестував на FreeBSD 14.0, 13.3, 13.2

# mkdir /opt
# cd /opt
# fetch http://sphinxsearch.com/files/sphinx-3.1.1-612d99f-freebsd-amd64.tar.gz
# tar zxvf sphinx-3.1.1-612d99f-freebsd-amd64.tar.gz
# mv sphinx-3.1.1 sphinx
# cd sphinx
# mkdir -p sphinxdata/logs
# touch sphinxdata/logs/searchd.log
# rm sphinxdata/searchd.state
# cp /usr/local/www/apache24/data/billing/docs/sphinxsearch/sphinx3.conf /opt/sphinx/etc/sphinx.conf
# vi /opt/sphinx/etc/sphinx.conf
        sql_host                = localhost
        sql_user                = root
        sql_pass                = rootpassword
        sql_db                  = stg
# /opt/sphinx/bin/indexer --config /opt/sphinx/etc/sphinx.conf --all
# /opt/sphinx/bin/searchd --config /opt/sphinx/etc/sphinx.conf

* Правимо alter.ini під свої реалії. За дефолтом приймається, що sphinx запущено з білінгом на одному сервері, але цілком замінивши ip-адресу на потрібний - можете розгорнути і на хості, який стоїть поруч, \ віртуалці. Важливо що USER, PASSWORD, DB - за дефолтом порожні. Це не страшно. Це не означає “вигадай сам”. Так задумано.

SPHINX_SEARCH_ENABLED=1
SPHINX_SEARCH_HOST="127.0.0.1"
SPHINX_SEARCH_SQL_PORT="9306"
SPHINX_SEARCH_USER=""
SPHINX_SEARCH_PASSWORD=""
SPHINX_SEARCH_DB=""
SPHINX_SEARCH_SORT="GROUP BY `id`,`title`"

Оновлення індексів

У crontab -e:

*/5 * * * *       /opt/sphinx/bin/indexer --config /opt/sphinx/etc/sphinx.conf --all --rotate

Автозапуск

Додамо у /usr/local/etc/rc.d/billing у секцію start_cmd:

       /opt/sphinx/bin/searchd --config /opt/sphinx/etc/sphinx.conf
       echo "SphinxSearch started"

Що б вийшло наступне:

start_cmd()
{
       echo "Starting stargazer"
       /usr/sbin/stargazer || echo "failed to start stargazer"
       /usr/local/bandwidthd/bandwidthd
       echo "Bandwidthd started"
       /opt/sphinx/bin/searchd --config /opt/sphinx/etc/sphinx.conf
       echo "SphinxSearch started"
}

Ротація логів

Додамо такі правила у /etc/newsyslog.conf

/opt/sphinx/sphinxdata/logs/query.log   600  5     100   *     JC  /opt/sphinx/sphinxdata/searchd.pid 30
/opt/sphinx/sphinxdata/logs/searchd.log 600  5     100   *     JC  /opt/sphinx/sphinxdata/searchd.pid 30

І перезапустимо newsyslog:

# service newsyslog restart

Встановлення на Debian GNU/Linux

У разі якщо ви використовували Debianstaller, як нормальна людина, - робити вам узагалі нічого не потрібно. Усе вже встановлено та налаштовано. Просто додайте у ваш crontab індексацію, наприклад так:

*/30 * * * *       /opt/sphinx/bin/indexer --config /opt/sphinx/etc/sphinx.conf --all --rotate

і увімкніть опцію

SPHINX_SEARCH_ENABLED=1

Усе, більше на Debian Linux робити нічого не потрібно. Усе запрацює саме по собі.

Безпека

Ви можете подумати, що такого роду інформація чутлива і ви не хотіли б нею ділиться зі сторонніми? Власне кілька слів про безпеку.
Оскільки в базовому варіанті не передбачена аутентифікація - то варто обмежити доступність демона директивою listen в sphinx.conf.
Або ж обмежити доступ до нього фаєрволом.
Так само хорошим тоном буде створити окремого юзера в MySQL для пошуку і не ходити під рутовим логіном і паролем.