Документация для разработчиков
Темная тема

Search

Описание и параметры

void CSearch::Search(
	array arParams,
	array aSort = array(),
	array aParamsEx = array(),
	bool bTagsCloud = false
);

Метод инициализирует выборку данных. Нестатический метод.

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

Параметры метода

Параметр Описание С версии
arParams Массив, содержащий условия поиска в виде наборов "название поля"=>"значение".

Название поля может принимать значение:
  • QUERY - Строка запроса. Обязательный элемент. Должна быть сформирована в соответствии с правилами языка запросов.
  • TAGS - Список тегов. В результате поиска будут возвращены все элементы имеющие данные теги.
  • SITE_ID - Сайт, в информации которого производится поиск. Не обязательный параметр, по умолчанию равен текущему.
  • MODULE_ID - Код модуля, данными которого ограничивается поиск. Если этот параметр равен false, то поиск производится по всем модулям. Не обязательный параметр, по умолчанию равен false.
  • ITEM_ID - Код проиндексированного элемента. Используется для ограничения области поиска по коду элемента. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false.
  • PARAM1 - Первый параметр элемента или массив первых параметров. Используется для ограничения области поиска по произвольному параметру. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false.
  • PARAM2 - Второй параметр элемента или массив вторых параметров. Используется для ограничения области поиска по произвольному параметру. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false.
  • URL - маска адреса относительно корня сайта, по которому доступен данный элемент или массив масок адресов;
  • DATE_CHANGE - время изменения элемента в формате сайта (включает время);
  • CHECK_DATES - если задан и равен Y, то найдены будут только активные элементы;
aSort Массив, содержащий признак сортировки в виде наборов "название поля"=>"направление".

Название поля может принимать значение:
  • ID - идентификатор в поисковом индексе;
  • MODULE_ID - идентификатор модуля;
  • ITEM_ID - идентификатор элемента поискового индекса (например для форума это идентификатор сообщения);
  • TITLE - заголовок;
  • PARAM1 - Первый параметр элемента или массив первых параметров. Используется для ограничения области поиска по произвольному параметру. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false.
  • PARAM2 - Второй параметр элемента или массив вторых параметров. Используется для ограничения области поиска по произвольному параметру. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false.
  • DATE_FROM - дата начала активности элемента;
  • DATE_TO - дата окончания активности элемента;
  • RANK - вычисленное значение релевантности;
  • TITLE_RANK - количество вхождений подстрок запроса в заголовок. Позволяет повысить значимость заголовка в результатах поиска;
  • CUSTOM_RANK - заданное значение релевантности;
  • DATE_CHANGE - время изменения элемента;
Направление сортировки может принимать значение:
  • ASC - по возрастанию;
  • DESC - по убыванию.
Пример (именно это значение считается по умолчанию):
array("CUSTOM_RANK"=>"DESC", "RANK"=>"DESC", "DATE_CHANGE"=>"DESC")
В случае когда параметр bTagsCloud равен true, допустимыми полями являются:
  • DATE_CHANGE - время изменения элемента;
  • NAME - значение тег;
  • CNT - частота тега;
4.0.10
aParamsEx Массив массивов, содержащий дополнительные условия поиска в виде наборов "название поля"=>"значение". Эти условия будут объединены по условию ИЛИ. Смотри описание параметра arParams.

Так же может содержать элемент:
  • STEMMING - Если равно true, то при поиске будет учитываться морфология. Если false, то не будет. Если не задано, то будет использоваться настройка модуля;
Пример сложного условия:
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] => Адрес относительно корня сайта, по которому доступен данный элемент (с заменой специальных символов <, >, " на &lt;, &gt;, &quot;)
	[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);


Пользовательские комментарии

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

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Олег Постоев
Для поиска по полному вхождению фразу надо заключить в двойные кавычки. `=QUERY` в параметрах поиска не работает, как это устроено в аналогичных методах работы с инфоблоками.
1
Руслан Мухамедьяров
Внимание!
У этого метода нет возможности фильтровать как в методе GetList!!!
Этот метод используется в компоненте search.page, а search.page используется в компоненте news.
И если мы используем при вызове news фильтрацию через переменную $arrFilter, то данные в search.page не фильтруются!!!
Т.е. если мы в компоненте news ограничили вывод каких-то элементов, то в поиске эти элементы будут выведены в результатах поиска!!!
Что весьма и весьма странно и выглядит как баг.
9
Антон Долганин
Не стоит забывать о такой особенности поиска:
http://blog.d-it.ru/dev/tunim-search-bitrix-api/
5
Александр Андрианов
PARAM1 и PARAM1 используются для сужения области поиска.

Для каждого модуля значение этих параметров разное.

Для модуля инфоблоков:
PARAM1 - тип инфоблока.
PARAM2 - ID инфоблока.

Пример вызова:
Код
 <?

if (CModule::IncludeModule('search'))

{

$q = "выставка";

$module_id = "iblock";

$param1='news';

$param2=33;

$obSearch = new CSearch($q,'ru', $module_id,false,$param1,$param2);

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><br>

    <?echo $arResult["BODY_FORMATED"]?><br>

    <hr size="1" color="#DFDFDF">

<?

}

endif;

?>
Поиск будет осуществляться в инфоблоке, который имеет тип "news" и код 33.
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх