Настройка 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 }

удалив из него строку "infix_fields=". Затем нажать "Применить" сохранив настройки.На этом первая часть настройки CMS Bitrix для работы с сервером полнотекстового поиска закончена, далее необходимо настроить сам сервер.

Настройка параметров 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 класса:

Установка

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], ]) ]; } }

Как вариант, можно в методе getMap получать все поля из информации о индексе в формировать массив полей на лету. Получится что-то вроде:

<?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() { $fields = []; $connection = Main\Application::getConnection(self::getConnectionName()); $result = $connection->query( sprintf( 'DESCRIBE %s', $connection->getSqlHelper()->forSql(self::getTableName()) ) )->fetchAll(); foreach ($result as $item) { $name = $item['Field']; switch ($item['Type']){ case 'int': case 'uint': case 'bigint': case 'mva': $fields[] = new Main\Entity\IntegerField($name, [ 'primary' => ($name === 'id'), ]); break; case 'bool': $fields[] = new Main\Entity\BooleanField($name, [ 'values' => [0, 1], ]); break; case 'string': $fields[] = new Main\Entity\StringField($name, [ ]); break; default: break; } } return $fields; } }

Примеры выборок

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>';

2) Тоже самое, но с постраничной навигацией

<?php use Bitrix\Main\Application; use Bitrix\Main\Entity\ExpressionFieldd; use Bitrix\Main\UI\PageNavigation; require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php'); Application::getConnection(SampleTable::getConnectionName())->startTracker(true); $nav = new PageNavigation('s'); $nav->allowAllRecords(false) ->setPageSize(10) ->initFromUri(); $iterator = SampleTable::getList([ 'select' => [ '*', new ExpressionField('weight', 'WEIGHT()', 'id'), ], 'match' => 'книга', 'filter' => [ '=available' => 1, ], 'count_total' => true, 'offset' => $nav->getOffset(), 'limit' => $nav->getLimit(), 'order' => [ 'weight' => 'DESC', ], 'option' => [ 'max_matches' => 50000, ], ]); $nav->setRecordCount($iterator->getCount()); echo '<pre>';print_r($iterator->getTrackerQuery()->getSql());echo '</pre>'; echo '<pre>';print_r($iterator->fetchAll());echo '</pre>'; $APPLICATION->IncludeComponent( "bitrix:main.pagenavigation", "", array( "NAV_OBJECT" => $nav, "SEF_MODE" => "N", ), false );

Пакет olegpro/bitrix-sphinx:

www.olegpro.ru

Несколько конфигов Sphinx

На компьютере разработчика может работать сразу несколько сайтов. Для разных сайтов могут быть заведены свои поисковые индексы Sphinx. Чтобы было удобно управлять разными конфигурациями, лучше завести отдельные конфигурационные файлы для каждого сайта, один общий конфиг и основной конфиг, который использует Sphinx. Вот как это сделать. Начиная с версии Sphinx 0.9.8 (14 июля 2008 года) доступно задавать конфиг в виде скрипта. Сначала я попробовал сделать, как предложено в статье "Разделение конфигов Sphinx", но у меня не завелось. Возможно, из-за того, что я предпочитаю хранить конфиги в одном месте, а не в каталоге каждого сайта, как автор той статьи. Все мои конфиги Sphinx находятся к каталоге /etc/sphinx Итого я имею: 1. список конфигов с именами "10-site1.part.conf", "10-site2.part.conf". Где число в начале - порядок для дальнейшей сборки в один файл (у меня все десятки). В конфигах обозначены настройки source и index 2. конфиг с общими настроками "90-common.part.conf". Содержимое:common {     lemmatizer_base     = /usr/local/share/sphinx/dicts } indexer {     lemmatizer_cache    = 128M # from bitrix course } searchd {     listen              = 127.0.0.1:9312     listen            = 9306:mysql41     log        = /usr/lib/tmpfiles.d/log/sphinx/searchd.log     query_log        = /usr/lib/tmpfiles.d/log/sphinx/query.log     read_timeout        = 5     max_children        = 30     pid_file        = /usr/lib/tmpfiles.d/run/sphinx/searchd.pid     seamless_rotate     = 1     preopen_indexes     = 1     unlink_old        = 1     binlog_path        = /usr/lib/tmpfiles.d/lib/sphinx     binlog_max_log_size = 16M     rt_flush_period     = 3600 # from bitrix course } 3. основной конфиг, который запрашивает Sphinx - sphinx.conf. Этот конфиг собирает воедино все конфиги. Его содежимое:#!/bin/bash find /etc/sphinx -type f -name "*.part.conf" -print | xargs cat Таким образом, если поиск на каком-то сайте мне не требуется, то нужно лишь переименовать файл его конфига (например "10-site1.bak.conf"). А если требуется добавить ещё один сайт, то стоит скопировать уже имеющийся конфиг и исправить его. Эта схема разбиения конфигов Sphinx отлично работает с Sphinx 2.2.11 на Fedora 24

ekhlakov.blogspot.com


Prostoy-Site | Все права защищены © 2018 | Карта сайта