Интеграция 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 дней |







