Search
Описание и параметры
void CSearch::Search( array arParams, array aSort = array(), array aParamsEx = array(), bool bTagsCloud = false );
Метод инициализирует выборку данных. Нестатический метод.
Перед выполнением поисковых запросов вызывается событие OnSearch.
Параметры метода
Параметр | Описание | С версии |
---|---|---|
arParams | Массив, содержащий условия поиска в виде наборов "название поля"=>"значение".
Название поля может принимать значение:
| |
aSort | Массив, содержащий признак сортировки в виде наборов "название поля"=>"направление".
Название поля может принимать значение:
array("CUSTOM_RANK"=>"DESC", "RANK"=>"DESC", "DATE_CHANGE"=>"DESC")В случае когда параметр bTagsCloud равен true, допустимыми полями являются:
| 4.0.10 |
aParamsEx | Массив массивов, содержащий дополнительные условия поиска в виде наборов "название поля"=>"значение". Эти условия будут объединены по условию ИЛИ. Смотри описание параметра arParams.
Так же может содержать элемент:
array( array( "MODULE_ID" => "forum", "PARAM1" => array(1, 2), ), array( "MODULE_ID" => "iblock", "PARAM2" => 3, ), )В данном случае поиск будет осуществляться в форумах с идентификаторами 1 и 2, а также в инфоблоке с идентификатором 3. | 4.0.10 |
bTagsCloud | Признак построения облака тегов. Если задан и равен true, то будет построено облако тегов. | 6.5.0 |
Расширение фильтров
С версии модуля 7.1.2 в параметрах arParams и arParamsEx появилась возможность использовать модификаторы ключей и сложную логику фильтров.Ключи поддерживающие модификаторы:
- MODULE_ID
- ITEM_ID
- PARAM1
- PARAM2
- SITE_ID
- DATE_CHANGE
- DATE_FROM
- DATE_TO
- SITE_URL
Модификаторы:
Модификатор | Пример | Описание |
= | "=MODULE_ID" => "iblock" | Выборка точного соответствия |
% | "%ITEM_ID" => "my" | Регистронезависимый поиск по подстроке |
? | "?PARAM1" => "forum|iblock" | Использование в фильтре сложной логики |
>, <, >=, <= | ">=PARAM1" => "44" | Выборка с использованием оператора |
>< | "><PARAM2" => array(10, 20) | Выборка значений диапазона |
Модификатор может предваряться символом "!", тогда условие будет отрицительным. Если присутствует ключ "LOGIC" и он имеет значение "OR", то условия объединяются логическим ИЛИ. Так же массивы ключей могут иметь вложенность.
Пример сложного фильтра:
//Поиск только среди элементов инфоблоков за исключением разделов и инфоблоков с ID 3, 5 и 7 и сообщений форума не старше одних суток. array( "LOGIC" => "OR", array( "=MODULE_ID" => "iblock", "!ITEM_ID" => "S%", "!=PARAM2" => array(3,5,7), ), array( "=MODULE_ID" => "forum", ">=DATE_CHANGE" => ConvertTimeStamp(time()-24*60*60, "FULL"), ) )
Возвращаемое значение
Ничего не возвращает.
Array( [ID] => Код индекса [DATE_CHANGE] => Дата изменения проиндексированного элемента [MODULE_ID] => Модуль, которому принадлежит проиндексированный элемент [ITEM_ID] => Код проиндексированного элемента [LID] => Языковое зеркало (язык) сайта [URL] => Адрес относительно корня сайта, по которому доступен данный элемент (с заменой специальных символов <, >, " на <, >, ") [TITLE] => Заголовок проиндексированного элемента (с заменой спец. символов) [SEARCHABLE_CONTENT] => Индекс элемента, по которому идет поиск (с заменой спец. символов) [PARAM1] => Первый параметр элемента [PARAM2] => Второй параметр элемента [~URL] => Адрес относительно корня сайта, по которому доступен данный элемент [~TITLE] => Заголовок проиндексированного элемента [~SEARCHABLE_CONTENT] => Индекс элемента, по которому идет поиск [TITLE_FORMATED] => Заголовок проиндексированного элемента с выделением искомых слов [BODY_FORMATED] => Часть текста проиндексированного элемента с выделением искомых слов [BODY_FORMATED_TYPE] => Идентификатор формата текста [URL_WO_PARAMS] => Адрес элемента без параметров добавленных в обработчиках события OnSearch. )
Если задано построение облака тегов, то:
Array( [NAME] => тег [CNT] => частота [DATE_CHANGE] => Максимальная дата изменения элемента имеющего данный тег [FULL_DATE_CHANGE] => Дата изменения элемента включая время. )
Примеры использования
Пример №1: поиск в форумах текущего сайта указанной строки:
<? $q = "жареная рыба или селедка"; $module_id = "forum"; $obSearch = new CSearch; $obSearch->Search(array( "QUERY" => $q, "SITE_ID" => LANG, "MODULE_ID" => $module_id, )); if ($obSearch->errorno!=0): ?> <font class="text">В поисковой фразе обнаружена ошибка:</font> <?echo ShowError($obSearch->error);?> <font class="text">Исправьте поисковую фразу и повторите поиск.</font> <? else: while($arResult = $obSearch->GetNext()) {?> <a href="<?echo $arResult["URL"]?>"><?echo $arResult["TITLE_FORMATED"]?></a> <?echo $arResult["BODY_FORMATED"]?> <hr size="1" color="#DFDFDF"> <?} endif; ?>
Пример №2: чтобы при обращении к модулю поиска поисковая фраза проиндексировалась в статистике Поиска, нужно обязательно вызвать NavStart():
$obSearch = new CSearch; $obSearch->Search(array( 'QUERY' => $_REQUEST['q'], 'SITE_ID' => LANG, 'MODULE_ID' => 'iblock', )); $obSearch->NavStart(); while ($arSearch = $obSearch->Fetch()) { echo($arSearch); }
Примечание: такой вызов NavStart() породит дополнительный PAGEN_. Если он мешает, то можно заменить NavStart на такую конструкцию:
$obSearch->Statistic = new CSearchStatistic($obSearch->strQueryText, $obSearch->strTagsText); $obSearch->Statistic->PhraseStat($obSearch->NavRecordCount, $obSearch->NavPageNomer);
Олег Постоев
|
Для поиска по полному вхождению фразу надо заключить в двойные кавычки. `=QUERY` в параметрах поиска не работает, как это устроено в аналогичных методах работы с инфоблоками.
|
Руслан Мухамедьяров
|
Внимание!
У этого метода нет возможности фильтровать как в методе GetList!!! Этот метод используется в компоненте search.page, а search.page используется в компоненте news. И если мы используем при вызове news фильтрацию через переменную $arrFilter, то данные в search.page не фильтруются!!! Т.е. если мы в компоненте news ограничили вывод каких-то элементов, то в поиске эти элементы будут выведены в результатах поиска!!! Что весьма и весьма странно и выглядит как баг. |
Антон Долганин
|
Не стоит забывать о такой особенности поиска:
|
Александр Андрианов
|
||
PARAM1 и PARAM1 используются для сужения области поиска.
Для каждого модуля значение этих параметров разное. Для модуля инфоблоков: PARAM1 - тип инфоблока. PARAM2 - ID инфоблока. Пример вызова:
| ||
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.