Почему стандартный поиск в Битрикс не справляется с большим каталогом?
Каталог на 200 000 товаров — стандартный поиск Битрикс выдаёт страницу за 5 секунд, фильтрация по свойствам — ещё дольше. Стандартный модуль поиска использует таблицы b_search_*, которые не оптимизированы для сложной фильтрации по множеству свойств и полнотекстового поиска с морфологией. Sphinx решает обе проблемы: инкрементальная индексация, морфология, фасетный поиск. Мы настраиваем его под ключ за 3–10 дней. Движок читает данные напрямую из MySQL, что упрощает интеграцию: не нужно писать экспортёр — источник данных описывается SQL-запросами в конфиге Sphinx.
Например, в проекте интернет-магазина автозапчастей с каталогом 350 тыс. позиций после внедрения Sphinx время поиска сократилось с 8 секунд до 50 мс, а фильтрация по 12 свойствам стала мгновенной. Мы внедрили Sphinx в 30+ проектах на Битрикс с каталогами от 10 тыс. до 500 тыс. позиций. Гарантируем стабильную работу и поддержку после запуска. Свяжитесь с нами — проработаем архитектуру поиска под ваш проект.
Как сконфигурировать источник данных для 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 объявляет числовые атрибуты для фильтрации, sql_field_string — строковое поле для поиска и вывода. Sphinx поддерживает до сотен атрибутов без потери производительности.
Подключение свойств товаров для фасетной фильтрации
Для фасетной фильтрации добавляем свойства через sql_attr_multi:
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. Это особенность Битрикс: каждому инфоблоку — своя таблица свойств. В сложных проектах мы объединяем несколько таблиц через UNION. Также можно индексировать множественные свойства через sql_attr_multi с разделителями, что позволяет реализовать фильтр по нескольким значениям одновременно.
Как настроить русскую морфологию?
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-поиск: «ноут» → «ноутбук». Увеличивает индекс, но мы всегда оптимизируем под ваш объём данных. Для больших каталогов (более 300 тыс.) рекомендуем отказаться от prefix и использовать инфиксный поиск. Настройка charset_table обеспечивает корректную обработку кириллицы и регистронезависимость.
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 результата на 5–10 минут. При большом количестве запросов рекомендуем пул соединений PDO.
Как настроить delta-индексацию для актуальных данных?
Полная переиндексация (indexer --all) — для ночных крон-задач. Delta-индекс — индексирует только изменённые записи с последней индексации. Требуется поле updated_at и отдельный источник:
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) } Объединение: indexer --merge bitrix_catalog bitrix_catalog_delta. Delta-индексация выполняется каждые 5–10 минут через крон. Мы также настраиваем sph_counter для корректного отслеживания времени последней индексации. При сбоях крон-задач автоматически запускается полная переиндексация.
Почему Sphinx, а не Elasticsearch?
Sphinx в 2-3 раза быстрее индексирует данные из MySQL на серверах с 2 CPU и 4 GB RAM. Сравнение для типового каталога Битрикс:
| Критерий | Sphinx (Manticore) | Elasticsearch |
|---|---|---|
| Потребление памяти (каталог 200 тыс. элементов) | ~300 MB | ~1.5 GB |
| Время первичной индексации | 15-20 мин | 40-60 мин |
| Сложность настройки | Один конфиг | Кластер, плагины |
| Поддержка русской морфологии | Встроенная | Требует анализатор |
| Горизонтальное масштабирование | Нет (ОЗУ+диск) | Да (кластер) |
Выбирайте Sphinx, если сервер < 4 GB RAM и данные только из MySQL. Elasticsearch подойдёт для кластеров и агрегаций в реальном времени. В 80% наших проектов для Битрикс используем именно Sphinx. Подробнее о Sphinx читайте в Wikipedia.
Какие типичные ошибки возникают при настройке Sphinx?
Самая частая — неправильная charset_table: если кириллица не указана, поиск по русским словам возвращает пустой результат. Вторая по частоте — отсутствие sql_attr_multi для свойств: фасетная фильтрация перестаёт работать. Третья — слишком большой min_prefix_len: при каталоге >500 тыс. позиций индекс вырастает в 2-3 раза, и время индексации увеличивается. Мы в каждом проекте проводим аудит конфигурации и нагрузочное тестирование, чтобы исключить эти проблемы.
Что входит в интеграцию
- Анализ структуры каталога и требований к поиску
- Развёртывание Sphinx (Manticore) на сервере
- Конфигурация источников данных (инфоблоки, свойства, hl-блоки)
- Настройка индексов с морфологией и prefix-поиском
- Разработка PHP-шлюза для запросов из Битрикс
- Интеграция с компонентом каталога (фасетный поиск, фильтр)
- Реализация delta-индексации (актуальность данных)
- Тестирование на тестовой нагрузке
- Документация и обучение администратора
- Гарантия 12 месяцев на все работы
Сроки и стоимость
| Масштаб | Состав | Срок |
|---|---|---|
| Базовый | Установка, конфиг, индексатор, поисковый шлюз | 3–5 дней |
| Полный | Delta-индексация, фасетный поиск, интеграция с фильтром каталога | 7–10 дней |
Стоимость рассчитывается индивидуально после анализа вашего проекта. Оценим объём данных, сложность фасетов и требования к скорости. Закажите интеграцию — получите консультацию по архитектуре поиска. Сертифицированные специалисты с опытом 7+ лет гарантируют стабильную работу и поддержку после запуска.







