Перейти к содержимому

Поиск по сайту в 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 не срабатывают автоматически.

Связанные темы

Первоисточники