Использование SphinxSearch в качестве альтернативного поискового движка для глобального поиска


Начиная с версии 0.9.2 появилась альтернатива в виде полнотекстового поиска для модуля globalsearch.

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

Disclaimer:
Конечно же, само собой разумеется выполнение всех команд от рута.
Хотите от непривилегированного пользователя - внесите соответствующие изменения в конфигурацию.

Включение SphinxSearch

Опция включающая альтернативный глобальный поиск на базе SphinxSearch.

SPHINX_SEARCH_ENABLED=0

Хост с 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 отключены.

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

Ограничение элементов в ответе при поиске в SphinxSearch. Не стоит задирать этот параметр т.к. будет сказываться на поедании ресурсов браузера javascript-ом.

;SPHINX_SEARCH_LIMIT=100

Дополнительная сортировка результатов

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

Масштабируемость

Стоит отметить возможное горизонтальное расширение с любыми балансировщиками (хотя вряд ли пригодится для подобных нагрузок).
Тоже самое про отказоустойчивость. Любые варианты от балансировщиков с health check до VRRP.


Так же важно понимать что никаких ограничений по поиску со стороны Ubilling нету.
Если вы хотите добавить кастомный индекс для поиска - нужно две вещи:

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

Установка на актуальной версии FreeBSD

Тестировал на FreeBSD 11.1, 10.1.

# mkdir /opt
# cd /opt
# fetch http://sphinxsearch.com/files/sphinx-3.0.3-facc3fb-freebsd-amd64.tar.gz
# tar zxvf sphinx-3.0.3-facc3fb-freebsd-amd64.tar.gz
# mv sphinx-3.0.3 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
        sql_host                = localhost
        sql_user                = root
        sql_pass                = rootpassword
        sql_db                  = stg
  • Запускаем indexer.
# /opt/sphinx/bin/indexer --config /opt/sphinx/etc/sphinx.conf --all
  • После чего запускаем searchd.
# /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`"

Установка на неактуальной версии FreeBSD

Для более дремучих релизов FreeBSD где оригинальные бинарники просят слишком свежего окружения, вы можете использовать собрать sphinx из портов

# mkdir -p /opt/sphinx/sphinxdata/logs
# cd /usr/ports/textproc/sphinxsearch && make WITH="ICONV MYSQL SYSLOG" PREFIX=/opt/sphinx BATCH=yes install
# cp -R /usr/local/www/apache24/data/billing/docs/sphinxsearch/sphinx2.conf /opt/sphinx/etc/sphinx.conf

Далее все также. Кроме:

  1. searchd находится в /opt/sphinx/sbin/searchd.
  2. SPHINX_SEARCH_SORT=""

Обновление индексов

В crontab -e:

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

Автозапуск

Добавим в /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

Безопасность

Вы можете подумать что данного рода информация чувствительная и вы не хотели бы ей делится с посторонними? Собственно пара слов о безопасности.
Так как в базовом варианте не предусмотрена аутентификация - то стоит ограничить доступность демона директивой listen в sphinx.conf.
Либо же ограничить доступ к нему фаерволом.
Так же хорошим тоном будет создать отдельного юзера в MySQL для поиска и не ходить по рутовым логином и паролем.

sphinx.txt · Последние изменения: 2018/09/01 10:23 — l1ght
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki