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

Настройка поиска по сайту - что индексировать, морфология, подсказки

Настраиваем штатный поиск так, чтобы он находил товары по артикулу и в разных падежах, и понимаем, где заканчиваются его возможности.

Решение

Выбираем, что попадает в индекс:

\Bitrix\Main\Loader::includeModule('search');
$res = CSearch::GetList([], ['MODULE_ID' => 'iblock'], ['MODULE_ID', 'PARAM2']);
while ($row = $res->Fetch()) {
printf("инфоблок %s\n", $row['PARAM2']);
}
// инфоблока нет в списке - его содержимое поиску просто не видно

В индекс попадает только то, что отмечено в настройках инфоблока. Свойства - отдельно: артикул и характеристики индексируются, лишь когда у свойства включён соответствующий признак.

Включаем морфологию:

- модуль поиска с морфологией для русского языка включается в настройках
- без него запрос «телефоны» не находит страницу со словом «телефон»
- поиск по части слова настраивается отдельно и стоит дороже по нагрузке

Без морфологии поиск сравнивает слова как строки. Покупатель, набравший запрос в другом падеже, получает пустую выдачу, и объясняет это себе отсутствием товара, а не настройками сайта.

Собираем подсказки из запросов:

$res = CSearchStatistic::GetList(['CNT' => 'DESC'], ['>CNT' => 3],
['PHRASE', 'CNT', 'CNT_RESULT']);
while ($row = $res->Fetch()) {
printf("%s: %s запросов, %s результатов\n", $row['PHRASE'], $row['CNT'], $row['CNT_RESULT']);
}
// запросы с нулём результатов - готовый список того, чего не хватает каталогу

Статистика запросов полезнее самих подсказок. Частый запрос с пустой выдачей означает либо отсутствующий товар, либо название, которого нет в карточке, и оба случая стоят внимания.

Держим индекс свежим:

$step = CSearch::ReIndexAll(false, 30, ['MODULE_ID' => 'iblock']);
printf("проиндексировано записей: %s\n", $step);
// полная переиндексация большого каталога идёт часами и ставится по расписанию

Переиндексацию ставят порциями по расписанию, а не запускают руками после каждого обмена. Полный проход по большому каталогу занимает часы, и в рабочее время он заметно мешает сайту.

Выдача учитывает права на страницы и элементы. Администратор, проверяющий поиск под собой, видит не то же самое, что покупатель, и проверять стоит из неавторизованного окна браузера.

Штатный поиск не рассчитан на опечатки и синонимы. Если покупатели ищут по неточным названиям, дешевле подключить внешний поисковый движок, чем добиваться этого от встроенного.

Поиск стоит проверять на настоящих запросах из статистики, а не на придуманных. Разработчик ищет «телефон», а покупатель - «зарядка для айфона 12 оригинал», и результаты у этих запросов разные.

Ожидания от штатного поиска стоит проговорить до работы. Он ищет по словам в индексе и делает это честно, но не угадывает опечатки и не понимает, что «зарядка» и «блок питания» - про одно и то же.

Типичные проблемы

Поиск не находит товар по артикулу.

Свойство с артикулом не отмечено как индексируемое в настройках инфоблока. После правки этих настроек весь инфоблок переиндексируют заново и полностью целиком.

Запрос в другом падеже не даёт результатов.

Морфология для русского языка не включена в настройках модуля поиска. Без морфологии слова сравниваются просто как обычные строки из отдельных символов.

Покупатель не находит то, что видит администратор.

Выдача учитывает права и на страницы, и на отдельные элементы самого каталога. Проверять поиск нужно из неавторизованного окна браузера, а не из своего рабочего.

После обмена поиск отдаёт старые названия.

Индекс не обновился, потому что правки пришли мимо интерфейса. Переиндексацию ставят порциями и по расписанию, а не запускают её каждый раз руками.

Поиск заметно замедляет сайт.

Полная переиндексация идёт в рабочее время и целиком. Её переносят на ночное время и режут всю эту работу на порции.

Частые вопросы

Что вообще стоит индексировать?

Название, артикул и те свойства, по которым ищут покупатели. Описание целиком чаще мешает, чем помогает.

Как узнать, что ищут на сайте?

По статистике поисковых запросов с числом результатов. Запросы с нулём результатов - самое полезное в ней.

Нужен ли поиск по части слова?

Полезен для артикулов и кодов, но заметно нагружает базу. Включают его точечно, а не для всего.

Когда переходить на внешний движок?

Когда важны опечатки, синонимы и подсказки на большом каталоге. Штатный поиск на это не рассчитан.

Смежное

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