- Модуль: search
- Путь к файлу: ~/bitrix/modules/search/classes/mysql/search.php
- Класс: CSearch
- Вызов: CSearch::IndexTitle
static function IndexTitle($arLID, $ID, $sTitle)
{
$DB = CDatabase::GetModuleConnection('search');
static $CACHE_SITE_LANGS = array();
$ID = intval($ID);
$arLang = array();
if (!is_array($arLID))
$arLID = Array();
foreach ($arLID as $site => $url)
{
$sql_site = $DB->ForSql($site);
if (!array_key_exists($site, $CACHE_SITE_LANGS))
{
$db_site_tmp = CSite::GetByID($site);
if ($ar_site_tmp = $db_site_tmp->Fetch())
$CACHE_SITE_LANGS[$site] = array(
"LANGUAGE_ID" => $ar_site_tmp["LANGUAGE_ID"],
"CHARSET" => $ar_site_tmp["CHARSET"],
"SERVER_NAME" => $ar_site_tmp["SERVER_NAME"]
);
else
$CACHE_SITE_LANGS[$site] = false;
}
if (is_array($CACHE_SITE_LANGS[$site]))
{
$lang = $CACHE_SITE_LANGS[$site]["LANGUAGE_ID"];
$dbTitle = [];
$rs = $DB->Query("select WORD, POS from b_search_content_title where SEARCH_CONTENT_ID = ".$ID." and SITE_ID='".$sql_site."'");
while ($ar = $rs->Fetch())
{
$dbTitle[$ar["WORD"]] = intval($ar["POS"]);
}
$arTitle = stemming_split($sTitle, $lang);
if (!empty($arTitle))
{
$maxValuesLen = 2048;
$strSqlPrefix = "
insert ignore into b_search_content_title
(SEARCH_CONTENT_ID, SITE_ID, WORD, POS)
values
";
$strSqlValues = "";
$strSqlSuffix = "";
foreach ($arTitle as $word => $pos)
{
if (isset($dbTitle[$word]) && $dbTitle[$word] === $pos)
{
//Already in the db
unset($dbTitle[$word]);
}
else
{
//New value
$strSqlValues .= ",n(".$ID.", '".$sql_site."', '".$DB->ForSql($word)."', ".$pos.")";
if (mb_strlen($strSqlValues) > $maxValuesLen)
{
$DB->Query($strSqlPrefix.mb_substr($strSqlValues, 2), false, "File: ".__FILE__."
Line: ".__LINE__);
$strSqlValues = "";
}
}
}
if ($strSqlValues <> '')
{
$DB->Query($strSqlPrefix.mb_substr($strSqlValues, 2), false, "File: ".__FILE__."
Line: ".__LINE__);
$strSqlValues = "";
}
//Delete obsolete db values
foreach ($dbTitle as $word => $pos)
{
$DB->Query("
delete from b_search_content_title
where SEARCH_CONTENT_ID = ".$ID." and SITE_ID='".$sql_site."'
and WORD = '".$DB->ForSql($word)."' and POS = ".$pos."
");
}
}
}
}
}