Поиск по каталогу в 1С-Битрикс работает на модуле search и полностью зависит от индекса: если товар не попал в поисковый индекс, найти его невозможно, каким бы точным ни был запрос. Правильная настройка индексации — это 80% успеха хорошего поиска.
Как устроен поиск в Битрикс
Поиск в 1С-Битрикс реализован отдельным модулем search и не связан напрямую с базой инфоблоков: он работает по собственному поисковому индексу. Когда пользователь вводит запрос, система ищет не по таблицам каталога, а по таблице b_search_content и её стеммингованным словам в b_search_content_stem.
В индекс попадают только те сущности, для которых включена индексация: элементы инфоблоков (товары), разделы, страницы, форумы и т. д. За каждым проиндексированным объектом закреплены модуль (например, iblock) и права доступа, поэтому поиск автоматически учитывает, что пользователю разрешено видеть.
- заголовок (
TITLE) — название товара; - тело (
BODY) — описания, значения свойств, артикул; - теги, дата, привязка к разделу и права.
Понимание этой схемы сразу объясняет главное правило: нет записи в индексе — нет результата в поиске, даже если товар открыт и активен.
Включение индексации инфоблока
Первый шаг — разрешить индексацию нужному инфоблоку каталога. Откройте Контент → Инфоблоки → Типы инфоблоков → [ваш каталог] → Настройки, вкладка «Поиск», и поставьте флаг «Индексировать для поиска». Без этого флага элементы инфоблока в индекс не попадут вообще.
Далее убедитесь, что сам модуль поиска включает индексацию модуля iblock. Это проверяется в Настройки → Настройки продукта → Настройки модулей → Поиск. Здесь же настраиваются ключевые параметры:
- Учёт морфологии — русская и английская морфология (стемминг), чтобы «телефоны» находились по запросу «телефон»;
- Логика по умолчанию —
AND(все слова) илиOR(любое слово); - Минимальная длина слова для попадания в индекс.
OnBeforeIndexHandler.Переиндексация каталога
После включения индексации существующие товары в индекс сами не попадут — нужна полная переиндексация. Она запускается в Сервисы → Поиск → Переиндексация кнопкой «Переиндексировать». Для большого каталога процесс идёт пошагово (по таймауту), поэтому не закрывайте страницу до завершения.
На боевых проектах с десятками тысяч SKU веб-переиндексацию лучше заменить агентом или консольным скриптом на базе CSearch::ReIndexAll(), запускаемым по cron ночью. Это снимает риск обрыва по таймауту PHP и не грузит сайт днём.
| Способ | Когда использовать |
|---|---|
| Кнопка в админке | Небольшой каталог, разовая настройка |
Агент CSearch::ReIndexAll() | Регулярное обновление в фоне |
| Cron-скрипт | Крупный каталог, ночной пересбор |
Текущие изменения товаров (создание, правка, деактивация) индексируются автоматически при сохранении, если модуль search активен. Полная переиндексация нужна только после изменения настроек индексации или массовой загрузки из 1С.
Компоненты поиска на витрине
На фронтенде поиск собирается из двух стандартных компонентов из пространства bitrix:search.*:
bitrix:search.title— строка поиска с выпадающими подсказками (title search), быстрый поиск по заголовкам прямо в шапке;bitrix:search.page— страница результатов с постраничной навигацией, сортировкой по релевантности и фильтрами по модулям.
Чтобы поиск искал только по товарам, в параметрах search.page ограничьте область: параметр «Ограничение области поиска» и arParams с указанием нужного модуля iblock и ID каталога через $arParams["arrFILTER"]. Так в выдачу не попадут новости, страницы и разделы помощи.
search.title ищет только по полю TITLE (заголовкам). Если нужно, чтобы подсказки находили товар по артикулу, добавьте артикул в название либо в отдельно индексируемое поле — иначе быстрый поиск его «не увидит».Релевантность и качество выдачи
По умолчанию Битрикс сортирует результаты по релевантности (rank), которая считается по частоте и позиции совпадений. На практике этого мало для магазина, и качество поиска повышают несколькими приёмами:
- Морфология обязательна — без неё «дрель» и «дрели» считаются разными словами;
- Веса полей — заголовок должен весить больше описания, чтобы совпадение в названии поднимало товар выше;
- Синонимы и стоп-слова — словарь синонимов помогает находить «холодильник» по запросу «фридж», а стоп-слова убирают мусорные предлоги;
- Сортировка результата — можно сортировать не по релевантности, а по наличию, цене или популярности.
Если стандартной релевантности не хватает (опечатки, транслит, поиск по характеристикам), задачу решают внешние движки — Sphinx/Manticore или Elasticsearch. В редакциях с модулем search есть встроенная интеграция со Sphinx, которая заметно ускоряет поиск на больших каталогах и добавляет нечёткое совпадение.
Типичные ошибки и диагностика
Большинство жалоб «поиск ничего не находит» сводятся к нескольким причинам. Пройдитесь по чек-листу, прежде чем лезть в код:
- Не включена индексация инфоблока — самый частый случай после переноса или загрузки каталога;
- Не выполнена переиндексация — настройки поменяли, а индекс старый;
- Область поиска шире каталога — в выдачу лезут страницы и разделы, товары теряются;
- Права доступа — товар закрыт для группы, поэтому не показывается в поиске конкретному пользователю;
- Раздутая таблица
b_search_content— после многократных загрузок из 1С накапливаются дубли, поиск тормозит.
b_search_content по ITEM_ID и MODULE_ID='iblock'. Если записи нет — проблема в индексации, а не в компоненте на витрине.Производительность на больших каталогах
Поисковый индекс — это дополнительные таблицы, которые растут вместе с каталогом. На магазинах от нескольких десятков тысяч товаров важно следить за их состоянием:
- периодически чистить осиротевшие записи после удаления товаров;
- держать актуальными индексы MySQL на
b_search_contentиb_search_content_stem; - выносить полную переиндексацию в ночное окно, чтобы не блокировать таблицы днём;
- при обмене с 1С не пересобирать индекс на каждый пакет, а ставить отложенную переиндексацию.
Если после интеграции с 1С поиск начал тормозить или отдавать дубли, чаще всего дело в том, что обмен пересоздаёт элементы, а индекс не успевает синхронизироваться. Тогда помогает связка «отложенный агент переиндексации + чистка дублей», а не увеличение лимитов PHP.
Итог
Рабочий поиск по каталогу в Битрикс держится на трёх вещах: включённой индексации инфоблока, выполненной переиндексации и правильно ограниченной области поиска в компонентах search.title и search.page. Дальше качество выдачи наращивают морфологией, весами полей, синонимами и, при необходимости, внешним движком вроде Sphinx или Elasticsearch.
Мы в B2Bsite настраиваем поиск в связке с умным фильтром и фасетным индексом, чистим раздутые поисковые таблицы после обменов с 1С и разгоняем выдачу на каталогах в десятки тысяч SKU. Если поиск «не находит очевидное» или тормозит после интеграции — поможем найти причину и привести индексацию в порядок.
Частые вопросы
Почему товар не находится через поиск, хотя он активен?
Скорее всего, он не попал в поисковый индекс. Проверьте, что для инфоблока включена галочка «Индексировать для поиска», и выполните полную переиндексацию в разделе «Сервисы → Поиск».
Нужно ли переиндексировать сайт после каждой загрузки из 1С?
Нет, текущие изменения индексируются автоматически при сохранении элементов. Полная переиндексация нужна только после смены настроек индексации или массовой первичной загрузки каталога.
Почему быстрый поиск в шапке не находит товар по артикулу?
Компонент search.title ищет только по заголовкам (полю TITLE). Чтобы артикул находился, добавьте его в название товара или в отдельно индексируемое поле.
Как ограничить поиск только каталогом, без новостей и страниц?
В параметрах компонента search.page задайте ограничение области поиска и передайте фильтр по модулю iblock и ID нужного инфоблока через arrFILTER.
Что делать, если стандартной релевантности не хватает?
Включите морфологию, настройте веса полей и словарь синонимов. Для опечаток, транслита и нечёткого поиска подключают внешний движок — Sphinx, Manticore или Elasticsearch.
Почему поиск начал тормозить со временем?
Обычно раздувается таблица b_search_content из-за дублей после многократных обменов с 1С. Помогает чистка осиротевших записей и вынос полной переиндексации в ночное окно.
Как проверить, попал ли конкретный товар в индекс?
Сделайте запрос к таблице b_search_content по ITEM_ID товара и MODULE_ID='iblock'. Если записи нет, проблема в индексации, а не в компоненте на витрине.
Учитывает ли поиск права доступа пользователей?
Да, за каждой записью индекса закреплены права. Если товар закрыт для группы пользователя, в поисковой выдаче для него он не появится.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.