1 Произвольные ключи в индекс добавляются.
function BeforeIndexHandler($arFields)
{
if($arFields["MODULE_ID"] == "iblock")
{
if(array_key_exists("BODY", $arFields) && substr($arFields["ITEM_ID"], 0, 1) != "S")
{
$arFields["BODY"] = "";
if (CModule::IncludeModule('iblock'))
{
$rs = CIBlockElement::GetByID( intval($arFields['ITEM_ID']) );
if ($ar = $rs->Fetch())
{
$arFields['PARAMS']["CODE"] = $ar['CODE'];
}
}
}
if (substr($arFields["ITEM_ID"], 0, 1) == "S")
{
$arFields['TITLE'] = "";
$arFields["BODY"] = "";
$arFields['TAGS'] = "";
}
}
return $arFields;
}
Поиск по куче индексов тоже будет увеличивать время и вероятнее всего гораздо сильнее, потому что там не будет limit - это раз.
public static function beforeIndexHandler($arFields) {
if ($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == IB_NEWS_EVENTS && substr($arFields["ITEM_ID"], 0, 1) != "S") {
$self = new static();
$element = $self->getElement($arFields["ITEM_ID"]);
$arFields["PARAMS"]["type"] = $element->PROPERTY_TYPE_ENUM_ID;
}
return $arFields;
}
$arResult["SEARCH"] => array(
0 => array (
.......
"CUSTOM_KEY" => "CUSTOM_VALUE"
)
)
public static function beforeIndexHandler($arFields) {
if ($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == IB_NEWS_EVENTS && substr($arFields["ITEM_ID"], 0, 1) != "S") {
$arFields["CUSTOM_KEY"] = "CUSTOM_VALUE";
}
return $arFields;
}
/**
* @param $category
* @return array
*/
public function getCategoryParams($category) {
if ($category == 'news') {
return [
'MODULE_ID' => 'iblock',
'PARAM2' => IB_NEWS_EVENTS,
"PARAMS" => ['type' => NEWS_TYPE_NEWS],
];
} elseif ($category == 'events') {
return [
'MODULE_ID' => 'iblock',
'PARAM2' => IB_NEWS_EVENTS,
"PARAMS" => ['type' => NEWS_TYPE_EVENTS],
];
} elseif ($category == 'catalog') {
return [
'MODULE_ID' => 'iblock',
'PARAM2' => IB_CATALOG,
];
} elseif ($category == 'site') {
return [
'MODULE_ID' => 'main'
];
}
return [];
}
/**
* @param $query
* @param bool $category
* @return int
*/
public function count($query, $category = false) {
$bxSearch = new CSearch();
$params = [
"QUERY" => $query,
"SITE_ID" => LANG,
];
if ($category !== false) {
$params = array_merge($params, $this->getCategoryParams($category));
}
$bxSearch->Search($params, [], [
'STEMMING' => false
]);
$bxSearch->NavStart();
return $bxSearch->NavRecordCount;
}
Ну так вы же добавите (уже добавили) его в индекс и тогда будет что фильтровать.
function BeforeIndexHandler($arFields)
{
if($arFields["MODULE_ID"] == "iblock")
{
if(array_key_exists("BODY", $arFields) && substr($arFields["ITEM_ID"], 0, 1) != "S")
{
$arFields["BODY"] = "";
if (CModule::IncludeModule('iblock'))
{
$rs = CIBlockElement::GetByID(intval($arFields['ITEM_ID']));
if ($ar = $rs->Fetch())
{
$arFields["SECTION_ID"] = $ar["IBLOCK_SECTION_ID"];
}
}
}
/*if (substr($arFields["ITEM_ID"], 0, 1) == "S")
{
$arFields['TITLE'] = "";
$arFields["BODY"] = "";
$arFields['TAGS'] = "";
}*/
//die(print_r($arFields));
}
return $arFields;
}
[
"QUERY" => Поисковй запрос,
"SITE_ID" => Id сайта,
"PARAMS" => [SECTION_ID => id раздела]
];
$GLOBALS["arrFilterSearch"] = array(
"LOGIC" => "OR",
"PARAMS" => array(
"!SECTION_ID" => array_merge($GLOBALS["arProfile"]["UF_NEWS_SECTION"], $GLOBALS["arProfile"]["UF_VIDEO_SECTION"])
)
);