Поиск по сайту в 1С-Битрикс - индекс, морфология, бэкенды
Модуль поиска решает две задачи: строит индекс из всех источников контента и обслуживает запросы посетителей. Разберём, что попадает в индекс, какие бывают бэкенды и почему после почти любого изменения нужна переиндексация.
Как это работает
Что индексируется. Статические страницы, для которых задан заголовок, элементы и разделы инфоблоков при включённых опциях индексации, блоги, форумы и опросы, учебные курсы и социальная сеть. Последняя переиндексируется отдельно, из публичной части в режиме правки.
Бэкенд выбирается в настройках модуля. Встроенный работает по таблицам базы. Sphinx подключается внешним демоном. Есть также вариант полнотекстового поиска средствами самой базы и распределённый вариант для больших объёмов. После смены бэкенда и сохранения настроек обязательна полная переиндексация.
Морфология - ключевая особенность встроенного поиска. Он находит слово во всех формах: падежах и числе. Для этого слова приводятся к основе и хранятся в отдельных таблицах индекса. Морфология работает для всех установленных в системе языков, и отключать её не рекомендуется.
Рейтинги - отдельный модуль, который добавляет к контенту оценки и голоса пользователей.
Примеры
1. Страница поиска
$APPLICATION->IncludeComponent('bitrix:search.page', '', [ 'RESTART' => 'N', 'CHECK_DATES' => 'Y', 'USE_TITLE_RANK' => 'Y', 'SHOW_WHERE' => 'Y', 'PAGE_RESULT_COUNT' => 20,]);Рядом обычно ставят компонент строки поиска в шапке сайта и компонент подсказок для выпадающих результатов.
Учтите: компонент страницы поиска относится к тем, что по умолчанию несовместимы с композитным кешем - страницу поиска обычно исключают из композита.
2. Индексация своих данных
Свои сущности попадают в поиск через событие индексации: обработчик отдаёт платформе структуру документа - заголовок, тело, дату, права доступа и адрес. Так в общий поиск включают данные из собственных модулей и таблиц.
Тонкость обработчика: массив полей приходит по значению, поэтому изменения нужно возвращать из обработчика, а не менять по ссылке.
3. Когда переиндексировать
- После первого включения индексации у инфоблока.
- После смены бэкенда поиска.
- После массовой загрузки или обмена, если индексация была отключена.
- После изменения состава индексируемых источников.
Частичная индексация идёт по расписанию и покрывает текущие изменения, но не восполняет пропущенное.
Справочник
| Элемент | Назначение | Особенности |
|---|---|---|
| Индекс | служебные таблицы с текстами | строится и обновляется отдельно от данных |
| Встроенный бэкенд | поиск по таблицам базы | морфология из коробки |
| Sphinx | внешний демон поиска | снимает нагрузку с базы |
| Полнотекстовый поиск базы | вариант без внешнего демона | требует ручной настройки |
| Распределённый вариант | для больших объёмов | |
| Морфология и основы слов | поиск по всем формам слова | отключать не рекомендуется |
| Событие индексации | включение своих данных в поиск | поля приходят по значению |
bitrix:search.page | страница результатов | несовместим с композитом по умолчанию |
bitrix:search.title | строка поиска с подсказками | |
| Модуль рейтингов | оценки и голоса пользователей | отдельный модуль |
Частые ошибки
Поиск не находит свежий контент. Индексация у инфоблока не включена либо не выполнялась переиндексация после включения.
После смены бэкенда результаты пустые. Обязательная полная переиндексация не запущена.
После обмена с 1С часть товаров не ищется. При массовой загрузке индексация часто отключается ради скорости - после обмена её нужно догнать.
Удалённые элементы остаются в результатах. При удалении через ORM поисковый индекс не обновляется автоматически - его чистят явно.
Композит отключается на всём сайте. Компонент страницы поиска голосует против композита - его страницу исключают отдельно, а не отказываются от композита целиком.
Отключают морфологию ради скорости. Поиск начинает находить только точные формы слов, и качество выдачи падает заметнее, чем растёт скорость.
Частые вопросы
Когда нужна полная переиндексация?
После включения индексации у нового источника, после смены бэкенда поиска, после массовых загрузок с отключённой индексацией и после изменения состава индексируемых данных. Текущие правки покрывает частичная индексация по расписанию, но пропущенное она не восполняет - именно поэтому «поиск не находит новые товары» почти всегда лечится переиндексацией.
Когда переходить на Sphinx или другой внешний бэкенд?
Когда встроенный поиск начинает заметно нагружать базу или отвечать медленно - обычно на больших каталогах и контентных проектах. Внешний демон снимает нагрузку с базы и быстрее ищет. Помните про обязательную полную переиндексацию после переключения и про то, что бэкенд нужно сопровождать: это ещё один сервис в инфраструктуре.
Как включить в поиск данные собственного модуля?
Через событие индексации: обработчик отдаёт платформе документ с заголовком, телом, датой, правами доступа и адресом. После этого ваши сущности участвуют в общей выдаче наравне со штатными. Обратите внимание на деталь реализации - массив полей приходит по значению, поэтому изменённые данные нужно возвращать из обработчика.
Почему после удаления элемента он всё ещё в поиске?
Потому что поисковый индекс живёт отдельно от данных, и при удалении через объектное API он не обновляется сам. Нужно явно обновить индекс для удалённого элемента. Это частный случай общего правила: механизмы старого ядра при работе через ORM не срабатывают автоматически.
Связанные темы
- Инфоблоки - индексация элементов и разделов
- Сервер и поиск - подключение Sphinx
- Композит: эксплуатация - несовместимые компоненты
- Поиск по товарам: индексация, вывод, ограничение по каталогу - поисковый индекс на каталоге
- Раздел Модули
- Поиск по сайту на практике: индекс, настройка, выдача - работа с индексом поиска