Пост коснется исопльзования API модуля поиска, и кое-каких его нюансов.
Зачем вообще может потребоваться обращение к поиску по API? Задача гораздо более частая, чем кажется. Ну к примеру, как найти все новости по запросу "дев"? Чтобы не только "дев-сервер", но и "девушки". Оптимальнее всего это отдать штатному модулю поиска. Делается это просто:
$obSearch = new CSearch;
$obSearch->Search(array(//при желании, фильтр можете еще сузить, см.документацию
'QUERY' => $query,
'SITE_ID' => SITE_ID,
'MODULE_ID' => 'iblock',
'PARAM2' => $iblock
));
while ($row = $obSearch->fetch()) {
//в $row['ITEM_ID'] у вас будут выводиться ID нужных элементов
}
Но вас поджидает сюрприз - найдены могут быть не все результаты. Точнее даже как, не найдя "девушек", поиск не выдаст ничего. Дело в том, что при включенной морфологии, штатный компонент поиска обладает вот такой интересной настройкой:
Поэтому, для поиска вообще всего делаем такой хитрый финт:
$obSearch = new CSearch;
$obSearch->SetOptions(array(//мы добавили еще этот параметр, чтобы не ругался на форматирование запроса
'ERROR_ON_EMPTY_STEM' => false,
));
$obSearch->Search(array(
'QUERY' => $filter['QUERY'],
'SITE_ID' => SITE_ID,
'MODULE_ID' => 'iblock',
'PARAM2' => $iblock
));
if (!$obSearch->selectedRowsCount()) {//и делаем резапрос, если не найдено с морфологией...
$obSearch->Search(array(
'QUERY' => $filter['QUERY'],
'SITE_ID' => SITE_ID,
'MODULE_ID' => 'iblock',
'PARAM2' => $iblock
), array(), array('STEMMING' => false));//... уже с отключенной морфологией
}
while ($row = $obSearch->fetch()) {
//в $row['ITEM_ID'] у вас будут выводиться ID нужных элементов
}
Собственно, все. При желании, вы можете сделать не взаимоисключающие запросы, а дополняющие. Но не забывайте, что поиск сам по себе достаточно нагрузочное действо.
порождает отдельный запрос к БД?
и если найдено много записей, то в итоге будет куча запросов. Об этом говорит количество запросов в режиме отладки.
Или я что-то не так понимаю?
вопрос, каждый вызов
и если найдено много записей, то в итоге будет куча запросов. Об этом говорит количество запросов в режиме отладки.
Или я что-то не так понимаю?
А на основании чего такие выводы?
Какие, например, запросы падают в отладку? Может висит какой-то обработчик на поиске?