Архив : Апрель, 2017
Для сравнения файлов или данных удобно использовать хэш суммы MD5, на днях понадобилось сделать это на Powershell.
Итак, как же это сделать?
Относительно недавно, мне было нужно настроить 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 впечатляющие =)
Удачной вам настройки!