Інтеграція Sphinx з 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Інтеграція Sphinx з 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Інтеграція Sphinx з Bitrix CMS

Sphinx (та його форк Manticore Search) — спеціалізований пошуковий рушій, який індексує дані безпосередньо з MySQL. Це його головна перевага перед Elasticsearch при інтеграції з Bitrix: 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). Це особливість Bitrix, яку потрібно враховувати при написанні запитів.

Налаштування морфології

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 активує пошук за префіксом: користувач вводить "ноут" — знаходить "ноутбук". Увімкніть обережно, це збільшує розмір індексу.

PHP-клієнт та запити з Bitrix

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. Це стандартний паттерн для пошукових інтеграцій у Bitrix.

Оновлення індексу

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 днів