Относительно недавно, мне было нужно настроить sphinxsearch для одного проекта на Bitrix.
Поэтому в этой статье я поделюсь с вами информацией как просто это сделать.
И так, Sphinx (англ. SQL Phrase Index) — система полнотекстового поиска, разработанная Андреем Аксёновым и распространяемая по лицензии GNU GPL.
Отличительной особенностью является высокая скорость индексации и поиска, а также интеграция с существующими СУБД (MySQL, PostgreSQL) и API для распространённых языков веб-программирования (официально поддерживаются PHP, Python, Java; существуют реализованные сообществом API для Perl, Ruby,.NET[1] и C++). Так что интегрировать эту систему реально и достаточно просто.
Рассмотрим основные плюсы Sphinx перед обычными (встроенными) системами поиска:
Поддержка ODBC совместимых баз данных (MS SQL, Oracle и т. д.).
Впечатляет? Вот небольшой список тех кто использует Sphinx:
Перейдем к установке.
Все операции проводились на Ubuntu 14.04 LTS, но инструкция должна подойти и для более свежих версий.
Добавляем репозиторий со свежим sphinx
1 |
add-apt-repository ppa:builds/sphinxsearch-rel22 |
Далее обновляем пакеты и устанавливаем сам Sphinx
1 |
apt-get update |
1 |
apt-get install sphinxsearch |
Теперь создадим конфиг Sphinx c именем sphinx.conf в каталоге /etc/sphinxsearch/
Вот пример конфига Sphinx:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
source src1 { type = mysql 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 sql_query_info = SELECT * FROM documents WHERE id=$id } |
Рассмотрим секции конфига по порядку:
Давайте разберем из каких секций может состоять конфиг Sphinx
Дополнительно рассмотрим таблицу атрибутов, которые можно использовать в Sphinx.
Makes | Matches Query | Sortable | Groupable | Filterable | Retreivable | |
---|---|---|---|---|---|---|
first column | Document ID | YES | [1] | YES | ALWAYS | |
(no definition) | FIELD | YES | [2] | |||
sql_attr_uint | ATTRIBUTE | YES | YES | YES | YES | |
sql_attr_bool | ATTRIBUTE | YES | YES | YES | YES | |
sql_attr_bigint | ATTRIBUTE | YES | YES | YES | YES | |
sql_attr_timestamp | ATTRIBUTE | YES | YES | YES | YES | |
sql_attr_str2ordinal | ATTRIBUTE | YES | YES | [3] | [3] | |
sql_attr_float | ATTRIBUTE | YES | YES | YES | YES | |
sql_attr_multi | ATTRIBUTE | YES | YES | YES | YES | |
sql_attr_string | ATTRIBUTE | YES | YES | YES | ||
sql_attr_str2wordcount | ATTRIBUTE | YES | [3] | YES | YES | |
sql_field_string | ATTRIBUTE + FIELD | YES | YES | YES | [2] | YES |
sql_field_str2wordcount | ATTRIBUTE + FIELD | YES | YES | [3] | YES | YES |
sql_joined_field | FIELD | YES |
Ниже мы рассмотрим реальный пример интеграции Sphinx в CMS WordPress , без использования плагинов.
Составим следующий конфиг Sphinx:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
source src1 { type = mysql sql_host = localhost sql_user = admin_wp sql_pass = 123456 # change this to your root users MySQL password sql_db = admin_wp sql_port = 3306 sql_query_pre = SET NAMES utf8 # SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ # FROM documents sql_query = SELECT ID, post_content, post_title, post_status, post_type, guid, post_date FROM wp_posts WHERE `post_status` = 'publish' AND `post_type` = 'post' sql_attr_uint = ID # sql_attr_string = post_title sql_field_string = post_title sql_attr_string = post_type sql_attr_uint = guid sql_field_string = post_content sql_attr_timestamp = post_date #sql_query_info = SELECT * FROM wp_posts WHERE id=$ID } index test1 { source = src1 path = /var/lib/sphinxsearch/data/test1 docinfo = extern # charset_type = utf8 min_word_len = 3 enable_star = 1 min_infix_len = 3 } searchd { # listen = 9312 listen = 127.0.0.1:9306:mysql41 log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinxsearch/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/data } |
В данном примере мы будем проводить поиск по постам в блоге, нас интересуют следующие данные в БД wordpress:
Этих данных нам достаточно для идентификации постов WordPress при поиске через Sphinx.
Разберем сам конфиг.
Источник данных у нас Mysql
1 2 3 |
source src1 { type = mysql |
Подключение к нашей БД с wordpress
1 2 3 4 5 |
sql_host = localhost sql_user = admin_wp sql_pass = 123456 # change this to your root users MySQL password sql_db = admin_wp sql_port = 3306 |
SQL запрос для импорта данных
1 |
sql_query = SELECT ID, post_content, post_title, post_status, post_type, guid, post_date FROM wp_posts WHERE `post_status` = 'publish' AND `post_type` = 'post' |
Устанавливаем атрибуты
1 2 3 4 5 6 7 |
sql_attr_uint = ID # sql_attr_string = post_title sql_field_string = post_title sql_attr_string = post_type sql_attr_uint = guid sql_field_string = post_content sql_attr_timestamp = post_date |
Далее идет сам индекс
1 2 3 4 5 6 7 8 9 10 |
index test1 { source = src1 path = /var/lib/sphinxsearch/data/test1 docinfo = extern # charset_type = utf8 min_word_len = 3 enable_star = 1 min_infix_len = 3 } |
Рассмотрим индекс поближе:
И последняя часть конфига, настройка самой службы Sphinx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
searchd { # listen = 9312 listen = 127.0.0.1:9306:mysql41 log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinxsearch/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/data } |
Тут мы указываем на каком порту слушать запросы к sphinx, где хранить логи, timeout на чтение, максимальное кол-во параллельных поисковых запросов(30).
Стоит отметить что строка
1 |
listen = 127.0.0.1:9306:mysql41 |
позволит нам использовать при поиске синтаксис аля mysql, тоесть это значит что мы может подключаться к Sphinx нативными средствами для работы с Mysql и проводить поиск через них. Сейчас покажу как мы это сделаем в WordPress на PHP.
Сохраняем наш конфиг и перезапускаем службу Sphinx
1 |
service sphinxsearch restart |
Следующей командой мы можем проиндексировать все существующие индексы Sphinx
1 |
indexer --all |
Следующей командой мы проиндексируем все изменения в индексе test1
1 |
indexer test1 --rotate --all |
Теперь в WordPress я изменю стандартную тему Twenty Sixteen , а именно файл поиска — /wp-content/themes/twentysixteen/search.php
В сам файл я добавлю следующий код, для нативной работы со Sphinx через PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$link = mysql_connect('127.0.0.1:9306') or die('Не удалось соединиться: ' . mysql_error()); echo 'Соединение успешно установлено'; $query = "SELECT * FROM test1 WHERE MATCH('@post_content $s')"; $result = mysql_query($query) or die('Запрос не удался: ' . mysql_error()); echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; foreach ($line as $col_value) { echo "\t\t<td>$col_value</td>\n"; } echo "\t</tr>\n"; } echo "</table>\n"; |
Что мы тут делаем? Да все просто:
Выглядит это вот так, я выполнил поиск по слову «привет»
Результаты выглядят так:
Собственно в таблице вы можете видеть следующие данные:
Сам пример файла search.php вы можете найти тут
Чтобы поиск в Sphinx обновлялся , вам нужно добавить в Cron задания по обновлению индекса.
В данном случае достаточно выполнить crontab -e и добавить в него строку
1 |
*/10 * * * * indexer test1 --rotate --all |
Для обновления нашего индекса test1 каждые 10 минут.
Из консоли Ubuntu вы можете подключиться к Sphinx через mysql клиент
1 |
mysql -P 9306 -h 127.0.0.1 |
Еще вы можете использовать дельта индексы, но об этом я постараюсь рассказать в рамках другой статьи.
Также дополню что для Bitrix настройка не отличается особенной сложностью, все описано в документации.
Но продублирую эту информацию для вас тут.
Создаем конфиг Sphinx для Bitrix
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
searchd { listen = 9312 listen = 9306:mysql41 log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinxsearch/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 workers = threads # for RT to work binlog_path = /var/lib/sphinxsearch/data/ binlog_max_log_size = 512M binlog_flush = 2 rt_flush_period = 3600 } indexer { lemmatizer_cache = 128M lemmatizer_base = /etc/sphinxsearch/dicts/ # lemmatizer_base в Sphinx 2.2.1+ располагается в секции common } index bitrix { #main settings type = rt path = /var/lib/sphinxsearch/data/bitrix docinfo = inline #choose appropriate type of morphology to use #morphology = lemmatize_ru_all, lemmatize_en_all, lemmatize_de_all, stem_enru morphology = stem_enru, soundex #these settings are used by bitrix:search.title component dict = keywords prefix_fields = title infix_fields= min_prefix_len = 2 enable_star = 1 #all fields must be defined exactly as followed rt_field = title rt_field = body rt_attr_uint = module_id rt_attr_string = module rt_attr_uint = item_id rt_attr_string = item rt_attr_uint = param1_id rt_attr_string = param1 rt_attr_uint = param2_id rt_attr_string = param2 rt_attr_timestamp = date_change rt_attr_timestamp = date_to rt_attr_timestamp = date_from rt_attr_uint = custom_rank rt_attr_multi = tags rt_attr_multi = right rt_attr_multi = site rt_attr_multi = param #depends on settings of your site # uncomment for single byte character set charset_type = sbcs # uncomment for UTF character set #charset_type = utf-8 } |
Скачиваем словари для Sphinx тут и копируем их в каталог /etc/sphinxsearch/dicts/
Перезапускаем службу Sphinx
1 |
service sphinxsearch restart |
Далее переходим на страницу настройки модуля «Поиск» (Настройки > Настройки продукта > Настройки модулей > Поиск) и указываем Sphinx как основной поиск.
Далее в Bitrix необходимо выполнить переиндексацию поиска сайта
На этом настройка связки Sphinx + Bitrix завершена, как видите тут нет ничего сложного, однако пример с WordPress и PHP показывает что возможности интеграции полнотекстового движка Sphinx впечатляющие =)
Удачной вам настройки!