Настройка Sphinx в CMS Bitrix. Битрикс сфинкс
Полезные статьи. Настройка Sphinx в CMS Bitrix. LTD Beget
Sphinx (англ. SQL Phrase Index) — система полнотекстового поиска, разработанная Андреем Аксеновым и распространяемая по лицензии GNU GPL. Отличительной особенностью этого поискового движка является высокая скорость индексации и поиска, возможность использовать морфологический и полнотекстовый поиск.
SphinxSE уже обрел популярность среди разработчиков: именно с его помощью осуществляется поиск на популярном Хабрахабре, проекте Викимапия, сайтах популярного книжного интернет-магазина Буквоед и "Санкт-Петербургского Дома Книги", BitTorrent-трекере The Pirate Bay (небезызвестная "Пиратская бухта") и других высоконагруженных проектах.
Полнотекстовый поиск Sphinx доступен в продуктах «1С-Битрикс» с версии 14.0.0. Он позволяет сделать быстрым и качественным поиск на вашем сайте, снизить нагрузку на сервер, а также он полностью интегрирован с компонентами модуля Поиск.
Внимание! Начиная с версии Sphinx 2.2.1 опция charset_type объявлена как устаревшая:
In 2.2.1-beta version we decided to start removing some old features. All of them was 'unofficially' deprecated for some time. And we're informing you now about it. charset_type=sbcs is now deprecated, we're slowly switching to UTF-only. Even if your database is SBCS (likely for legacy reasons too, eh?), this should be absolutely trivial to workaround, just add a pre-query to fetch your data in UTF-8 and you're all set. Also, in fact, our current UTF-8 tokenizer is even faster than the SBCS one.
Несмотря на то, что в документации к модулю "Поиск" начиная с версии v16.5.0 заявляется о поддержке Sphinx 2.2.10 - она работает исключительно для сайтов в кодировке UTF-8.
Для настройки необходимо зайти в административную панель сайта, затем перейти в меню "Настройки" -> "Настройки продукта" -> "Настройки модулей" -> "Поиск". Затем перейти во вкладку "Морфология" и в выпадающем списке меню "Полнотекстовый поиск с помощью" выбрать "Sphinx". Для своей работы Bitrix использует RT индексы, то есть, фактически, запись осуществляется в два места одновременно - в базу данных и сервер полнотекстового поиска Sphinx, при этом сам Indexer (программа индексации из набора Sphinx) не обновляет индексы. Этот подход позволяет всегда осуществлять поиск по актуальной информации.
Далее необходимо скопировать конфигурационный файл, представленный на странице настройки:
#sphinx.conf 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 происходит в панели управления хостингом - для этого нужно зайти в раздел "Сервисы" -> "Sphinx" или перейти по ссылке https://cp.beget.com/cloudservices/sphinx/. Выбираем необходимый тариф и включаем демон полнотекстового поиска:
Далее переходим на вкладку "Индексация" -> "Редактор конфигурации", вставляем скопированное ранее содержимое конфигурационного файла (с удалением строки "infix_fields="), и нажимаем "Сохранить":
Переходим на вкладку "Поисковый сервер" и включаем его.
Так как используются индексы реального времени, необходимо полностью проиндексировать сайт, для этого снова переходим во вкладку "Морфология" панели управления сайтом, в выпадающем списке меню "Полнотекстовый поиск с помощью выбираем "Sphinx" и нажимаем "Применить".
После применения измений появится сообщение о необходимости полностью проиндексировать сайт, нажимаем на "Переиндексировать сайт"
Попав на страницу индексации снимаем галочку "Проиндексировать только измененные" и нажимаем "Переиндексировать"
Настройка полнотекстового закончена! Проверить работу поиска можно на Вашем сайте.
Если при установке или настройке возникли проблемы, Вы можете обратиться в нашу техническую поддержку - мы с радостью поможем и ответим на все Ваши вопросы.
beget.com
Как подружить ORM D7 1С-Битрикс и Sphinx или новый пакет olegpro/bitrix-sphinx
Написал пакет olegpro/bitrix-sphinx для composer, который содержит набор классов для работы с выборками из индексов sphinx через ORM D7 в привычном виде.
В комплекте пока 4 класса:
- \Olegpro\BitrixSphinx\DB\SphinxConnection - класс для указания в /bitrix/.settings.php в качестве подключения к sphinx (наследуется от Bitrix\Main\DB\MysqliConnection)
- \Olegpro\BitrixSphinx\DB\SphinxSqlHelper - класс-хелпер (наследуется от Bitrix\Main\DB\MysqliSqlHelper)
- \Olegpro\BitrixSphinx\Entity\SphinxDataManager - класс для работы с объектами данных (наследуется от Bitrix\Main\Entity\DataManager)
- \Olegpro\BitrixSphinx\Entity\SphinxQuery - класс запросов (наследуется от Bitrix\Main\Entity\Query)
Установка
composer require olegpro/bitrix-sphinxНастройка подключения к sphinx
В файле /bitrix/.settings.php секцию connections нужно изменить на что-то вроде:
'connections' => array( 'value' => array( 'default' => array( ) ), 'sphinx' => array( 'className' => '\\Olegpro\\BitrixSphinx\\DB\\SphinxConnection', 'host' => '127.0.0.1:9306', 'database' => '', 'login' => '', 'password' => '', 'options' => 1, ), ), 'readonly' => true, ),Описываем класс-сущность
На примере индекса sample_index.
<?php use Bitrix\Main; use Bitrix\Main\Localization\Loc; use Olegpro\BitrixSphinx\Entity\SphinxDataManager; use Olegpro\BitrixSphinx\Entity\SphinxQuery; Loc::loadMessages(__FILE__); class SampleTable extends SphinxDataManager { @return public static function getTableName() { return 'sample_index'; } @return public static function getConnectionName() { return 'sphinx'; } @return public static function query() { return new SphinxQuery(static::getEntity()); } @return public static function getMap() { return [ new Main\Entity\IntegerField('id', [ 'primary' => true, ]), new Main\Entity\StringField('name'), new Main\Entity\BooleanField('available', [ 'values' => [0, 1], ]) ]; } }
Примеры выборок
1) Ищем по слову «книга», добавляем фильтр по атрибуту available, сортируем по весу, ограничиваем выборку лимитов в 10 записей.
<?php use Bitrix\Main\Application; use Bitrix\Main\Entity\ExpressionFieldd; require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php'); Application::getConnection(SampleTable::getConnectionName())->startTracker(true); $iterator = SampleTable::getList([ 'select' => [ '*', new ExpressionField('weight', 'WEIGHT()', 'id'), ], 'match' => 'книга', 'filter' => [ '=available' => 1, ], 'limit' => 10, 'order' => [ 'weight' => 'DESC', ], 'option' => [ 'max_matches' => 50000, ], ]); echo '<pre>';print_r($iterator->getTrackerQuery()->getSql());echo '</pre>'; echo '<pre>';print_r($iterator->fetchAll());echo '</pre>';Пакет olegpro/bitrix-sphinx: