Тюним поиск Битрикс по API

  • Тюним поиск Битрикс по API

    Антон Долганин 5 Октября 2015 14:34 18908
    Пост коснется исопльзования 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 нужных элементов
    }


    Но вас поджидает сюрприз - найдены могут быть не все результаты. Точнее даже как, не найдя "девушек", поиск не выдаст ничего. Дело в том, что при включенной морфологии, штатный компонент поиска обладает вот такой интересной настройкой:

    scr.png

    Поэтому, для поиска вообще всего делаем такой хитрый финт:
    $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 нужных элементов
    }
    


    Собственно, все. При желании, вы можете сделать не взаимоисключающие запросы,  а дополняющие. Но не забывайте, что поиск сам по себе достаточно нагрузочное действо.
Алексей
5 Октября 2015 15:05
not bad
Мимо проходил
14 Октября 2015 18:07
Вы что ли код компонента открыли?
Богдан
14 Марта 2017 22:04
Большое спасибо за решение очень помогло
Павел
3 Мая 2017 12:23
поиск не нагрузочное действо если это не битрикс поиск
Михаил
2 Августа 2018 19:59
Спасибо огромное!
Сергей
11 Февраля 2019 17:04
Антон, добрый вечер!

вопрос, каждый вызов
$obSearch->fetch()
порождает отдельный запрос к БД?
и если найдено много записей, то в итоге будет куча запросов.  Об этом говорит количество запросов в режиме отладки.
Или я что-то не так понимаю?  :)
Антон Долганин
12 Февраля 2019 19:44
Здравствуйте, Сергей.

А на основании чего такие выводы?
Об этом говорит количество запросов в режиме отладки.

Какие, например, запросы падают в отладку? Может висит какой-то обработчик на поиске?