Поиск по товарам - индексация, вывод, ограничение по каталогу
Включаем поиск по каталогу, строим индекс и ограничиваем выдачу товарами, а не всем содержимым сайта.
Решение
Проверяем, что модуль поиска подключён и индекс не пуст:
use Bitrix\Main\Loader;
Loader::includeModule('search');$res = CSearch::Search(['QUERY' => 'кресло', 'MODULE_ID' => 'iblock']);printf("найдено %d\n", $res->SelectedRowsCount());Пустой результат при заведомо существующем товаре означает, что индекс ещё не построен. Поиск работает только по своему индексу и в инфоблок за данными не ходит ни при каких настройках компонента.
Выводим форму поиска и страницу результатов:
// форма: обычно в шапке шаблона сайта$APPLICATION->IncludeComponent('bitrix:search.form', '', [ 'PAGE' => '/search/index.php',]);// выдача: на самой странице результатов$APPLICATION->IncludeComponent('bitrix:search.page', '', [ 'RESTART' => 'Y', // без этого выдача обрывается на первой странице 'CHECK_DATES' => 'Y', 'PAGE_RESULT_COUNT' => 20,]);Это два разных компонента, и адрес страницы результатов задаётся в форме. Форма без верного адреса отправляет запрос в никуда, и посетитель видит страницу 404 вместо выдачи.
Ограничиваем выдачу товарами каталога:
'arrFILTER' => ['iblock_catalog'], // только инфоблоки типа catalog'arrFILTER_iblock_catalog' => [5], // и только этот инфоблок'SHOW_WHERE' => 'N',Без фильтра в выдачу попадают новости, страницы разделов и сообщения форума. Поиск индексирует всё, что на сайте объявили индексируемым, и по умолчанию отдаёт это одним общим списком без разделения по разделам.
Перестраиваем индекс после массовой выгрузки:
# переиндексация идёт шагами: агент добирает остаток при следующем запускеphp -d memory_limit=1G /home/bitrix/www/bitrix/modules/search/tools/reindex.phpВыгрузка из 1С добавляет товары в базу мимо интерфейса, и часть из них в индекс не попадает. После крупного обмена индекс перестраивают целиком, иначе поиск показывает вчерашний каталог.
Отмечаем свойства, которые должны попадать в индекс:
$prop = new CIBlockProperty();$prop->Update($propertyId, [ 'SEARCHABLE' => 'Y', // артикул и бренд без этого флага в индекс не идут]);// после смены флага индекс перестраивают: старые записи он не пересчитывает самСвойства товара индексируются по отдельному флагу. По умолчанию в индекс идут только название и описание элемента, а артикул, бренд и характеристики остаются вне его. Поэтому поиск по артикулу почти всегда не работает до тех пор, пока свойство не отмечено как участвующее в поиске, а индекс не перестроен заново.
Индексация на живом каталоге стоит заметных ресурсов. Каждое сохранение элемента дописывает индекс, и на массовых операциях это ощутимо замедляет обмен. Поэтому на время крупной выгрузки индексацию на лету отключают, а индекс перестраивают одним проходом после неё.
Типичные проблемы
Поиск не находит существующий товар.
Товар не попал в индекс. Поиск ищет по своему индексу, а не по инфоблоку, и новые элементы появляются в нём только после индексации.
Поиск по артикулу не работает.
Свойство с артикулом не отмечено как индексируемое. В индекс по умолчанию идут только название и описание элемента.
В выдаче каталога появляются новости.
Не задан фильтр по модулю и инфоблоку. Поиск отдаёт всё индексируемое содержимое сайта одним списком.
После выгрузки из 1С поиск отстаёт от каталога.
Массовое изменение элементов не индексируется на лету. Индекс перестраивают отдельной процедурой после обмена.
Переиндексация обрывается на середине.
Процесс упирается в предел памяти или времени выполнения. Индексация идёт шагами, и остаток добирается при следующем запуске.
Частые вопросы
Чем поиск отличается от умного фильтра?
Фильтр выбирает товары по значениям свойств прямо из инфоблока. Поиск работает по текстовому индексу и находит совпадения в названии и описании, а не точные значения.
Можно ли искать по словоформам?
Да, штатный поиск приводит слова к основе и находит другие формы. Точность на технических названиях и артикулах при этом падает.
Нужен ли внешний поисковый движок?
На каталоге в сотни тысяч позиций штатный индекс становится тяжёлым, и его выносят во внешний движок. До этого объёма выигрыш от замены обычно не окупает поддержку.
Как сделать поиск только по одному разделу?
Ограничением по инфоблоку и разделу в параметрах выдачи. Раздел передаётся вместе с инфоблоком: без него фильтр действует на весь каталог.
Смежное
- Каталог товаров - оглавление подтемы
- Витрина каталога: список раздела, сортировка, фильтр - выборка товаров без поиска
- Живой поиск с подсказками: выдача, доступность, подстроки - подсказки в строке поиска магазина
- Сервер и поиск - устройство модуля поиска
- Каталог и продажи - устройство магазина целиком
- Поиск не находит товары: индекс, переиндексация, выдача - разбор, когда товар не находится
- Настройка поиска по сайту: состав индекса, морфология, подсказки - настройки на уровне сайта
- Внешний поисковый движок: индекс, запрос, синхронизация - следующий шаг для большого каталога