Захожу в админку клиента, набираю в поиске на сайте название товара, которое сто процентов есть в каталоге, и получаю пустую страницу результатов. Это типичная история для проектов на 1С-Битрикс: поиск в Битриксе устроен неплохо, но у него хватает мест, где он молча отваливается, а владелец сайта решает, что «поиск на сайте просто плохой». На практике причины почти всегда сводятся к трём вещам: индекс не обновлён, элемент выключен из индексации на уровне настроек, или запрос не совпадает с тем, что реально лежит в поисковой таблице из-за морфологии. Разберу по порядку, как это устроено и что чинить в первую очередь.
Как устроен индекс поиска в Битриксе
Модуль «Поиск» хранит собственную индексную таблицу, отдельную от таблиц контента: элементы инфоблоков, разделы форума, записи блога и статьи попадают туда не автоматически по факту сохранения, а через отдельную процедуру индексации. Если модуль поиска не подключён к конкретному разделу или у инфоблока не включена индексация в его настройках, элемент физически никогда не окажется в индексе, сколько бы раз его ни искали.
В мультисайтовых конфигурациях индекс привязан к конкретному сайту. Если каталог общий для нескольких сайтов, а полная индексация запускалась только на одном из них, второй будет искать по пустому или устаревшему индексу, и разработчик потратит час на поиск несуществующего бага вместо того, чтобы просто перезапустить индексацию для нужного SITE_ID.
Включённые в индексацию модули и параметры видны в административной панели: Настройки > Поиск > Настройки поиска. Там же настраивается язык морфологии по умолчанию и список модулей, которые вообще участвуют в построении индекса.
Почему битрикс поиск не находит то, что точно есть
Когда клиент говорит «поиск сломан», в девяти случаях из десяти причина одна из этих:
- элемент импортирован через обмен с 1С или добавлен через API, а полная переиндексация после этого не запускалась
- у элемента или раздела инфоблока не отмечено «Показывать на сайте», либо стоит ACTIVE=N
- права доступа к разделу ограничены, а поиск фильтрует результаты по правам текущего пользователя: то, что видит администратор, анонимный посетитель может не увидеть вовсе
- товар с нулевым остатком или без цены скрыт торговым фильтром компонента каталога, хотя формально он проиндексирован
- кэш компонента поиска не сброшен после изменений и продолжает отдавать старую выдачу до истечения времени жизни кэша
- в параметрах компонента поиска ограничен список разделов или инфоблоков (IBLOCK ID), и новый раздел туда просто не попал
По разным типам контента причины стоит проверять в разном порядке:
| Тип контента | Где смотреть в первую очередь |
|---|---|
| Товар в каталоге | Показывать на сайте, наличие и цена, права доступа к разделу |
| Статья блога или новость | ACTIVE=N, дата публикации в будущем, включена ли индексация модуля блога в настройках поиска |
| Страница на композитном кэше | Свежесть кэша страницы и попадает ли шаблон в список индексируемых типов |
| Форум или отзывы | Права на просмотр раздела форума у анонимного пользователя |
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Морфология и словоформы: как поиск разбирает запросы
Встроенные морфологические словари сводят словоформы к нормальной: запрос «столы» находит «стол», «столом», «столов» и другие формы для русского и ряда других поддерживаемых языков. Это работает автоматически, отдельный платный модуль подключать не нужно, достаточно верно указать язык морфологии в свойствах сайта.
Это не защита от опечаток. Если пользователь написал «смарфон» с пропущенной буквой, морфология тут бессильна: она работает со словоформами, а не с нечётким совпадением строк. Для полноценного нечёткого поиска с исправлением опечаток на больших каталогах студии подключают отдельный поисковый движок вроде Sphinx или Elasticsearch поверх стандартного индекса. Это отдельный сервер, который нужно поднимать, обновлять и оплачивать отдельно от хостинга сайта: для интернет-магазина на несколько тысяч позиций это обычно избыточно, штатного индекса с лихвой хватает.
Точная фраза в кавычках ищет буквально, без разбора по словоформам, а звёздочка в конце слова работает как поиск по началу слова. Если морфология работает не так, как ожидается, часто причина в том, что языковая версия сайта настроена под другой язык морфологии или он не задан вовсе. В административной панели есть отдельный раздел синонимов, где можно вручную задать соответствия, которые морфология не свяжет сама, например аббревиатуры, бренды или профессиональный жаргон.
Полная и плановая переиндексация
Запускается из Настройки > Поиск > Переиндексация: можно выбрать полную переиндексацию, которая очищает индекс и строит его заново, либо переиндексацию по отдельным модулям. Полная переиндексация каталога на несколько тысяч позиций у меня на практике занимала от 10 до 40 минут в зависимости от хостинга и числа свойств у элементов, это блокирующая операция, и лучше запускать её в ночное окно, а не в разгар продаж.
Для регулярного обновления индекса без ручных нажатий используется агент, который добавляется через cron на хостинге: обычная задача по расписанию, отдельный сервер под это не нужен, агенты Битрикса штатно выполняются в рамках обычного PHP-хостинга. Если каталог обновляется через обмен с 1С несколько раз в день, разумнее вешать переиндексацию сразу после завершения обмена, а не по общему расписанию раз в сутки, иначе половину дня поиск будет отдавать вчерашние остатки и цены.
Вес полей и релевантность выдачи
В компоненте поиска есть параметры веса для заголовка, тела и ключевых слов: чем выше вес поля, тем сильнее совпадение в нём поднимает документ в выдаче. По умолчанию сортировка часто идёт по релевантности, но для каталога иногда логичнее сортировать сначала по совпадению в названии, а затем по цене или дате, это настраивается параметрами компонента, без правки кода.
Список стоп-слов, предлогов и частиц, которые не участвуют в поиске, тоже редактируется в админке. Если в индекс попадают короткие частые слова вроде предлогов, они засоряют индекс и портят релевантность: пользователь ищет «стол для кухни», а наверх выпадает всё, где встречается предлог «для».
Типичные ошибки при настройке поиска
За несколько лет работы с проектами на Битриксе чаще всего встречаю одно и то же:
- полную переиндексацию не запускают после смены структуры инфоблока или массового импорта
- компонент поиска на сайте настроен ограниченным списком разделов ещё с момента запуска сайта, а новые разделы в него не добавляют
- кэш компонентов держат неделями, потому что «так быстрее», и не замечают, что поиск отстаёт от реального состояния каталога
- морфологию не проверяют на мультиязычных версиях сайта, из-за чего на одной языковой версии поиск работает, а на другой нет
Если после проверки всех этих пунктов поиск в интернет-магазине на Битриксе всё равно работает нестабильно, обычно дешевле один раз донастроить его на этапе разработки интернет-магазина под ключ, чем потом разбирать чужую конфигурацию по кускам.
1С-Битрикс регулярно обновляется, поэтому перед внедрением я сверяюсь с актуальной документацией.
Частые вопросы
Почему поиск на сайте на Битриксе работает медленно на большом каталоге?
Индекс растёт вместе с каталогом, а полнотекстовый поиск через MySQL не рассчитан на десятки тысяч позиций с большим числом свойств. Обычно тормозит не сам механизм поиска, а сочетание избыточного числа индексируемых полей и проверки прав доступа при каждом запросе. Первый шаг: сократить набор индексируемых свойств до тех, что реально нужны в выдаче.
Нужно ли подключать отдельный модуль морфологии?
Нет, морфологический разбор словоформ входит в стандартный поиск и работает без дополнительных платных модулей. Отдельно нужно только верно указать язык морфологии в свойствах сайта, особенно если у сайта несколько языковых версий.
Как исключить конкретный товар или раздел из поиска?
Снять галочку «Показывать на сайте» у элемента или отключить индексацию для раздела инфоблока в его настройках, а затем перезапустить переиндексацию. Пока переиндексация не выполнена, старая запись останется в индексе даже после изменения флага.
Почему поиск находит товар со старой ценой после её изменения?
Чаще всего дело в кэше компонента поиска или композитном кэше страницы: он живёт до истечения заданного времени и отдаёт прежнюю выдачу. Нужно сбросить кэш вручную в админке, а если менялась не только цена, а сама структура данных, дополнительно запустить переиндексацию.