• Модуль: search
  • Путь к файлу: ~/bitrix/modules/search/classes/general/search.php
  • Класс: CAllSearch
  • Вызов: CAllSearch::ReIndexAll
static function ReIndexAll($bFull = false, $max_execution_time = 0, $NS = Array(), $clear_suggest = false)
{
	global $APPLICATION;
	$DB = CDatabase::GetModuleConnection('search');

	@set_time_limit(0);
	if (!is_array($NS))
		$NS = Array();
	if ($max_execution_time <= 0)
	{
		$NS_OLD = $NS;
		$NS = Array("CLEAR" => "N", "MODULE" => "", "ID" => "", "SESS_ID" => md5(uniqid("")));
		if ($NS_OLD["SITE_ID"] != "") $NS["SITE_ID"] = $NS_OLD["SITE_ID"];
		if ($NS_OLD["MODULE_ID"] != "") $NS["MODULE_ID"] = $NS_OLD["MODULE_ID"];
	}
	$NS["CNT"] = intval($NS["CNT"]);
	if (!$bFull && mb_strlen($NS["SESS_ID"]) != 32)
		$NS["SESS_ID"] = md5(uniqid(""));

	$p1 = getmicrotime();

	$DB->StartTransaction();
	CSearch::ReindexLock();

	if ($NS["CLEAR"] != "Y")
	{
		if ($bFull)
		{
			foreach (GetModuleEvents("search", "OnBeforeFullReindexClear", true) as $arEvent)
				ExecuteModuleEventEx($arEvent);

			CSearchTags::CleanCache();
			$DB->Query("TRUNCATE TABLE b_search_content_param", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_site", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_right", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_title", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_tags", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_freq", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_suggest", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_user_right", false, "File: ".__FILE__."
Line: ".__LINE__); CSearchFullText::getInstance()->truncate(); COption::SetOptionString("search", "full_reindex_required", "N"); } elseif ($clear_suggest) { $DB->Query("TRUNCATE TABLE b_search_suggest", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_user_right", false, "File: ".__FILE__."
Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_freq", false, "File: ".__FILE__."
Line: ".__LINE__); } } $NS["CLEAR"] = "Y"; clearstatcache(); if ( ($NS["MODULE"] == "" || $NS["MODULE"] == "main") && ($NS["MODULE_ID"] == "" || $NS["MODULE_ID"] == "main") ) { $arLangDirs = Array(); $arFilter = Array("ACTIVE" => "Y"); if ($NS["SITE_ID"] != "") $arFilter["ID"] = $NS["SITE_ID"]; $r = CSite::GetList('', '', $arFilter); while ($arR = $r->Fetch()) { $path = rtrim($arR["DIR"], "/"); $arLangDirs[$arR["ABS_DOC_ROOT"]."/".$path."/"] = $arR; } //get rid of duplicates $dub = Array(); foreach ($arLangDirs as $path => $arR) { foreach ($arLangDirs as $path2 => $arR2) { if ($path == $path2) continue; if (mb_substr($path, 0, mb_strlen($path2)) == $path2) $dub[] = $path; } } foreach ($dub as $p) unset($arLangDirs[$p]); foreach ($arLangDirs as $arR) { $site = $arR["ID"]; $path = rtrim($arR["DIR"], "/"); $site_path = $site."|".$path."/"; if ( $max_execution_time > 0 && $NS["MODULE"] == "main" && mb_substr($NS["ID"]."/", 0, mb_strlen($site_path)) != $site_path ) continue; //for every folder CSearch::RecurseIndex(Array($site, $path), $max_execution_time, $NS); if ( $max_execution_time > 0 && $NS["MODULE"] <> '' ) { $DB->Commit(); return $NS; } } } $p1 = getmicrotime(); //for every who wants to reindex $oCallBack = new CSearchCallback; $oCallBack->max_execution_time = $max_execution_time; foreach (GetModuleEvents("search", "OnReindex", true) as $arEvent) { if ($NS["MODULE_ID"] != "" && $NS["MODULE_ID"] != $arEvent["TO_MODULE_ID"]) continue; if ($max_execution_time > 0 && $NS["MODULE"] <> '' && $NS["MODULE"] != "main" && $NS["MODULE"] != $arEvent["TO_MODULE_ID"]) continue; //here we get recordset $oCallBack->MODULE = $arEvent["TO_MODULE_ID"]; $oCallBack->CNT = &$NS["CNT"]; $oCallBack->SESS_ID = $NS["SESS_ID"]; $r = &$oCallBack; $arResult = ExecuteModuleEventEx($arEvent, array($NS, $r, "Index")); if (is_array($arResult)) //old way { foreach ($arResult as $arFields) { $ID = $arFields["ID"]; if ($ID <> '') { unset($arFields["ID"]); $NS["CNT"]++; CSearch::Index($arEvent["TO_MODULE_ID"], $ID, $arFields, false, $NS["SESS_ID"]); } } } else //new method { if ($max_execution_time > 0 && $arResult !== false && mb_strlen(".".$arResult) > 1) { $DB->Commit(); return Array( "MODULE" => $arEvent["TO_MODULE_ID"], "CNT" => $oCallBack->CNT, "ID" => $arResult, "CLEAR" => $NS["CLEAR"], "SESS_ID" => $NS["SESS_ID"], "SITE_ID" => $NS["SITE_ID"], "MODULE_ID" => $NS["MODULE_ID"], ); } } $NS["MODULE"] = ""; } if (!$bFull) { CSearch::DeleteOld($NS["SESS_ID"], $NS["MODULE_ID"], $NS["SITE_ID"]); } $DB->Commit(); return $NS["CNT"]; }