Інтеграція 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 днів |







