Интеграция Sphinx с 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция Sphinx с 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Интеграция Sphinx с 1С-Битрикс

Sphinx (и его форк Manticore Search) — специализированный поисковый движок, который индексирует данные непосредственно из MySQL. Это его главное преимущество перед Elasticsearch при интеграции с Битрикс: Sphinx читает данные из таблиц b_iblock_element, b_iblock_element_property, b_search_content через стандартный MySQL-коннектор. Не нужно писать отдельный экспортёр данных — источник данных описывается SQL-запросами в конфиге Sphinx.

Конфигурация источника данных

Sphinx читает данные через source — это SQL-запрос, который выполняется при переиндексации. Пример конфига для каталога товаров:

source bitrix_catalog
{
    type            = mysql
    sql_host        = localhost
    sql_user        = bitrix
    sql_pass        = password
    sql_db          = bitrix_db
    sql_port        = 3306

    sql_query = \
        SELECT \
            e.ID, \
            e.IBLOCK_ID, \
            e.NAME, \
            e.DETAIL_TEXT, \
            e.CODE, \
            UNIX_TIMESTAMP(e.TIMESTAMP_X) AS updated_at \
        FROM b_iblock_element e \
        WHERE e.IBLOCK_ID IN (5, 6) \
          AND e.ACTIVE = 'Y' \
          AND e.WF_STATUS_ID = 1

    sql_attr_uint  = IBLOCK_ID
    sql_attr_uint  = updated_at
    sql_field_string = NAME
}

sql_attr_uint объявляет числовые атрибуты — они используются для фильтрации (WHERE IBLOCK_ID = 5), но не для полнотекстового поиска. sql_field_string — строковое поле, доступное и для поиска, и для возврата в результатах.

Подключение свойств товаров

Для фасетной фильтрации в поиске нужны свойства товаров. Добавляем их через sql_joined_field или отдельный sql_query_attr:

sql_attr_multi = uint PROPERTY_COLOR FROM query; \
    SELECT e.ID, p.VALUE_NUM \
    FROM b_iblock_element e \
    JOIN b_iblock_element_prop_s5 p ON p.IBLOCK_ELEMENT_ID = e.ID \
    WHERE e.IBLOCK_ID = 5

b_iblock_element_prop_s5 — таблица свойств для инфоблока с ID 5. Для каждого инфоблока своя таблица (число в конце = IBLOCK_ID). Это особенность Битрикс, которую нужно учитывать при написании запросов.

Настройка морфологии

Sphinx поддерживает русскую морфологию через встроенный стеммер:

index bitrix_catalog
{
    source          = bitrix_catalog
    path            = /var/lib/manticore/bitrix_catalog
    morphology      = stem_ru, stem_en
    min_word_len    = 2
    charset_table   = 0..9, A..Z->a..z, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
    min_prefix_len  = 3
}

min_prefix_len = 3 активирует prefix-поиск: пользователь вводит «ноут» — находит «ноутбук». Включайте осторожно, это увеличивает индекс.

PHP-клиент и запросы из Битрикс

Sphinx поддерживает протокол MySQL, поэтому обращаться к нему можно через стандартное PDO:

$sphinx = new PDO('mysql:host=127.0.0.1;port=9306', '', '');

$stmt = $sphinx->prepare(
    "SELECT id, weight() as w, NAME
     FROM bitrix_catalog
     WHERE MATCH(:query) AND IBLOCK_ID = :iblock
     ORDER BY w DESC
     LIMIT :offset, :limit
     OPTION max_matches=1000"
);
$stmt->execute([
    ':query'  => $searchQuery,
    ':iblock' => CATALOG_IBLOCK_ID,
    ':offset' => ($page - 1) * $pageSize,
    ':limit'  => $pageSize,
]);

$ids = array_column($stmt->fetchAll(), 'id');

Получив массив $ids, загружаем полные данные товаров через CIBlockElement::GetList() с фильтром по ID. Это стандартный паттерн для поисковых интеграций в Битрикс.

Обновление индекса

Sphinx поддерживает два режима переиндексации:

Полная переиндексация (indexer --all) — пересоздаёт индекс с нуля. Для больших каталогов запускается ночью через cron.

Delta-индекс — индексирует только изменённые с последней индексации записи. Требует добавления поля updated_at в SQL-запрос и отдельного источника bitrix_catalog_delta:

source bitrix_catalog_delta : bitrix_catalog
{
    sql_query = \
        SELECT e.ID, ... \
        FROM b_iblock_element e \
        WHERE UNIX_TIMESTAMP(e.TIMESTAMP_X) > (SELECT max_doc_date FROM sph_counter WHERE id=1)
}

Delta-индекс объединяется с основным командой indexer --merge bitrix_catalog bitrix_catalog_delta.

Когда выбирать Sphinx, а не Elasticsearch

Sphinx проще в установке (один бинарник, конфиг в текстовом файле) и потребляет меньше памяти. Выбирайте Sphinx, если: сервер с ограниченными ресурсами (< 4 GB RAM), данные только из MySQL, не нужна горизонтальная масштабируемость. Elasticsearch предпочтительнее при нескольких источниках данных, кластерной конфигурации и необходимости агрегаций в реальном времени.

Сроки внедрения

Масштаб Состав Срок
Базовый Установка, конфиг, индексатор, поисковый шлюз 3–5 дней
Полный Delta-индексация, фасетный поиск, интеграция с фильтром каталога 7–10 дней