Блог о веб программировании

28 декабря 2017 г.

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

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

Чтобы установить Sphinx на сервер Ubuntu, введите:

sudo apt-get install sphinxsearch

Поисковая система Sphinx успешно установлена на сервер. После установки Sphinx нуждается в дополнительной настройке.

Настройка Sphinx

Конфигурации Sphinx должны храниться в файле sphinx.conf в каталоге /etc/sphinxsearch. Они состоят из трёх основных блоков: index, searchd и source. Описание каждого из них и общий вид конфигурационного файла можно найти ниже.

Для начала создайте конфигурационный файл:

sudo nano /etc/sphinxsearch/sphinx.conf

Блок source

Блок source содержит описание источника данных для нашего индекса, параметров доступа к ним, атрибутов и правил их анализа.. Первый столбец sql_query  должен содержать уникальный ID. Запрос SQL будет выполняться для каждого индекса, а затем передавать данные в индексный файл Sphinx.

source doc_source {
    type = mysql # тип источника, в данном случае БД MySQL
    
    # Параметры подключения к БД
    sql_host      = localhost # Хост MySQL
    sql_user      = root # Пользователь MySQL
    sql_pass      = password # Пароль MySQL
    sql_db        = my_test # Название БД в MySQL
    sql_port      = 3306 # Порт сервера MySQL
    
    # запрос или запросы, которые будут выполнены после установки соединения с базой данных   
    sql_query_pre = SET NAMES utf8 COLLATE utf8_unicode_ci # Кодировка индексируемой таблицы
    # запрос который возвращает данные для индексации
    sql_query     = \
    SELECT id, category_id, UNIX_TIMESTAMP(doc_date) AS doc_date, title, content \
    FROM documents \
    WHERE doc_status = "active" # Запрос которым делаем выборку всех записей, которые должны быть проиндексированы
    
    # поля, по которым может идти группировка, фильтрация и сортировка (см. http://sphinxsearch.com/docs/current.html#attributes)
    sql_attr_uint    = category_id
    sql_attr_uint    = doc_date
}

Стоит отметить что раздел source конфигурации поддерживает наследование, и это весьма удобно, т.к. можно создать один source с настройками соединения с базой данных, и в остальных наследовать его, чтобы не дублировать одни и те же настройки.

# пример наследования source , который наследуется от другого source
source main {
    ....
}

source posts : main {
    ....
}

Что еще интересного из настроек:

  • sql_query_range - запрос который должен возвращать минимальное и максимальное значение id индексируемых записей, парамаметр пригодится для ranged query.
  • sql_range_step - количество записей получаемых за одну итерацию в ranged query.

Блок index

Блок index содержит настройки построения индекса с использованием источника.

index doc_index
{
    source        = doc_source # Имя источника данных
    path          = /var/lib/sphinxsearch/data/doc_index # Путь по которому будут сохранены файлы индекса
    docinfo       = extern #тип хранения атрибутов индекса
}

Описание настроек:

  • docinfo - тип хранения атрибутов индекса. Может принимать значения none, extern и inline. None уместен когда индекс не имеет атрибутов, при выборе inline атрибуты будут храниться в .spd файле вместе с документами, а при extern для них будет создан отдельный .spa файл.
  • dict - тип словаря, crc или keywords. crc лучше использовать когда не нужен поиск по подстрокам. Keywords быстрее работает с подстроками, поддерживает wildcard поиск и размер индекса получается в 3-10 раз меньше.
  • morphology - морфологический препроцессор. Препроцессор применяется к индексируемым словам чтобы заменить различные формы одного слова нормализованной формой. Sphinx имеет три вида морфологических препроцессоров: лемматизатор, стеммер и фонетические алгоритмы. Стоит отметить, что Sphinx имеет поддержку русского языка из коробки. Также имеется поддержка libstemmer.
  • stopwords - путь к файлу со списком стоп-слов (разделенных пробелами). Стоп-слова не учитываются при поиске.stopwords - путь к файлу со списком стоп-слов (разделенных пробелами). Стоп-слова не учитываются при поиске.
  • wordforms - путь к файлу со списком словоформ, например "hypertext preprocessor > php".
  • min_word_len - минимальная длина индексируемого слова.
  • html_strip - параметр определяет нужно ли удалять html теги из входных данных.

Блок indexer

Блок indexer содержит настройки индексатора

indexer 
{
    mem_limit = 32M # лимит памяти для работы индексатора
}

Блок searchd

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

Настройки демона обычно всегда стандартные, указываем адрес, порт демона и пути к логам

