Архив : Апрель, 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
add-apt-repository ppa:builds/sphinxsearch-rel22
Далее обновляем пакеты и устанавливаем сам Sphinx
apt-get update
apt-get install sphinxsearch
Теперь создадим конфиг Sphinx c именем sphinx.conf в каталоге /etc/sphinxsearch/
Вот пример конфига Sphinx:
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:
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
source src1
{
type = mysql
Подключение к нашей БД с wordpress
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 запрос для импорта данных
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
Далее идет сам индекс
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
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).
Стоит отметить что строка
listen = 127.0.0.1:9306:mysql41
позволит нам использовать при поиске синтаксис аля mysql, тоесть это значит что мы может подключаться к Sphinx нативными средствами для работы с Mysql и проводить поиск через них. Сейчас покажу как мы это сделаем в WordPress на PHP.
Сохраняем наш конфиг и перезапускаем службу Sphinx
service sphinxsearch restart
Следующей командой мы можем проиндексировать все существующие индексы Sphinx
indexer --all
Следующей командой мы проиндексируем все изменения в индексе test1
indexer test1 --rotate --all
Теперь в WordPress я изменю стандартную тему Twenty Sixteen , а именно файл поиска — /wp-content/themes/twentysixteen/search.php
В сам файл я добавлю следующий код, для нативной работы со Sphinx через PHP
$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 и добавить в него строку
*/10 * * * * indexer test1 --rotate --all
Для обновления нашего индекса test1 каждые 10 минут.
Из консоли Ubuntu вы можете подключиться к Sphinx через mysql клиент
mysql -P 9306 -h 127.0.0.1
Еще вы можете использовать дельта индексы, но об этом я постараюсь рассказать в рамках другой статьи.
Также дополню что для Bitrix настройка не отличается особенной сложностью, все описано в документации.
Но продублирую эту информацию для вас тут.
Создаем конфиг Sphinx для Bitrix
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
service sphinxsearch restart
Далее переходим на страницу настройки модуля «Поиск» (Настройки > Настройки продукта > Настройки модулей > Поиск) и указываем Sphinx как основной поиск.

Далее в Bitrix необходимо выполнить переиндексацию поиска сайта

На этом настройка связки Sphinx + Bitrix завершена, как видите тут нет ничего сложного, однако пример с WordPress и PHP показывает что возможности интеграции полнотекстового движка Sphinx впечатляющие =)
Удачной вам настройки!