searchd
{
    listen = 127.0.0.1:9312 # порт для работы через API
    listen = 127.0.0.1:9306:mysql41 # порт для комуникаций с MySQL
    log = /var/log/sphinx/searchd.log
    query_log = /var/log/sphinx/query.log
    read_timeout = 5
    max_children = 30
    pid_file = /var/log/sphinx/searchd.pid
}

Описание настроек:

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

Запускаем sphinx

После того как мы создали файл конфигурации sphinx.conf, нам надо проиндексировать данные из нашей БД. Для этого в консоли запускаем индексатор:

/usr/local/sphinx/bin/indexer --all --verbose

В случае успешного индексирования получим примерно вот такие строки:

Sphinx 2.2.10-id64-release (2c212e0)
Copyright (c) 2001-2015, Andrew Aksyonoff
Copyright (c) 2008-2015, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file '/path/to/config/sphinx.conf'...
indexing index 'postsIndex'...
collected 500 docs, 0.1 MB
collected 1500 attr values
sorted 0.0 Mvalues, 100.0% done
sorted 0.0 Mhits, 100.0% done
total 500 docs, 129885 bytes
total 0.049 sec, 2629570 bytes/sec, 10122.68 docs/sec
indexing index 'categoriesIndex'...
collected 30 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 30 docs, 451 bytes
total 0.007 sec, 57554 bytes/sec, 3828.48 docs/sec
total 1509 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
total 26 writes, 0.000 sec, 9.9 kb/call avg, 0.0 msec/call avg

Ошибок нет, все работает.

Запускаем поискового демона:

searchd --config /path/to/config/sphinx.conf

В случае успешного запуска должны увидеть примерно вот такой вывод:

Sphinx 2.1.3-dev (r4319)
Copyright (c) 2001-2013, Andrew Aksyonoff
Copyright (c) 2008-2013, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file '/usr/local/sphinx/etc/sphinx.conf'...
listening on all interfaces, port=9312
listening on all interfaces, port=9306
precaching index 'mysqlbasename'
precached 1 indexes in 0.000 sec

Коннектимся к демону по SQL протоколу что бы проверить его работоспособность:

mysql -h 127.0.0.1 -P 9306

Теперь можно использовать консольный mysql клиент. Полное описание протокола SQL, реализованного в SphinxQL читайте по ссылке http://sphinxsearch.com/docs/current.html#sphinxql-reference

Запускаем переиндексацию по крону

Добавляем в системный планировщик заданий (крон, crontab) запуск индексатора через каждые сутки:

crontab -e
# добавлем в крон следующую строку:
0  0    * * *   root    /usr/local/sphinx/bin/indexer --rotate --all --config /usr/local/sphinx/etc/sphinx.conf

Защита служебных портов

После настройки и запуска поискового сервера Sphinx важно помнить что его демн открывает порты 9312, 9306 (указанные в настройках) и делает их доступными на всех интерфейсах. Настоятельно рекомендую закрыть их от внешнего мира при помощи файрвола на внешнем интерфейсе (интернет). Вот два простых правила для IPTABLES:

iptables -A INPUT -p tcp -i eth0 --dport 9306 -j DROP
iptables -A INPUT -p tcp -i eth0 --dport 9312 -j DROP

Где eth0 - имя сетевого интерфейса, который смотрит в интернет.

Скрипт автозапуска searchd для init.d

Теперь нужно сделать так чтобы демон searchd стартовал при загрузке/перезагрузке операционной системы. Ниже приведен пример создания и настройки скрипта для Debian/Ubuntu GNU/Linux без использования systemd.

Откроем для редактирования новый скрипт инициализации в папке "/etc/init.d" и добавим туда следующие строчки:

#!/bin/bash

#!/bin/sh
### BEGIN INIT INFO
# Provides:          searchd
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# X-Interactive:     true
# Short-Description: Stop/Start SphinxSearch Daemon
### END INIT INFO

case "${1:-''}" in

'start')
/usr/local/sphinx/bin/searchd
;;

'stop')
/usr/local/sphinx/bin/searchd --stop
;;

'restart')
/usr/local/sphinx/bin/searchd --stop
sleep 1
/usr/local/sphinx/bin/searchd
;;

*)
echo "Usage: $SELF start|stop|restart"
exit 1
;;

esac

Установим права на скрипт запуска и зарегистрируем его в автозапуске:

chmod +x /etc/init.d/searchd
update-rc.d searchd defaults

Для надежности можете перезагрузить свой сервер и проверить запустился ли демон searchd:

reboot
ps ax | grep searchd

Понравился пост? Поделитесь ссылкой с друзьями, они оценят:

Комментарии

Загрузка...

не будет публиковаться на сайте